diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-22 11:47:10 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-22 11:47:10 +0100 |
| commit | e01d4e5be2093eb9eb9fca62b8eaaa59d7ec882a (patch) | |
| tree | 7b451702461729e0eca1f051b2e1f50e93dc2ce8 /src/main/java | |
| parent | e2a87d4a022edfa7a7f552af9117c1ac1669cf32 (diff) | |
Directly represent scalar data layouts in Patio
Diffstat (limited to 'src/main/java')
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); } |
