summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-05 11:25:22 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-05 11:25:22 +0100
commit2c0f29a89263b7a0404334ee6b5a93bf5995d808 (patch)
tree723d34b9ed499e008886114c6346df4047b12431
parent3dbb3be9811c9ad93fa1df400297ac935aad8250 (diff)
Support Int64 in java-transient-0
-rw-r--r--examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java15
-rw-r--r--examples/10-transient-0/src/data.hob5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java52
3 files changed, 57 insertions, 15 deletions
diff --git a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
index 232ecf1..09a23a3 100644
--- a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
@@ -7,6 +7,7 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.zwobble.example.types.data.HobgoblinTransient0Data;
import org.zwobble.example.types.data.StructWithInt32;
+import org.zwobble.example.types.data.StructWithInt64;
public class Transient0Tests {
@Test
@@ -22,4 +23,18 @@ public class Transient0Tests {
Assertions.assertEquals(value, decodedValue);
}
+
+ @Test
+ public void structWithInt64() throws IOException {
+ var value = new StructWithInt64(10, 25);
+
+ var outputStream = new ByteArrayOutputStream();
+ HobgoblinTransient0Data.encodeStructWithInt64(value, outputStream);
+ var bytes = outputStream.toByteArray();
+
+ var inputStream = new ByteArrayInputStream(bytes);
+ var decodedValue = HobgoblinTransient0Data.decodeStructWithInt64(inputStream);
+
+ Assertions.assertEquals(value, decodedValue);
+ }
}
diff --git a/examples/10-transient-0/src/data.hob b/examples/10-transient-0/src/data.hob
index 4cc43ad..e447f21 100644
--- a/examples/10-transient-0/src/data.hob
+++ b/examples/10-transient-0/src/data.hob
@@ -2,3 +2,8 @@ struct StructWithInt32 {
field a: Int32;
field b: Int32;
}
+
+struct StructWithInt64 {
+ field a: Int64;
+ field b: Int64;
+}
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 b18c30a..9d8a428 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
@@ -191,6 +191,8 @@ public class JavaTransient0Generator implements Generator {
case SimpleNativeType simpleNativeType -> {
if (simpleNativeType.equals(NativeTypes.INT_32)) {
yield generateEncodeInt32(value);
+ } else if (simpleNativeType.equals(NativeTypes.INT_64)) {
+ yield generateEncodeInt64(value);
} else {
throw new UnsupportedOperationException("TODO");
}
@@ -227,6 +229,8 @@ public class JavaTransient0Generator implements Generator {
case SimpleNativeType simpleNativeType -> {
if (simpleNativeType.equals(NativeTypes.INT_32)) {
yield generateDecodeInt32(target);
+ } else if (simpleNativeType.equals(NativeTypes.INT_64)) {
+ yield generateDecodeInt64(target);
} else {
throw new UnsupportedOperationException("TODO");
}
@@ -260,26 +264,44 @@ public class JavaTransient0Generator implements Generator {
return generateDecodeInt(target, 32, JavaTypeRef.INT);
}
+ private static Stream<JavaBlockStatement> generateEncodeInt64(JavaExpression value) {
+ return generateEncodeInt(value, 64);
+ }
+
+ private static Stream<JavaBlockStatement> generateDecodeInt64(
+ JavaIdentifier target
+ ) {
+ return generateDecodeInt(target, 64, JavaTypeRef.INT);
+ }
+
private static Stream<JavaBlockStatement> generateEncodeInt(
JavaExpression value,
int bits
) {
return byteIndicesInBits(bits)
- .mapToObj(shiftBy -> new JavaExpressionStatement(
- new JavaMethodCall(
- new JavaRef(OUTPUT_STREAM_NAME),
- JavaIdentifier.of("write"),
- List.of(new JavaBinaryOperation(
- JavaBinaryOperator.BITWISE_AND,
- new JavaBinaryOperation(
- JavaBinaryOperator.UNSIGNED_RIGHT_SHIFT,
- value,
- new JavaIntegerLiteral(shiftBy)
- ),
- new JavaIntegerLiteral(0xff)
- ))
- )
- ));
+ .mapToObj(shiftBy -> {
+ JavaExpression byteToWrite = new JavaBinaryOperation(
+ JavaBinaryOperator.BITWISE_AND,
+ new JavaBinaryOperation(
+ JavaBinaryOperator.UNSIGNED_RIGHT_SHIFT,
+ value,
+ new JavaIntegerLiteral(shiftBy)
+ ),
+ new JavaIntegerLiteral(0xff)
+ );
+
+ if (bits > 32) {
+ byteToWrite = new JavaCast(JavaTypeRef.INT, byteToWrite);
+ }
+
+ return new JavaExpressionStatement(
+ new JavaMethodCall(
+ new JavaRef(OUTPUT_STREAM_NAME),
+ JavaIdentifier.of("write"),
+ List.of(byteToWrite)
+ )
+ );
+ });
}
private static Stream<JavaBlockStatement> generateDecodeInt(