diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-21 13:42:34 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-21 13:42:34 +0100 |
| commit | 4767848c0272da0468df8ff66c88daa39018de5e (patch) | |
| tree | 72e0899ec3d892135d2edfe51436c551d11280ee /src/main/java | |
| parent | 2c3d90f2c9a6cbcbe0c5dc6758b326539aa7a9b1 (diff) | |
Add Patio code gen for field loads
Diffstat (limited to 'src/main/java')
3 files changed, 64 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java index 126488e5..452a044e 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java @@ -148,6 +148,33 @@ public class PatioCodeGen { case DiscardInstruction discard -> context.temporaryPop().context(); + case FieldLoadInstruction fieldLoad -> { + var receiverResult = context.temporaryPop(); + var receiver = receiverResult.value(); + context = receiverResult.context(); + + var targetResult = context.allocateLocal( + PatioCodeGenLocalSpace.TEMPORARY, + fieldLoad.fieldName(), + PatioCodeGenTypes.VALUE_TYPE + ); + var target = targetResult.value(); + context = targetResult.context(); + + context = PatioCodeGenNamespaces.fieldLoad( + target, + receiver, + fieldLoad.namespaceName(), + fieldLoad.fieldName(), + fieldLoad.source(), + context + ); + + context = context.temporaryPush(target); + + yield context; + } + case IntAddInstruction intAdd -> { var rightResult = context.temporaryPop(); var right = rightResult.value(); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java index dba6a523..0a8cac3e 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java @@ -8,6 +8,7 @@ public enum PatioCodeGenLocalSpace { CLOSURE_POINTER("closurePointer"), CLOSURE_FUNCTION_POINTER("closureFunctionPointer"), NAMESPACE_IS_INITED_POINTER("namespaceIsInitedPointer"), + NAMESPACE_POINTER("namespacePointer"), NAMESPACE_VALUE("namespaceValue"), LOCAL("local"), RECEIVER("receiver"), diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java index 11a4477e..824fbc79 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java @@ -152,6 +152,42 @@ public class PatioCodeGenNamespaces { return context; } + public static PatioCodeGenContext fieldLoad( + PatioLocalRef target, + PatioLocalRef receiver, + NamespaceName nameSpaceName, + String fieldName, + Source source, + PatioCodeGenContext context + ) { + var namespaceTypeInfo = context.namespaceTypeInfo(nameSpaceName); + var layout = namespaceDataLayout(namespaceTypeInfo); + + var namespacePointerResult = context.allocateLocal( + PatioCodeGenLocalSpace.NAMESPACE_POINTER, + namespaceNameToPatioIdentifier(nameSpaceName), + PatioTypes.DATA_POINTER + ); + var namespacePointer = namespacePointerResult.value(); + context = namespacePointerResult.context(); + + context = context.addInstruction(new PatioIntToDataPtr( + namespacePointer, + receiver, + source + )); + + context = context.addInstruction(new PatioMemoryLoad( + target, + namespacePointer, + layout, + List.of(namespaceTypeInfo.fieldIndex(fieldName)), + source + )); + + return context; + } + private static PatioDataLayout namespaceDataLayout(NamespaceTypeInfo namespaceTypeInfo) { return PatioTypes.structFlat( Lists.repeat( |
