From 8147341b40ea563e8bdabfab1a71dd9c39d72a7c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 21 Jan 2024 19:01:12 +0000 Subject: Add Patio byte-size-of and byte-offset-of instructions --- .../compiler/patio/PatioSerializerTests.java | 46 +++++++++++++++++++++- .../compiler/patio/instructions/Patio.java | 24 +++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java index 33dccf5a..404b072f 100644 --- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java +++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java @@ -1,10 +1,10 @@ package org.shedlang.compiler.patio; import org.junit.jupiter.api.Test; +import org.shedlang.compiler.patio.instructions.Patio; 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.instructions.Patio; import java.util.List; import java.util.Optional; @@ -192,6 +192,50 @@ public class PatioSerializerTests { assertThat(string, equalTo("(bool-to-int (local \"destination\") (local \"value\"))")); } + @Test + public void canSerializeByteOffsetOf() { + var instruction = Patio.byteOffsetOf( + Patio.localRef("destination"), + PatioDataLayouts.struct(List.of( + PatioDataLayouts.INT, + PatioDataLayouts.BYTE + )), + List.of(1, 2) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + ( + byte-offset-of + (local "destination") + (struct (int byte)) + (1 2) + )""" + )); + } + + @Test + public void canSerializeByteSizeOf() { + var instruction = Patio.byteSizeOf( + Patio.localRef("destination"), + PatioDataLayouts.struct(List.of( + PatioDataLayouts.INT, + PatioDataLayouts.BYTE + )) + ); + + var string = PatioTesting.serializeInstruction(instruction); + + assertThat(string, equalTo(""" + ( + byte-size-of + (local "destination") + (struct (int byte)) + )""" + )); + } + @Test public void canSerializeCallWithoutTarget() { var instruction = Patio.call( diff --git a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java index e1610ada..a1dbd84e 100644 --- a/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java +++ b/src/test/java/org/shedlang/compiler/patio/instructions/Patio.java @@ -36,6 +36,30 @@ public class Patio { return new PatioBoolToInt(destination, value, Sources.NULL); } + public static PatioInstruction byteOffsetOf( + PatioLocalRef destination, + PatioDataLayout layout, + List offset + ) { + return new PatioByteOffsetOf( + destination, + layout, + offset, + Sources.NULL + ); + } + + public static PatioInstruction byteSizeOf( + PatioLocalRef destination, + PatioDataLayout layout + ) { + return new PatioByteSizeOf( + destination, + layout, + Sources.NULL + ); + } + public static PatioInstruction call( Optional destination, String name, -- cgit v1.2.3