aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 16:21:30 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 17:29:40 +0000
commitbedd122699360efcaf07310e713e0eec1e7457ec (patch)
tree379f8782b33b0659ee68490e9e8029f9dcf21a9f /src
parent7785c220bcef000aedfbe2b9c95a32272786f370 (diff)
Serialize Patio instructions to Protobuf
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java978
-rw-r--r--src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java506
2 files changed, 1480 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java
index f3142428..56cbc260 100644
--- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java
+++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.patio.protobuf;
import org.shedlang.compiler.patio.*;
+import org.shedlang.compiler.patio.instructions.*;
import org.shedlang.compiler.patio.operands.*;
import org.shedlang.compiler.patio.types.*;
import org.shedlang.compiler.patio.values.*;
@@ -301,6 +302,968 @@ public class PatioToProtobuf {
};
}
+ // == Instructions ==
+
+ public static PatioProtobuf.PatioInstruction serializeInstruction(
+ PatioInstruction instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioInstruction.newBuilder();
+
+ switch (instruction) {
+ case PatioBlock block -> {
+ builder.setBlock(serializeBlock(block, parentSource));
+ }
+
+ case PatioBoolToInt boolToInt -> {
+ builder.setBoolToInt(serializeBoolToInt(boolToInt, parentSource));
+ }
+
+ case PatioCall call -> {
+ builder.setCall(serializeCall(call, parentSource));
+ }
+
+ case PatioCallPointer callPointer -> {
+ builder.setCallPointer(serializeCallPointer(callPointer, parentSource));
+ }
+
+ case PatioDataPtrToInt dataPtrToInt -> {
+ builder.setDataPtrToInt(serializeDataPtrToInt(dataPtrToInt, parentSource));
+ }
+
+ case PatioIf if_ -> {
+ builder.setIf(serializeIf(if_, parentSource));
+ }
+
+ case PatioIntAdd intAdd -> {
+ builder.setIntAdd(serializeIntAdd(intAdd, parentSource));
+ }
+
+ case PatioIntEquals intEquals -> {
+ builder.setIntEquals(serializeIntEquals(intEquals, parentSource));
+ }
+
+ case PatioIntNotEqual intNotEqual -> {
+ builder.setIntNotEqual(serializeIntNotEqual(intNotEqual, parentSource));
+ }
+
+ case PatioIntSub intSub -> {
+ builder.setIntSub(serializeIntSub(intSub, parentSource));
+ }
+
+ case PatioIntToBool intToBool -> {
+ builder.setIntToBool(serializeIntToBool(intToBool, parentSource));
+ }
+
+ case PatioIntToDataPtr intToDataPtr -> {
+ builder.setIntToDataPtr(serializeIntToDataPtr(intToDataPtr, parentSource));
+ }
+
+ case PatioLocalStore localStore -> {
+ builder.setLocalStore(serializeLocalStore(localStore, parentSource));
+ }
+
+ case PatioLoop loop -> {
+ builder.setLoop(serializeLoop(loop, parentSource));
+ }
+
+ case PatioLoopBreak loopBreak -> {
+ builder.setLoopBreak(serializeLoopBreak(loopBreak, parentSource));
+ }
+
+ case PatioLoopContinue loopContinue -> {
+ builder.setLoopContinue(serializeLoopContinue(loopContinue, parentSource));
+ }
+
+ case PatioMemoryLoad memoryLoad -> {
+ builder.setMemoryLoad(serializeMemoryLoad(memoryLoad, parentSource));
+ }
+
+ case PatioMemoryStore memoryStore -> {
+ builder.setMemoryStore(serializeMemoryStore(memoryStore, parentSource));
+ }
+
+ case PatioResume resume -> {
+ builder.setResume(serializeResume(resume, parentSource));
+ }
+
+ case PatioReturn return_ -> {
+ builder.setReturn(serializeReturn(return_, parentSource));
+ }
+
+ case PatioReturnVoid returnVoid -> {
+ builder.setReturnVoid(serializeReturnVoid(returnVoid, parentSource));
+ }
+
+ case PatioSwitch switch_ -> {
+ builder.setSwitch(serializeSwitch(switch_, parentSource));
+ }
+
+ case PatioThrow throw_ -> {
+ builder.setThrow(serializeThrow(throw_, parentSource));
+ }
+
+ case PatioTry try_ -> {
+ builder.setTry(serializeTry(try_, parentSource));
+ }
+
+ case PatioUnreachable unreachable -> {
+ builder.setUnreachable(serializeUnreachable(unreachable, parentSource));
+ }
+
+ case PatioVarLoad varLoad -> {
+ builder.setVarLoad(serializeVarLoad(varLoad, parentSource));
+ }
+
+ case PatioVarStore varStore -> {
+ builder.setVarStore(serializeVarStore(varStore, parentSource));
+ }
+ }
+
+ return builder.build();
+ }
+
+ public static PatioInstruction deserializeInstruction(
+ PatioProtobuf.PatioInstruction instructionProtobuf,
+ Source parentSource
+ ) {
+ return switch (instructionProtobuf.getValueCase()) {
+ case BLOCK ->
+ deserializeBlock(instructionProtobuf.getBlock(), parentSource);
+
+ case BOOL_TO_INT ->
+ deserializeBoolToInt(instructionProtobuf.getBoolToInt(), parentSource);
+
+ case CALL ->
+ deserializeCall(instructionProtobuf.getCall(), parentSource);
+
+ case CALL_POINTER ->
+ deserializeCallPointer(instructionProtobuf.getCallPointer(), parentSource);
+
+ case DATA_PTR_TO_INT ->
+ deserializeDataPtrToInt(instructionProtobuf.getDataPtrToInt(), parentSource);
+
+ case IF ->
+ deserializeIf(instructionProtobuf.getIf(), parentSource);
+
+ case INT_ADD ->
+ deserializeIntAdd(instructionProtobuf.getIntAdd(), parentSource);
+
+ case INT_EQUALS ->
+ deserializeIntEquals(instructionProtobuf.getIntEquals(), parentSource);
+
+ case INT_NOT_EQUAL ->
+ deserializeIntNotEqual(instructionProtobuf.getIntNotEqual(), parentSource);
+
+ case INT_SUB ->
+ deserializeIntSub(instructionProtobuf.getIntSub(), parentSource);
+
+ case INT_TO_BOOL ->
+ deserializeIntToBool(instructionProtobuf.getIntToBool(), parentSource);
+
+ case INT_TO_DATA_PTR ->
+ deserializeIntToDataPtr(instructionProtobuf.getIntToDataPtr(), parentSource);
+
+ case LOCAL_STORE ->
+ deserializeLocalStore(instructionProtobuf.getLocalStore(), parentSource);
+
+ case LOOP ->
+ deserializeLoop(instructionProtobuf.getLoop(), parentSource);
+
+ case LOOP_BREAK ->
+ deserializeLoopBreak(instructionProtobuf.getLoopBreak(), parentSource);
+
+ case LOOP_CONTINUE ->
+ deserializeLoopContinue(instructionProtobuf.getLoopContinue(), parentSource);
+
+ case MEMORY_LOAD ->
+ deserializeMemoryLoad(instructionProtobuf.getMemoryLoad(), parentSource);
+
+ case MEMORY_STORE ->
+ deserializeMemoryStore(instructionProtobuf.getMemoryStore(), parentSource);
+
+ case RESUME ->
+ deserializeResume(instructionProtobuf.getResume(), parentSource);
+
+ case RETURN ->
+ deserializeReturn(instructionProtobuf.getReturn(), parentSource);
+
+ case RETURN_VOID ->
+ deserializeReturnVoid(instructionProtobuf.getReturnVoid(), parentSource);
+
+ case SWITCH ->
+ deserializeSwitch(instructionProtobuf.getSwitch(), parentSource);
+
+ case THROW ->
+ deserializeThrow(instructionProtobuf.getThrow(), parentSource);
+
+ case TRY ->
+ deserializeTry(instructionProtobuf.getTry(), parentSource);
+
+ case UNREACHABLE ->
+ deserializeUnreachable(instructionProtobuf.getUnreachable(), parentSource);
+
+ case VAR_LOAD ->
+ deserializeVarLoad(instructionProtobuf.getVarLoad(), parentSource);
+
+ case VAR_STORE ->
+ deserializeVarStore(instructionProtobuf.getVarStore(), parentSource);
+
+ case VALUE_NOT_SET ->
+ throw new UnsupportedOperationException("TODO");
+ };
+ }
+
+ private static PatioProtobuf.PatioBlock serializeBlock(
+ PatioBlock instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioBlock.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ for (var bodyInstruction : instruction.body()) {
+ builder.addBody(serializeInstruction(bodyInstruction, instruction.source()));
+ }
+ for (var result : instruction.results()) {
+ builder.addResults(serializeOperand(result));
+ }
+ return builder.build();
+ }
+
+ private static PatioBlock deserializeBlock(
+ PatioProtobuf.PatioBlock instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioBlock(
+ instructionProtobuf.getBodyList().stream()
+ .map(bodyInstructionProtobuf -> deserializeInstruction(bodyInstructionProtobuf, source))
+ .collect(Collectors.toList()),
+ instructionProtobuf.getResultsList().stream()
+ .map(PatioToProtobuf::deserializeOperand)
+ .collect(Collectors.toList()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioBoolToInt serializeBoolToInt(
+ PatioBoolToInt instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioBoolToInt.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioBoolToInt deserializeBoolToInt(
+ PatioProtobuf.PatioBoolToInt instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioBoolToInt(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioCall serializeCall(
+ PatioCall instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioCall.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ if (instruction.destination().isPresent()) {
+ builder.setDestination(serializeLocalRef(instruction.destination().get()));
+ }
+ builder.setFunctionName(instruction.functionName());
+ for (var arg : instruction.args()) {
+ builder.addArgs(serializeOperand(arg));
+ }
+ return builder.build();
+ }
+
+ private static PatioCall deserializeCall(
+ PatioProtobuf.PatioCall instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioCall(
+ instructionProtobuf.hasDestination()
+ ? Optional.of(deserializeLocalRef(instructionProtobuf.getDestination()))
+ : Optional.<PatioLocalRef>empty(),
+ instructionProtobuf.getFunctionName(),
+ instructionProtobuf.getArgsList().stream()
+ .map(PatioToProtobuf::deserializeOperand)
+ .collect(Collectors.toList()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioCallPointer serializeCallPointer(
+ PatioCallPointer instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioCallPointer.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setFunctionPointer(serializeOperand(instruction.functionPointer()));
+ for (var arg : instruction.args()) {
+ builder.addArgs(serializeOperand(arg));
+ }
+ return builder.build();
+ }
+
+ private static PatioCallPointer deserializeCallPointer(
+ PatioProtobuf.PatioCallPointer instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioCallPointer(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getFunctionPointer()),
+ instructionProtobuf.getArgsList().stream()
+ .map(PatioToProtobuf::deserializeOperand)
+ .collect(Collectors.toList()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioDataPtrToInt serializeDataPtrToInt(
+ PatioDataPtrToInt instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioDataPtrToInt.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioDataPtrToInt deserializeDataPtrToInt(
+ PatioProtobuf.PatioDataPtrToInt instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioDataPtrToInt(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIf serializeIf(
+ PatioIf instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIf.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ for (var destination : instruction.destinations()) {
+ builder.addDestinations(serializeLocalRef(destination));
+ }
+ builder.setCondition(serializeOperand(instruction.condition()));
+ builder.setTrueBody(serializeBlock(instruction.trueBody(), instruction.source()));
+ builder.setFalseBody(serializeBlock(instruction.falseBody(), instruction.source()));
+ return builder.build();
+ }
+
+ private static PatioIf deserializeIf(
+ PatioProtobuf.PatioIf instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIf(
+ instructionProtobuf.getDestinationsList().stream()
+ .map(PatioToProtobuf::deserializeLocalRef)
+ .collect(Collectors.toList()),
+ deserializeOperand(instructionProtobuf.getCondition()),
+ deserializeBlock(instructionProtobuf.getTrueBody(), source),
+ deserializeBlock(instructionProtobuf.getFalseBody(), source),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntAdd serializeIntAdd(
+ PatioIntAdd instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntAdd.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setLeft(serializeOperand(instruction.left()));
+ builder.setRight(serializeOperand(instruction.right()));
+ return builder.build();
+ }
+
+ private static PatioIntAdd deserializeIntAdd(
+ PatioProtobuf.PatioIntAdd instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntAdd(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getLeft()),
+ deserializeOperand(instructionProtobuf.getRight()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntEquals serializeIntEquals(
+ PatioIntEquals instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntEquals.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setLeft(serializeOperand(instruction.left()));
+ builder.setRight(serializeOperand(instruction.right()));
+ return builder.build();
+ }
+
+ private static PatioIntEquals deserializeIntEquals(
+ PatioProtobuf.PatioIntEquals instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntEquals(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getLeft()),
+ deserializeOperand(instructionProtobuf.getRight()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntNotEqual serializeIntNotEqual(
+ PatioIntNotEqual instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntNotEqual.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setLeft(serializeOperand(instruction.left()));
+ builder.setRight(serializeOperand(instruction.right()));
+ return builder.build();
+ }
+
+ private static PatioIntNotEqual deserializeIntNotEqual(
+ PatioProtobuf.PatioIntNotEqual instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntNotEqual(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getLeft()),
+ deserializeOperand(instructionProtobuf.getRight()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntSub serializeIntSub(
+ PatioIntSub instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntSub.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setLeft(serializeOperand(instruction.left()));
+ builder.setRight(serializeOperand(instruction.right()));
+ return builder.build();
+ }
+
+ private static PatioIntSub deserializeIntSub(
+ PatioProtobuf.PatioIntSub instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntSub(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getLeft()),
+ deserializeOperand(instructionProtobuf.getRight()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntToBool serializeIntToBool(
+ PatioIntToBool instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntToBool.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioIntToBool deserializeIntToBool(
+ PatioProtobuf.PatioIntToBool instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntToBool(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioIntToDataPtr serializeIntToDataPtr(
+ PatioIntToDataPtr instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioIntToDataPtr.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioIntToDataPtr deserializeIntToDataPtr(
+ PatioProtobuf.PatioIntToDataPtr instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioIntToDataPtr(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioLocalStore serializeLocalStore(
+ PatioLocalStore instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioLocalStore.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioLocalStore deserializeLocalStore(
+ PatioProtobuf.PatioLocalStore instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioLocalStore(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioLoop serializeLoop(
+ PatioLoop instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioLoop.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ for (var bodyInstruction : instruction.body()) {
+ builder.addBody(serializeInstruction(bodyInstruction, instruction.source()));
+ }
+ return builder.build();
+ }
+
+ private static PatioLoop deserializeLoop(
+ PatioProtobuf.PatioLoop instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioLoop(
+ instructionProtobuf.getBodyList().stream()
+ .map(bodyInstructionProtobuf -> deserializeInstruction(bodyInstructionProtobuf, source))
+ .collect(Collectors.toList()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioLoopBreak serializeLoopBreak(
+ PatioLoopBreak instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioLoopBreak.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ return builder.build();
+ }
+
+ private static PatioLoopBreak deserializeLoopBreak(
+ PatioProtobuf.PatioLoopBreak instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioLoopBreak(
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioLoopContinue serializeLoopContinue(
+ PatioLoopContinue instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioLoopContinue.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ return builder.build();
+ }
+
+ private static PatioLoopContinue deserializeLoopContinue(
+ PatioProtobuf.PatioLoopContinue instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioLoopContinue(
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioMemoryLoad serializeMemoryLoad(
+ PatioMemoryLoad instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioMemoryLoad.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setPointer(serializeOperand(instruction.pointer()));
+ builder.setLayout(serializeDataLayout(instruction.layout()));
+ builder.addAllOffset(instruction.offset());
+ return builder.build();
+ }
+
+ private static PatioMemoryLoad deserializeMemoryLoad(
+ PatioProtobuf.PatioMemoryLoad instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioMemoryLoad(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeOperand(instructionProtobuf.getPointer()),
+ deserializeDataLayout(instructionProtobuf.getLayout()),
+ instructionProtobuf.getOffsetList(),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioMemoryStore serializeMemoryStore(
+ PatioMemoryStore instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioMemoryStore.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setPointer(serializeOperand(instruction.pointer()));
+ builder.setLayout(serializeDataLayout(instruction.layout()));
+ builder.addAllOffset(instruction.offset());
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioMemoryStore deserializeMemoryStore(
+ PatioProtobuf.PatioMemoryStore instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioMemoryStore(
+ deserializeOperand(instructionProtobuf.getPointer()),
+ deserializeDataLayout(instructionProtobuf.getLayout()),
+ instructionProtobuf.getOffsetList(),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioResume serializeResume(
+ PatioResume instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioResume.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioResume deserializeResume(
+ PatioProtobuf.PatioResume instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioResume(
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioReturn serializeReturn(
+ PatioReturn instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioReturn.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioReturn deserializeReturn(
+ PatioProtobuf.PatioReturn instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioReturn(
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioReturnVoid serializeReturnVoid(
+ PatioReturnVoid instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioReturnVoid.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ return builder.build();
+ }
+
+ private static PatioReturnVoid deserializeReturnVoid(
+ PatioProtobuf.PatioReturnVoid instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioReturnVoid(
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioSwitch serializeSwitch(
+ PatioSwitch instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioSwitch.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ for (var destination : instruction.destinations()) {
+ builder.addDestinations(serializeLocalRef(destination));
+ }
+ builder.setValue(serializeOperand(instruction.value()));
+ for (var case_ : instruction.cases()) {
+ builder.addCases(serializeSwitchCase(case_, instruction.source()));
+ }
+ builder.setDefaultBody(serializeBlock(instruction.defaultBody(), instruction.source()));
+ return builder.build();
+ }
+
+ private static PatioSwitch deserializeSwitch(
+ PatioProtobuf.PatioSwitch instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioSwitch(
+ instructionProtobuf.getDestinationsList().stream()
+ .map(PatioToProtobuf::deserializeLocalRef)
+ .collect(Collectors.toList()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ instructionProtobuf.getCasesList().stream()
+ .map(caseProtobuf -> deserializeSwitchCase(caseProtobuf, source))
+ .collect(Collectors.toList()),
+ deserializeBlock(instructionProtobuf.getDefaultBody(), source),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioSwitchCase serializeSwitchCase(
+ PatioSwitch.Case case_,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioSwitchCase.newBuilder();
+ builder.setSource(serializeSource(case_.source(), parentSource));
+ builder.setValue(case_.value());
+ builder.setBody(serializeBlock(case_.body(), case_.source()));
+ return builder.build();
+ }
+
+ private static PatioSwitch.Case deserializeSwitchCase(
+ PatioProtobuf.PatioSwitchCase caseProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(caseProtobuf.getSource(), parentSource);
+
+ return new PatioSwitch.Case(
+ caseProtobuf.getValue(),
+ deserializeBlock(caseProtobuf.getBody(), source),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioThrow serializeThrow(
+ PatioThrow instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioThrow.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setExceptionTypeName(instruction.exceptionTypeName());
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioThrow deserializeThrow(
+ PatioProtobuf.PatioThrow instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioThrow(
+ instructionProtobuf.getExceptionTypeName(),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioTry serializeTry(
+ PatioTry instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioTry.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ for (var destination : instruction.destinations()) {
+ builder.addDestinations(serializeLocalRef(destination));
+ }
+ for (var catchClause : instruction.catchClauses()) {
+ builder.addCatchClauses(serializeCatchClause(catchClause, instruction.source()));
+ }
+ builder.setBody(serializeBlock(instruction.body(), instruction.source()));
+ return builder.build();
+ }
+
+ private static PatioTry deserializeTry(
+ PatioProtobuf.PatioTry instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioTry(
+ instructionProtobuf.getDestinationsList().stream()
+ .map(PatioToProtobuf::deserializeLocalRef)
+ .collect(Collectors.toList()),
+ instructionProtobuf.getCatchClausesList().stream()
+ .map(catchClauseProtobuf -> deserializeCatchClause(catchClauseProtobuf, source))
+ .collect(Collectors.toList()),
+ deserializeBlock(instructionProtobuf.getBody(), source),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioCatchClause serializeCatchClause(
+ PatioCatchClause catchClause,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioCatchClause.newBuilder();
+ builder.setSource(serializeSource(catchClause.source(), parentSource));
+ builder.setExceptionTypeName(catchClause.exceptionTypeName());
+ builder.setDestination(serializeLocalRef(catchClause.destination()));
+ builder.setBody(serializeBlock(catchClause.body(), catchClause.source()));
+ return builder.build();
+ }
+
+ private static PatioCatchClause deserializeCatchClause(
+ PatioProtobuf.PatioCatchClause catchClauseProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(catchClauseProtobuf.getSource(), parentSource);
+
+ return new PatioCatchClause(
+ catchClauseProtobuf.getExceptionTypeName(),
+ deserializeLocalRef(catchClauseProtobuf.getDestination()),
+ deserializeBlock(catchClauseProtobuf.getBody(), source),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioUnreachable serializeUnreachable(
+ PatioUnreachable instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioUnreachable.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ return builder.build();
+ }
+
+ private static PatioUnreachable deserializeUnreachable(
+ PatioProtobuf.PatioUnreachable instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioUnreachable(
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioVarLoad serializeVarLoad(
+ PatioVarLoad instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioVarLoad.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setDestination(serializeLocalRef(instruction.destination()));
+ builder.setVar(serializeLocalRef(instruction.var()));
+ return builder.build();
+ }
+
+ private static PatioVarLoad deserializeVarLoad(
+ PatioProtobuf.PatioVarLoad instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioVarLoad(
+ deserializeLocalRef(instructionProtobuf.getDestination()),
+ deserializeLocalRef(instructionProtobuf.getVar()),
+ source
+ );
+ }
+
+ private static PatioProtobuf.PatioVarStore serializeVarStore(
+ PatioVarStore instruction,
+ Source parentSource
+ ) {
+ var builder = PatioProtobuf.PatioVarStore.newBuilder();
+ builder.setSource(serializeSource(instruction.source(), parentSource));
+ builder.setVar(serializeLocalRef(instruction.var()));
+ builder.setValue(serializeOperand(instruction.value()));
+ return builder.build();
+ }
+
+ private static PatioVarStore deserializeVarStore(
+ PatioProtobuf.PatioVarStore instructionProtobuf,
+ Source parentSource
+ ) {
+ var source = deserializeSource(instructionProtobuf.getSource(), parentSource);
+
+ return new PatioVarStore(
+ deserializeLocalRef(instructionProtobuf.getVar()),
+ deserializeOperand(instructionProtobuf.getValue()),
+ source
+ );
+ }
+
// == Operands ==
public static PatioProtobuf.PatioOperand serializeOperand(PatioOperand operand) {
@@ -338,8 +1301,7 @@ public class PatioToProtobuf {
}
case PatioLocalRef localRef -> {
- var localRefBuilder = builder.getLocalRefBuilder();
- localRefBuilder.setName(localRef.name());
+ builder.setLocalRef(serializeLocalRef(localRef));
}
}
@@ -373,13 +1335,23 @@ public class PatioToProtobuf {
);
case LOCAL_REF ->
- new PatioLocalRef(operandProtobuf.getLocalRef().getName());
+ deserializeLocalRef(operandProtobuf.getLocalRef());
case VALUE_NOT_SET ->
throw new UnsupportedOperationException("TODO");
};
}
+ private static PatioProtobuf.PatioLocalRef serializeLocalRef(PatioLocalRef localRef) {
+ var builder = PatioProtobuf.PatioLocalRef.newBuilder();
+ builder.setName(localRef.name());
+ return builder.build();
+ }
+
+ private static PatioLocalRef deserializeLocalRef(PatioProtobuf.PatioLocalRef localRefProtobuf) {
+ return new PatioLocalRef(localRefProtobuf.getName());
+ }
+
// == Data ptr values ==
public static PatioProtobuf.PatioDataPtrValue serializeDataPtrValue(PatioDataPtrValue value) {
diff --git a/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java b/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
index 03ded426..6e889390 100644
--- a/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/protobuf/PatioToProtobufTests.java
@@ -2,7 +2,6 @@ package org.shedlang.compiler.patio.protobuf;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.patio.PatioFunctionDeclaration;
-import org.shedlang.compiler.patio.PatioTesting;
import org.shedlang.compiler.patio.PatioVisibility;
import org.shedlang.compiler.patio.instructions.Patio;
import org.shedlang.compiler.patio.types.PatioDataLayouts;
@@ -11,6 +10,7 @@ import org.shedlang.compiler.patio.types.PatioTypes;
import org.shedlang.compiler.sources.Sources;
import java.util.List;
+import java.util.Optional;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.equalTo;
@@ -97,6 +97,510 @@ public class PatioToProtobufTests {
assertThat(deserializedElement, equalTo(element));
}
+ // == Instructions ==
+
+ @Test
+ public void canSerializeBlock() {
+ var instruction = Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(1)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(2))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeBoolToInt() {
+ var instruction = Patio.boolToInt(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallWithoutDestination() {
+ var instruction = Patio.call(
+ Optional.empty(),
+ "f",
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallWithDestination() {
+ var instruction = Patio.call(
+ Optional.of(Patio.localRef("destination")),
+ "f",
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeCallPointer() {
+ var instruction = Patio.callPointer(
+ Patio.localRef("destination"),
+ Patio.localRef("f"),
+ List.of(Patio.localRef("a"), Patio.localRef("b"), Patio.localRef("c"))
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeDataPtrToInt() {
+ var instruction = Patio.dataPtrToInt(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIf() {
+ var instruction = Patio.if_(
+ List.of(
+ Patio.localRef("x"),
+ Patio.localRef("y")
+ ),
+ Patio.localRef("condition"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(1)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(2))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x2"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("y2"), Patio.intConst(12))
+ ),
+ List.of(
+ Patio.localRef("x2"),
+ Patio.localRef("y2")
+ )
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntAdd() {
+ var instruction = Patio.intAdd(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntEquals() {
+ var instruction = Patio.intEquals(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntNotEqual() {
+ var instruction = Patio.intNotEqual(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntSub() {
+ var instruction = Patio.intSub(
+ Patio.localRef("destination"),
+ Patio.localRef("left"),
+ Patio.localRef("right")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntToBool() {
+ var instruction = Patio.intToBool(Patio.localRef("destination"), Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeIntToDataPtr() {
+ var instruction = Patio.intToDataPtr(
+ Patio.localRef("destination"),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLocalStore() {
+ var instruction = Patio.localStore(
+ Patio.localRef("destination"),
+ Patio.localRef("x")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoop() {
+ var instruction = Patio.loop(
+ List.of(
+ Patio.localStore(Patio.localRef("x"), Patio.intConst(1))
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoopBreak() {
+ var instruction = Patio.loopBreak();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeLoopContinue() {
+ var instruction = Patio.loopContinue();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeMemoryLoad() {
+ var instruction = Patio.memoryLoad(
+ Patio.localRef("destination"),
+ Patio.localRef("pointer"),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
+ List.of(1)
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeMemoryStore() {
+ var instruction = Patio.memoryStore(
+ Patio.localRef("pointer"),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
+ List.of(1),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeResume() {
+ var instruction = Patio.resume(Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeReturn() {
+ var instruction = Patio.return_(Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeReturnVoid() {
+ var instruction = Patio.returnVoid();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeSwitch() {
+ var instruction = Patio.switch_(
+ List.of(
+ Patio.localRef("x"),
+ Patio.localRef("y")
+ ),
+ Patio.localRef("value"),
+ List.of(
+ Patio.switchCase(
+ 1,
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x1"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("y1"), Patio.intConst(12))
+ ),
+ List.of(
+ Patio.localRef("x1"),
+ Patio.localRef("y1")
+ )
+ )
+ ),
+ Patio.switchCase(
+ 2,
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x2"), Patio.intConst(21)),
+ Patio.localStore(Patio.localRef("y2"), Patio.intConst(22))
+ ),
+ List.of(
+ Patio.localRef("x2"),
+ Patio.localRef("y2")
+ )
+ )
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("x3"), Patio.intConst(31)),
+ Patio.localStore(Patio.localRef("y3"), Patio.intConst(32))
+ ),
+ List.of(
+ Patio.localRef("x3"),
+ Patio.localRef("y3")
+ )
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeThrow() {
+ var instruction = Patio.throw_("Error", Patio.localRef("value"));
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeTry() {
+ var instruction = Patio.try_(
+ List.of(Patio.localRef("x"), Patio.localRef("y")),
+ List.of(
+ Patio.catchClause(
+ "Error1",
+ Patio.localRef("a1"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xCatch1"), Patio.intConst(11)),
+ Patio.localStore(Patio.localRef("yCatch1"), Patio.intConst(12))
+ ),
+ List.of(Patio.localRef("xCatch1"), Patio.localRef("yCatch1"))
+ )
+ ),
+ Patio.catchClause(
+ "Error2",
+ Patio.localRef("a2"),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xCatch2"), Patio.intConst(21)),
+ Patio.localStore(Patio.localRef("yCatch2"), Patio.intConst(22))
+ ),
+ List.of(Patio.localRef("xCatch2"), Patio.localRef("yCatch2"))
+ )
+ )
+ ),
+ Patio.block(
+ List.of(
+ Patio.localStore(Patio.localRef("xTry"), Patio.intConst(31)),
+ Patio.localStore(Patio.localRef("yTry"), Patio.intConst(32))
+ ),
+ List.of(Patio.localRef("xTry"), Patio.localRef("yTry"))
+ )
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeUnreachable() {
+ var instruction = Patio.unreachable();
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeVarLoad() {
+ var instruction = Patio.varLoad(
+ Patio.localRef("destination"),
+ Patio.localRef("v")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
+ @Test
+ public void canSerializeVarStore() {
+ var instruction = Patio.varStore(
+ Patio.localRef("destination"),
+ Patio.localRef("value")
+ );
+
+ var deserializedInstruction = PatioToProtobuf.deserializeInstruction(
+ PatioToProtobuf.serializeInstruction(instruction, Sources.NULL),
+ Sources.NULL
+ );
+
+ assertThat(deserializedInstruction, equalTo(instruction));
+ }
+
// == Operands ==
@Test