aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-20 14:08:21 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-20 14:08:21 +0100
commit557198d9f3718e2be26b793dc32e76912f2c5bcc (patch)
treeae5e8e84b286e3061626a832f40f3db6ff7712a7 /src/main/java
parent8ae1e2dad3d43a75874e7cbb479601b5abae3b78 (diff)
Allow nested structs
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java5
-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/PatioScalar.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioStruct.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioTypes.java10
6 files changed, 22 insertions, 5 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
index 37cdaa30..16b9172b 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenClosures.java
@@ -27,7 +27,7 @@ class PatioCodeGenClosures {
private static PatioDataLayout closureDataLayout() {
return new PatioStruct(List.of(
- PatioTypes.FUNCTION_POINTER
+ PatioTypes.scalar(PatioTypes.FUNCTION_POINTER)
));
}
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 c38851f7..6a48399e 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -154,12 +154,15 @@ public class PatioSerializer {
private static Tree dataLayoutToTree(PatioDataLayout layout) {
return switch (layout) {
+ case PatioScalar scalar ->
+ typeToTree(scalar.type());
+
case PatioStruct struct ->
treeList(
treeIdentifier("struct"),
treeList(
struct.elements().stream()
- .map(element -> typeToTree(element))
+ .map(element -> dataLayoutToTree(element))
.toList()
)
);
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 ac7d3594..8a33a5e5 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 PatioStruct {
+public sealed interface PatioDataLayout permits PatioScalar, PatioStruct {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioScalar.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioScalar.java
new file mode 100644
index 00000000..c301ab24
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioScalar.java
@@ -0,0 +1,4 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioScalar(PatioType type) implements PatioDataLayout {
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioStruct.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioStruct.java
index 065fc026..99499738 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioStruct.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioStruct.java
@@ -2,5 +2,7 @@ package org.shedlang.compiler.patio.ast.types;
import java.util.List;
-public record PatioStruct(List<PatioType> elements) implements PatioDataLayout {
+public record PatioStruct(
+ List<PatioDataLayout> elements
+) implements PatioDataLayout {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioTypes.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioTypes.java
index 7ecc371a..dd31bde0 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioTypes.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioTypes.java
@@ -10,7 +10,15 @@ public class PatioTypes {
public static final PatioFunctionPointerType FUNCTION_POINTER = PatioFunctionPointerType.INSTANCE;
public static final PatioIntType INT = PatioIntType.INSTANCE;
+ public static PatioDataLayout scalar(PatioType type) {
+ return new PatioScalar(type);
+ }
+
public static PatioDataLayout struct(List<PatioType> elements) {
- return new PatioStruct(elements);
+ return new PatioStruct(
+ elements.stream()
+ .map(element -> scalar(element))
+ .toList()
+ );
}
}