aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 16:43:49 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 16:43:49 +0100
commitd9a377762129c72ff18c34c8268579517ae6c3bf (patch)
treee1be0ce06a9cf7c3963a7c621bc5cb56241512bd /src/main/java
parent539e3cd702ec5f1b158d13db8f71e4ecb8d080bc (diff)
Add arrays to Patio data layouts
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java7
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java7
-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/PatioDataLayoutArray.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java4
5 files changed, 23 insertions, 1 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 d9d65f11..9e845a07 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -245,6 +245,10 @@ public class WasmPatioCodeGen {
for (var patioOffset : patioOffsets) {
switch (patioDataLayout) {
+ case PatioDataLayoutArray patioDataLayoutArray -> {
+ wasmOffset += sizeOf(patioDataLayoutArray.element()) * patioOffset;
+ patioDataLayout = patioDataLayoutArray.element();
+ }
case PatioDataLayoutScalar patioDataLayoutScalar -> {
throw new RuntimeException("offset not allowed for scalars");
}
@@ -291,6 +295,9 @@ public class WasmPatioCodeGen {
private static int sizeOf(PatioDataLayout layout) {
return switch (layout) {
+ case PatioDataLayoutArray patioDataLayoutArray ->
+ sizeOf(patioDataLayoutArray.element()) * patioDataLayoutArray.size();
+
case PatioDataLayoutScalar patioDataLayoutScalar ->
4;
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 59be2821..8c02d3d3 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -280,6 +280,13 @@ public class PatioSerializer {
private static Tree dataLayoutToTree(PatioDataLayout layout) {
return switch (layout) {
+ case PatioDataLayoutArray array ->
+ treeList(
+ treeIdentifier("array"),
+ dataLayoutToTree(array.element()),
+ treeInt(array.size())
+ );
+
case PatioDataLayoutScalar scalar ->
typeToTree(scalar.type());
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 19688bcb..13a03f2e 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 PatioDataLayoutScalar, PatioDataLayoutStruct {
+public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutScalar, PatioDataLayoutStruct {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java
new file mode 100644
index 00000000..eec92389
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java
@@ -0,0 +1,4 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutArray(PatioDataLayout element, int size) 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 eccae15b..d523eb1f 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,6 +6,10 @@ public class PatioDataLayouts {
private PatioDataLayouts() {
}
+ public static PatioDataLayout array(PatioDataLayout element, int size) {
+ return new PatioDataLayoutArray(element, size);
+ }
+
public static PatioDataLayout scalar(PatioType type) {
return new PatioDataLayoutScalar(type);
}