aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-22 18:06:56 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-22 18:07:10 +0000
commited1c39334aaf4635119532e9ba6098a46843321a (patch)
tree94096725c218edfeb87d10e71e4c9b241a7d0920 /src
parent8430d69e1df2e9062c8fa25c5b0584966794855e (diff)
Serialize Patio types to flatbuffers
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java79
-rw-r--r--src/main/java/org/shedlang/compiler/patio/types/PatioBoolType.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/types/PatioByteType.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/types/PatioInt32Type.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/types/PatioIntType.java2
-rw-r--r--src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java84
-rw-r--r--src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java16
-rw-r--r--src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java99
8 files changed, 199 insertions, 87 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
index aab63bad..6e5545a5 100644
--- a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
+++ b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
@@ -129,6 +129,85 @@ public class PatioToFlatbuffers {
};
}
+ // == Types ==
+
+ public static int serializeType(
+ FlatBufferBuilder builder,
+ PatioType type
+ ) {
+ return switch (type) {
+ case PatioBoolType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioBoolTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioByteType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioByteTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioDataPtrType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioDataPtrTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioFunctionPtrType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioFunctionPtrTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioIntType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioIntTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioInt32Type _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioInt32TypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+
+ case PatioVoidType _ -> {
+ PatioTypeFbs.startPatioTypeFbs(builder);
+ PatioTypeFbs.addValueType(builder, PatioTypeValueFbs.PatioVoidTypeFbs);
+ yield PatioTypeFbs.endPatioTypeFbs(builder);
+ }
+ };
+ }
+
+ public static PatioType deserializeType(PatioTypeFbs typeFbs) {
+ return switch (typeFbs.valueType()) {
+ case PatioTypeValueFbs.PatioBoolTypeFbs ->
+ PatioBoolType.INSTANCE;
+
+ case PatioTypeValueFbs.PatioByteTypeFbs ->
+ PatioByteType.INSTANCE;
+
+ case PatioTypeValueFbs.PatioDataPtrTypeFbs ->
+ PatioDataPtrType.INSTANCE;
+
+ case PatioTypeValueFbs.PatioFunctionPtrTypeFbs ->
+ PatioFunctionPtrType.INSTANCE;
+
+ case PatioTypeValueFbs.PatioIntTypeFbs ->
+ PatioIntType.INSTANCE;
+
+ case PatioTypeValueFbs.PatioInt32TypeFbs ->
+ PatioInt32Type.INSTANCE;
+
+ case PatioTypeValueFbs.PatioVoidTypeFbs ->
+ PatioVoidType.INSTANCE;
+
+ default ->
+ throw new UnsupportedOperationException("TODO");
+ };
+ }
+
// == Data layouts ==
public static int serializeDataLayout(
diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioBoolType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioBoolType.java
index 17bf8d7f..2d24775e 100644
--- a/src/main/java/org/shedlang/compiler/patio/types/PatioBoolType.java
+++ b/src/main/java/org/shedlang/compiler/patio/types/PatioBoolType.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.patio.types;
public record PatioBoolType() implements PatioType {
- static final PatioBoolType INSTANCE = new PatioBoolType();
+ public static final PatioBoolType INSTANCE = new PatioBoolType();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioByteType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioByteType.java
index a9cdd28a..bca56384 100644
--- a/src/main/java/org/shedlang/compiler/patio/types/PatioByteType.java
+++ b/src/main/java/org/shedlang/compiler/patio/types/PatioByteType.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.patio.types;
public record PatioByteType() implements PatioType {
- static final PatioByteType INSTANCE = new PatioByteType();
+ public static final PatioByteType INSTANCE = new PatioByteType();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioInt32Type.java b/src/main/java/org/shedlang/compiler/patio/types/PatioInt32Type.java
index f7a694f7..83b906a7 100644
--- a/src/main/java/org/shedlang/compiler/patio/types/PatioInt32Type.java
+++ b/src/main/java/org/shedlang/compiler/patio/types/PatioInt32Type.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.patio.types;
public record PatioInt32Type() implements PatioType {
- static final PatioInt32Type INSTANCE = new PatioInt32Type();
+ public static final PatioInt32Type INSTANCE = new PatioInt32Type();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioIntType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioIntType.java
index 7a7171ef..2ad622d2 100644
--- a/src/main/java/org/shedlang/compiler/patio/types/PatioIntType.java
+++ b/src/main/java/org/shedlang/compiler/patio/types/PatioIntType.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.patio.types;
public record PatioIntType() implements PatioType {
- static final PatioIntType INSTANCE = new PatioIntType();
+ public static final PatioIntType INSTANCE = new PatioIntType();
}
diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java
index b68d89b7..791743c0 100644
--- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioSerializationTests.java
@@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test;
import org.shedlang.compiler.patio.instructions.Patio;
import org.shedlang.compiler.patio.types.PatioDataLayout;
import org.shedlang.compiler.patio.types.PatioDataLayouts;
+import org.shedlang.compiler.patio.types.PatioType;
+import org.shedlang.compiler.patio.types.PatioTypes;
import org.shedlang.compiler.patio.values.PatioDataPtrValue;
import org.shedlang.compiler.patio.values.PatioIntValue;
@@ -89,6 +91,88 @@ public abstract class PatioSerializationTests {
assertThat(deserializedIntValue, equalTo(intValue));
}
+ // == Types ==
+
+ protected abstract PatioType deserializeType(byte[] buffer);
+ protected abstract byte[] serializeType(PatioType value);
+
+ @Test
+ public void canSerializeBoolType() {
+ var type = PatioTypes.BOOL;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeByteType() {
+ var type = PatioTypes.BYTE;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeDataPtrType() {
+ var type = PatioTypes.DATA_PTR;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeFunctionPtrType() {
+ var type = PatioTypes.FUNCTION_PTR;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeIntType() {
+ var type = PatioTypes.INT;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeInt32Type() {
+ var type = PatioTypes.INT32;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
+ @Test
+ public void canSerializeVoidType() {
+ var type = PatioTypes.VOID;
+
+ var deserializedType = deserializeType(
+ serializeType(type)
+ );
+
+ assertThat(deserializedType, equalTo(type));
+ }
+
// == Data layouts ==
protected abstract PatioDataLayout deserializeDataLayout(byte[] buffer);
diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java
index 3c787404..2f6fdede 100644
--- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffersTests.java
@@ -4,7 +4,9 @@ import com.google.flatbuffers.FlatBufferBuilder;
import org.shedlang.compiler.patio.flatbuffers.PatioDataLayoutFbs;
import org.shedlang.compiler.patio.flatbuffers.PatioDataPtrValueFbs;
import org.shedlang.compiler.patio.flatbuffers.PatioIntValueFbs;
+import org.shedlang.compiler.patio.flatbuffers.PatioTypeFbs;
import org.shedlang.compiler.patio.types.PatioDataLayout;
+import org.shedlang.compiler.patio.types.PatioType;
import org.shedlang.compiler.patio.values.PatioDataPtrValue;
import org.shedlang.compiler.patio.values.PatioIntValue;
@@ -40,6 +42,20 @@ public class PatioToFlatbuffersTests extends PatioSerializationTests {
}
@Override
+ protected byte[] serializeType(PatioType value) {
+ var builder = new FlatBufferBuilder();
+ var valueFbs = PatioToFlatbuffers.serializeType(builder, value);
+ builder.finish(valueFbs);
+ return builder.sizedByteArray();
+ }
+
+ @Override
+ protected PatioType deserializeType(byte[] buffer) {
+ var valueFbs = PatioTypeFbs.getRootAsPatioTypeFbs(ByteBuffer.wrap(buffer));
+ return PatioToFlatbuffers.deserializeType(valueFbs);
+ }
+
+ @Override
protected byte[] serializeDataLayout(PatioDataLayout value) {
var builder = new FlatBufferBuilder();
var valueFbs = PatioToFlatbuffers.serializeDataLayout(builder, value);
diff --git a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java
index 18a92f59..44334435 100644
--- a/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/serialization/PatioToProtobufTests.java
@@ -7,10 +7,7 @@ import org.shedlang.compiler.patio.PatioFunctionDefinition;
import org.shedlang.compiler.patio.PatioVisibility;
import org.shedlang.compiler.patio.instructions.Patio;
import org.shedlang.compiler.patio.protobuf.PatioProtobuf;
-import org.shedlang.compiler.patio.types.PatioDataLayout;
-import org.shedlang.compiler.patio.types.PatioDataLayouts;
-import org.shedlang.compiler.patio.types.PatioDataValues;
-import org.shedlang.compiler.patio.types.PatioTypes;
+import org.shedlang.compiler.patio.types.*;
import org.shedlang.compiler.patio.values.PatioDataPtrValue;
import org.shedlang.compiler.patio.values.PatioIntValue;
import org.shedlang.compiler.sources.Sources;
@@ -53,6 +50,21 @@ public class PatioToProtobufTests extends PatioSerializationTests {
}
@Override
+ protected byte[] serializeType(PatioType value) {
+ return PatioToProtobuf.serializeType(value).toByteArray();
+ }
+
+ @Override
+ protected PatioType deserializeType(byte[] buffer) {
+ try {
+ var valueProtobuf = PatioProtobuf.PatioType.parseFrom(buffer);
+ return PatioToProtobuf.deserializeType(valueProtobuf);
+ } catch (InvalidProtocolBufferException exception) {
+ throw new RuntimeException(exception);
+ }
+ }
+
+ @Override
protected byte[] serializeDataLayout(PatioDataLayout value) {
return PatioToProtobuf.serializeDataLayout(value).toByteArray();
}
@@ -769,85 +781,6 @@ public class PatioToProtobufTests extends PatioSerializationTests {
assertThat(deserializedOperand, equalTo(operand));
}
- // == Types ==
-
- @Test
- public void canSerializeBoolType() {
- var type = PatioTypes.BOOL;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeByteType() {
- var type = PatioTypes.BYTE;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeDataPtrType() {
- var type = PatioTypes.DATA_PTR;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeFunctionPtrType() {
- var type = PatioTypes.FUNCTION_PTR;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeIntType() {
- var type = PatioTypes.INT;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeInt32Type() {
- var type = PatioTypes.INT32;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
- @Test
- public void canSerializeVoidType() {
- var type = PatioTypes.VOID;
-
- var deserializedType = PatioToProtobuf.deserializeType(
- PatioToProtobuf.serializeType(type)
- );
-
- assertThat(deserializedType, equalTo(type));
- }
-
// == Data values ==
@Test