summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java52
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(