diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java | 52 |
1 files changed, 37 insertions, 15 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 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( |
