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 --- .../javatransient0/JavaTransient0Generator.java | 52 +++++++++++++++------- 1 file changed, 37 insertions(+), 15 deletions(-) (limited to 'src') 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