From 557198d9f3718e2be26b793dc32e76912f2c5bcc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 20 Jul 2023 14:08:21 +0100 Subject: Allow nested structs --- .../java/org/shedlang/compiler/patio/PatioCodeGenClosures.java | 2 +- .../java/org/shedlang/compiler/patio/ast/PatioSerializer.java | 5 ++++- .../org/shedlang/compiler/patio/ast/types/PatioDataLayout.java | 2 +- .../org/shedlang/compiler/patio/ast/types/PatioScalar.java | 4 ++++ .../org/shedlang/compiler/patio/ast/types/PatioStruct.java | 4 +++- .../java/org/shedlang/compiler/patio/ast/types/PatioTypes.java | 10 +++++++++- 6 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/types/PatioScalar.java (limited to 'src/main/java') 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 elements) implements PatioDataLayout { +public record PatioStruct( + List 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 elements) { - return new PatioStruct(elements); + return new PatioStruct( + elements.stream() + .map(element -> scalar(element)) + .toList() + ); } } -- cgit v1.2.3