aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
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/main/java
parente2a87d4a022edfa7a7f552af9117c1ac1669cf32 (diff)
Directly represent scalar data layouts in Patio
Diffstat (limited to 'src/main/java')
-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
11 files changed, 66 insertions, 30 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);
}