diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-22 18:06:56 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-22 18:07:10 +0000 |
| commit | ed1c39334aaf4635119532e9ba6098a46843321a (patch) | |
| tree | 94096725c218edfeb87d10e71e4c9b241a7d0920 /src | |
| parent | 8430d69e1df2e9062c8fa25c5b0584966794855e (diff) | |
Serialize Patio types to flatbuffers
Diffstat (limited to 'src')
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 |
