summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
index 1999cc8..6bbd93b 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
@@ -916,11 +916,30 @@ public class JavaTransient0Generator implements Generator {
statements.addAll(generateDecode(size, NativeTypes.INT_64));
+ statements.add(new JavaIfStatement(
+ new JavaBinaryOperation(
+ JavaBinaryOperator.GREATER_THAN,
+ new JavaRef(size),
+ new JavaStaticFieldAccess(JavaTypeRef.INT_BOXED, JavaIdentifier.of("MAX_VALUE"))
+ ),
+ new JavaBlock(List.of(
+ new JavaThrowStatement(new JavaNewExpression(
+ JavaTypeRef.IO_EXCEPTION,
+ List.of(new JavaStringLiteral("Lists longer than Integer.MAX_VALUE are not supported"))
+ ))
+ )),
+ new JavaBlock(List.of())
+ ));
+
statements.add(new JavaLocalVariableDeclaration(
Optional.empty(),
target,
Optional.of(new JavaNewExpression(
JavaTypeRef.arrayList(this.javaGenerator.generateReferenceTypeRef(elementType)),
+ // We've checked above that the size is less than
+ // Integer.MAX_VALUE, so casting to an int is safe.
+ // (This doesn't check for negatives, but ArrayList::new() fails
+ // for negative values anyway.)
List.of(new JavaCast(JavaTypeRef.INT, new JavaRef(size)))
))
));