aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-22 11:47:10 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-22 11:47:10 +0100
commite01d4e5be2093eb9eb9fca62b8eaaa59d7ec882a (patch)
tree7b451702461729e0eca1f051b2e1f50e93dc2ce8 /src
parente2a87d4a022edfa7a7f552af9117c1ac1669cf32 (diff)
Directly represent scalar data layouts in Patio
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java24
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java6
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java10
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java13
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutBool.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutByte.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutFunctionPointer.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutInt.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutScalar.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java17
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java51
12 files changed, 105 insertions, 42 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
index aa687d63..60af8c99 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -293,7 +293,16 @@ public class WasmPatioCodeGen {
case PatioDataLayoutArray patioDataLayoutArray ->
sizeOf(patioDataLayoutArray.element()) * patioDataLayoutArray.size();
- case PatioDataLayoutScalar patioDataLayoutScalar ->
+ case PatioDataLayoutBool patioDataLayoutBool ->
+ 1;
+
+ case PatioDataLayoutByte patioDataLayoutByte ->
+ 1;
+
+ case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
+ 4;
+
+ case PatioDataLayoutInt patioDataLayoutInt ->
4;
case PatioDataLayoutStruct patioDataLayoutStruct ->
@@ -315,8 +324,17 @@ public class WasmPatioCodeGen {
wasmOffset += sizeOf(patioDataLayoutArray.element()) * patioOffset;
patioDataLayout = patioDataLayoutArray.element();
}
- case PatioDataLayoutScalar patioDataLayoutScalar -> {
- throw new RuntimeException("offset not allowed for scalars");
+ case PatioDataLayoutBool patioDataLayoutBool -> {
+ throw new RuntimeException("offset not allowed for bools");
+ }
+ case PatioDataLayoutByte patioDataLayoutByte -> {
+ throw new RuntimeException("offset not allowed for bytes");
+ }
+ case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer -> {
+ throw new RuntimeException("offset not allowed for function ptrs");
+ }
+ case PatioDataLayoutInt patioDataLayoutInt -> {
+ throw new RuntimeException("offset not allowed for ints");
}
case PatioDataLayoutStruct patioDataLayoutStruct -> {
for (var i = 0; i < patioOffset; i++) {
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
index 8c2fa128..9920eeaa 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
@@ -28,14 +28,14 @@ class PatioCodeGenClosures {
private static PatioDataLayout closureDataLayoutForCall() {
return new PatioDataLayoutStruct(List.of(
- PatioDataLayouts.scalar(PatioTypes.FUNCTION_POINTER)
+ PatioDataLayouts.FUNCTION_POINTER
));
}
private static PatioDataLayout closureDataLayout(int freeVariableCount) {
return PatioDataLayouts.struct(List.of(
- PatioDataLayouts.scalar(PatioTypes.FUNCTION_POINTER),
- PatioDataLayouts.structFlat(Lists.repeat(PatioCodeGenTypes.VALUE_TYPE, freeVariableCount))
+ PatioDataLayouts.FUNCTION_POINTER,
+ PatioDataLayouts.struct(Lists.repeat(PatioDataLayouts.INT, freeVariableCount))
));
}
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index 123bbf4a..33bc3b62 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -45,7 +45,7 @@ public class PatioCodeGenNamespaces {
context = context.addDataElementMutable(
globalNameNamespaceIsInited(namespaceName),
- PatioDataLayouts.scalar(PatioTypes.BOOL),
+ PatioDataLayouts.BOOL,
source
);
@@ -59,7 +59,7 @@ public class PatioCodeGenNamespaces {
initContext = initContext.addInstruction(new PatioMemoryStore(
new PatioDataPtr(globalNameNamespaceIsInited(namespaceName)),
- PatioDataLayouts.scalar(PatioTypes.BOOL),
+ PatioDataLayouts.BOOL,
List.of(),
new PatioBool(true),
source
@@ -85,7 +85,7 @@ public class PatioCodeGenNamespaces {
importContext = importContext.addInstruction(new PatioMemoryLoad(
isInited,
new PatioDataPtr(globalNameNamespaceIsInited(namespaceName)),
- PatioDataLayouts.scalar(PatioTypes.BOOL),
+ PatioDataLayouts.BOOL,
List.of(),
source
));
@@ -212,9 +212,9 @@ public class PatioCodeGenNamespaces {
}
private static PatioDataLayout namespaceDataLayout(NamespaceTypeInfo namespaceTypeInfo) {
- return PatioDataLayouts.structFlat(
+ return PatioDataLayouts.struct(
Lists.repeat(
- PatioCodeGenTypes.VALUE_TYPE,
+ PatioDataLayouts.INT,
namespaceTypeInfo.fieldCount()
)
);
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index 0c00ee09..977aa815 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -302,8 +302,17 @@ public class PatioSerializer {
treeInt(array.size())
);
- case PatioDataLayoutScalar scalar ->
- typeToTree(scalar.type());
+ case PatioDataLayoutBool bool ->
+ treeIdentifier("bool");
+
+ case PatioDataLayoutByte byte_ ->
+ treeIdentifier("byte");
+
+ case PatioDataLayoutFunctionPointer functionPointer ->
+ treeIdentifier("function-ptr");
+
+ case PatioDataLayoutInt int_ ->
+ treeIdentifier("int");
case PatioDataLayoutStruct struct ->
treeList(
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
index 13a03f2e..a2b4a91e 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.patio.ast.types;
-public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutScalar, PatioDataLayoutStruct {
+public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutBool, PatioDataLayoutByte, PatioDataLayoutFunctionPointer, PatioDataLayoutInt, PatioDataLayoutStruct {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutBool.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutBool.java
new file mode 100644
index 00000000..bd878387
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutBool.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutBool() implements PatioDataLayout {
+ public static final PatioDataLayoutBool INSTANCE = new PatioDataLayoutBool();
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutByte.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutByte.java
new file mode 100644
index 00000000..682fa24c
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutByte.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutByte() implements PatioDataLayout {
+ public static final PatioDataLayoutByte INSTANCE = new PatioDataLayoutByte();
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutFunctionPointer.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutFunctionPointer.java
new file mode 100644
index 00000000..bdcc2f25
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutFunctionPointer.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutFunctionPointer() implements PatioDataLayout {
+ public static final PatioDataLayoutFunctionPointer INSTANCE = new PatioDataLayoutFunctionPointer();
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutInt.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutInt.java
new file mode 100644
index 00000000..33716fc9
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutInt.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutInt() implements PatioDataLayout {
+ public static final PatioDataLayoutInt INSTANCE = new PatioDataLayoutInt();
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutScalar.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutScalar.java
deleted file mode 100644
index 592d95f2..00000000
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutScalar.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package org.shedlang.compiler.patio.ast.types;
-
-public record PatioDataLayoutScalar(PatioType type) implements PatioDataLayout {
-}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
index d523eb1f..aaafd701 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
@@ -6,22 +6,15 @@ public class PatioDataLayouts {
private PatioDataLayouts() {
}
+ public static final PatioDataLayout BOOL = PatioDataLayoutBool.INSTANCE;
+ public static final PatioDataLayout BYTE = PatioDataLayoutByte.INSTANCE;
+ public static final PatioDataLayout FUNCTION_POINTER = PatioDataLayoutFunctionPointer.INSTANCE;
+ public static final PatioDataLayout INT = PatioDataLayoutInt.INSTANCE;
+
public static PatioDataLayout array(PatioDataLayout element, int size) {
return new PatioDataLayoutArray(element, size);
}
- public static PatioDataLayout scalar(PatioType type) {
- return new PatioDataLayoutScalar(type);
- }
-
- public static PatioDataLayout structFlat(List<PatioType> elements) {
- return new PatioDataLayoutStruct(
- elements.stream()
- .map(element -> scalar(element))
- .toList()
- );
- }
-
public static PatioDataLayout struct(List<PatioDataLayout> elements) {
return new PatioDataLayoutStruct(elements);
}
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java
index 8da11ef2..ccca6fc7 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioSerializerTests.java
@@ -62,7 +62,7 @@ public class PatioSerializerTests {
@Test
public void canSerializeDataElementMutable() {
- var element = Patio.dataElementMutable("x", PatioDataLayouts.scalar(PatioTypes.INT));
+ var element = Patio.dataElementMutable("x", PatioDataLayouts.INT);
var string = PatioTesting.serializeCompilationUnitElement(element);
@@ -128,12 +128,12 @@ public class PatioSerializerTests {
public void canSerializeAlloc() {
var instruction = Patio.alloc(
"x",
- PatioDataLayouts.structFlat(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER))
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE))
);
var string = PatioTesting.serializeInstruction(instruction);
- assertThat(string, equalTo("(alloc (local \"x\") (struct (int int data-ptr)))"));
+ assertThat(string, equalTo("(alloc (local \"x\") (struct (int int byte)))"));
}
@Test
@@ -253,7 +253,7 @@ public class PatioSerializerTests {
var instruction = Patio.memoryLoad(
"target",
"pointer",
- PatioDataLayouts.structFlat(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER)),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
List.of(1)
);
@@ -264,7 +264,7 @@ public class PatioSerializerTests {
memory-load
(local "target")
pointer=(local "pointer")
- layout=(struct (int int data-ptr))
+ layout=(struct (int int byte))
offset=(1)
)"""
));
@@ -274,7 +274,7 @@ public class PatioSerializerTests {
public void canSerializeMemoryStore() {
var instruction = Patio.memoryStore(
"pointer",
- PatioDataLayouts.structFlat(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER)),
+ PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE)),
List.of(1),
"value"
);
@@ -285,7 +285,7 @@ public class PatioSerializerTests {
(
memory-store
pointer=(local "pointer")
- layout=(struct (int int data-ptr))
+ layout=(struct (int int byte))
offset=(1)
value=(local "value")
)"""
@@ -408,7 +408,7 @@ public class PatioSerializerTests {
@Test
public void canSerializeDataLayoutArray() {
- var layout = PatioDataLayouts.array(PatioDataLayouts.scalar(PatioTypes.INT), 4);
+ var layout = PatioDataLayouts.array(PatioDataLayouts.INT, 4);
var string = PatioTesting.serializeDataLayout(layout);
@@ -416,8 +416,35 @@ public class PatioSerializerTests {
}
@Test
- public void canSerializeDataLayoutScalar() {
- var layout = PatioDataLayouts.scalar(PatioTypes.INT);
+ public void canSerializeDataLayoutBool() {
+ var layout = PatioDataLayouts.BOOL;
+
+ var string = PatioTesting.serializeDataLayout(layout);
+
+ assertThat(string, equalTo("bool"));
+ }
+
+ @Test
+ public void canSerializeDataLayoutByte() {
+ var layout = PatioDataLayouts.BYTE;
+
+ var string = PatioTesting.serializeDataLayout(layout);
+
+ assertThat(string, equalTo("byte"));
+ }
+
+ @Test
+ public void canSerializeDataLayoutFunctionPointer() {
+ var layout = PatioDataLayouts.FUNCTION_POINTER;
+
+ var string = PatioTesting.serializeDataLayout(layout);
+
+ assertThat(string, equalTo("function-ptr"));
+ }
+
+ @Test
+ public void canSerializeDataLayoutInt() {
+ var layout = PatioDataLayouts.INT;
var string = PatioTesting.serializeDataLayout(layout);
@@ -426,12 +453,12 @@ public class PatioSerializerTests {
@Test
public void canSerializeDataLayoutStruct() {
- var layout = PatioDataLayouts.structFlat(List.of(PatioTypes.INT, PatioTypes.INT, PatioTypes.DATA_POINTER));
+ var layout = PatioDataLayouts.struct(List.of(PatioDataLayouts.INT, PatioDataLayouts.INT, PatioDataLayouts.BYTE));
var string = PatioTesting.serializeDataLayout(layout);
assertThat(string, equalTo("""
- (struct (int int data-ptr))"""
+ (struct (int int byte))"""
));
}