aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-21 10:34:26 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-21 10:34:26 +0100
commit4efca2b4db92e78001c21d40734ce05f2977ef0b (patch)
tree27b14c035f0944866b402f723e91e3e24a35ae77 /src/main/java
parente1a05af93d777252cd59012f1ee7e9b47191b5ea (diff)
Generate import namespace function
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java71
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCallPointer.java3
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioDataPtrToInt.java3
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioMemoryLoad.java3
4 files changed, 76 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
index 6c2fa177..bfa23ee8 100644
--- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenNamespaces.java
@@ -1,8 +1,9 @@
package org.shedlang.compiler.patio;
-import org.shedlang.compiler.patio.ast.instructions.PatioMemoryStore;
+import org.shedlang.compiler.patio.ast.instructions.*;
import org.shedlang.compiler.patio.ast.operands.PatioBool;
import org.shedlang.compiler.patio.ast.operands.PatioDataPtr;
+import org.shedlang.compiler.patio.ast.operands.PatioFunctionPtr;
import org.shedlang.compiler.patio.ast.types.PatioDataLayout;
import org.shedlang.compiler.patio.ast.types.PatioTypes;
import org.shedlang.compiler.sources.Sources;
@@ -59,6 +60,74 @@ public class PatioCodeGenNamespaces {
}
);
+ context = context.createFunction(
+ globalNameNamespaceImport(namespaceName),
+ false,
+ PatioCodeGenTypes.VALUE_TYPE,
+ source,
+ importContext -> {
+ var isInitedResult = importContext.allocateLocal(
+ PatioCodeGenLocalSpace.TEMPORARY,
+ PatioTypes.BOOL
+ );
+ var isInited = isInitedResult.value();
+ importContext = isInitedResult.context();
+
+ importContext = importContext.addInstruction(new PatioMemoryLoad(
+ isInited,
+ new PatioDataPtr(globalNameNamespaceIsInited(namespaceName)),
+ PatioTypes.scalar(PatioTypes.BOOL),
+ List.of(),
+ source
+ ));
+
+ var initReturnResult = importContext.allocateLocal(
+ PatioCodeGenLocalSpace.TEMPORARY,
+ PatioTypes.BOOL
+ );
+ var initReturn = initReturnResult.value();
+ importContext = initReturnResult.context();
+
+ importContext = importContext.addInstruction(new PatioIf(
+ isInited,
+ List.of(),
+ List.of(
+ // TODO: use direct call
+ // TODO: don't require target
+ new PatioCallPointer(
+ initReturn,
+ new PatioFunctionPtr(globalNameNamespaceInit(namespaceName)),
+ List.of(),
+ source
+ )
+ ),
+ source
+ ));
+
+ var namespaceValueResult = importContext.allocateLocal(
+ PatioCodeGenLocalSpace.TEMPORARY,
+ PatioCodeGenTypes.VALUE_TYPE
+ );
+ var namespaceValue = namespaceValueResult.value();
+ importContext = namespaceValueResult.context();
+
+ importContext = importContext.addInstruction(new PatioDataPtrToInt(
+ namespaceValue,
+ new PatioDataPtr(
+ globalNameNamespaceValue(namespaceName)
+ ),
+ source
+ ));
+
+ importContext = importContext.addInstruction(new PatioReturn(
+ namespaceValue,
+ source
+ ));
+
+ return importContext;
+ }
+ );
+
return context;
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCallPointer.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCallPointer.java
index 5373a95d..215f71f9 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCallPointer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioCallPointer.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.patio.ast.instructions;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
import org.shedlang.compiler.sources.Source;
import java.util.List;
@@ -11,7 +12,7 @@ import java.util.List;
*/
public record PatioCallPointer(
PatioLocalRef target,
- PatioLocalRef functionPointer,
+ PatioOperand functionPointer,
List<PatioLocalRef> args,
Source source
) implements PatioInstruction {
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioDataPtrToInt.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioDataPtrToInt.java
index 42372cbb..481cdcd0 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioDataPtrToInt.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioDataPtrToInt.java
@@ -1,11 +1,12 @@
package org.shedlang.compiler.patio.ast.instructions;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
import org.shedlang.compiler.sources.Source;
public record PatioDataPtrToInt(
PatioLocalRef target,
- PatioLocalRef value,
+ PatioOperand value,
Source source
) implements PatioInstruction {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioMemoryLoad.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioMemoryLoad.java
index 16037653..977bf6c9 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioMemoryLoad.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioMemoryLoad.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.patio.ast.instructions;
import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
import org.shedlang.compiler.patio.ast.types.PatioDataLayout;
import org.shedlang.compiler.sources.Source;
@@ -12,7 +13,7 @@ import java.util.List;
*/
public record PatioMemoryLoad(
PatioLocalRef target,
- PatioLocalRef pointer,
+ PatioOperand pointer,
PatioDataLayout layout,
List<Integer> offset,
Source source