summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-08-01 11:52:27 +0100
committerMichael Williamson <mike@zwobble.org>2026-08-01 11:52:27 +0100
commit113f53a4268d05618f91eda2fc6c379bb7c23383 (patch)
treea07e8bff6955c86807a87cacd1b963ddc4942f45
parent6f5f31a4024eaf56454e4cb81c56e3c20f25dd60 (diff)
Explicitly check type of shared value
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java32
1 files changed, 26 insertions, 6 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 92d36e3..9bb72a3 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
@@ -1128,8 +1128,7 @@ public class JavaTransient0Generator implements Generator {
new JavaExpressionStatement(new JavaBinaryOperation(
JavaBinaryOperator.ASSIGN,
new JavaRef(target),
- new JavaCast(
- this.javaGenerator.generateTypeRef(type),
+ new JavaSwitchExpression(
new JavaMethodCall(
new JavaRef(SHARED_VALUES_NAME),
JavaIdentifier.of("get"),
@@ -1138,6 +1137,23 @@ public class JavaTransient0Generator implements Generator {
// (This doesn't check for negatives, but get() fails for
// negative values anyway.)
List.of(new JavaCast(JavaTypeRef.INT, new JavaRef(id)))
+ ),
+ List.of(
+ new JavaSwitchRule(
+ new JavaCasePattern(new JavaPattern(
+ this.javaGenerator.generateTypeRef(type),
+ decodedValue
+ )),
+ new JavaBlock(List.of(
+ new JavaYieldStatement(new JavaRef(decodedValue))
+ ))
+ ),
+ new JavaSwitchRule(
+ new JavaCaseDefault(),
+ new JavaBlock(List.of(
+ throwIoException("Shared value was of the wrong type")
+ ))
+ )
)
)
))
@@ -1232,15 +1248,19 @@ public class JavaTransient0Generator implements Generator {
new JavaStaticFieldAccess(JavaTypeRef.INT_BOXED, JavaIdentifier.of("MAX_VALUE"))
),
new JavaBlock(List.of(
- new JavaThrowStatement(new JavaNewExpression(
- JavaTypeRef.IO_EXCEPTION,
- List.of(new JavaStringLiteral(errorMessage))
- ))
+ throwIoException(errorMessage)
)),
new JavaBlock(List.of())
);
}
+ private static JavaThrowStatement throwIoException(String errorMessage) {
+ return new JavaThrowStatement(new JavaNewExpression(
+ JavaTypeRef.IO_EXCEPTION,
+ List.of(new JavaStringLiteral(errorMessage))
+ ));
+ }
+
private JavaPackageName namespaceToJavaTransient0PackageName(NamespaceName namespaceName) {
return this.javaGenerator.namespaceToJavaPackageName(namespaceName).add(JavaIdentifier.of("transient0"));
}