aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 13:42:34 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 13:42:34 +0100
commit4767848c0272da0468df8ff66c88daa39018de5e (patch)
tree72e0899ec3d892135d2edfe51436c551d11280ee /src/main/java
parent2c3d90f2c9a6cbcbe0c5dc6758b326539aa7a9b1 (diff)
Add Patio code gen for field loads
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java27
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java1
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java36
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(