From 2c0f29a89263b7a0404334ee6b5a93bf5995d808 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Jul 2026 11:25:22 +0100 Subject: Support Int64 in java-transient-0 --- .../java/org/zwobble/example/Transient0Tests.java | 15 +++++++ examples/10-transient-0/src/data.hob | 5 +++ .../javatransient0/JavaTransient0Generator.java | 52 +++++++++++++++------- 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 generateEncodeInt64(JavaExpression value) { + return generateEncodeInt(value, 64); + } + + private static Stream generateDecodeInt64( + JavaIdentifier target + ) { + return generateDecodeInt(target, 64, JavaTypeRef.INT); + } + private static Stream 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 generateDecodeInt( -- cgit v1.2.3