aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-13 23:43:42 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-13 23:43:42 +0100
commitf53ad99ff807ad0e8f04e365390828af2e9592d0 (patch)
tree06a6e1228994668783fd1b4555f947a9ad54fa44 /src/main/java
parentb003b9c7bad4126d7963d1a28ef46faeab4b4b6e (diff)
Introduce NamespaceTypeInfo
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java6
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java20
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java21
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java13
-rw-r--r--src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java14
-rw-r--r--src/main/java/org/shedlang/compiler/util/POrderedMap.java4
6 files changed, 49 insertions, 29 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
index 8b933bad..837735ec 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -42,17 +42,17 @@ public class LlvmCompiler {
var fieldValue = popResult.value();
context = popResult.context();
- var namespaceFields = context.typeInfo().namespaceFields(
+ var namespaceTypeInfo = context.typeInfo().namespaceTypeInfo(
namespaceFieldStore.namespaceName()
);
var fieldPointerName = "fieldPointer__" + namespaceFieldStore.fieldName();
yield context.addInstruction(new LlvmGetElementPtr(
new LlvmVariableLocal(fieldPointerName),
- LlvmCompilerNamespaces.typeNamespacePointer(namespaceFields),
+ LlvmCompilerNamespaces.typeNamespacePointer(namespaceTypeInfo),
LlvmCompilerNamespaces.operandNamespaceValue(namespaceFieldStore.namespaceName()),
List.of(
LlvmTypedOperand.arrayIndex(0),
- LlvmTypedOperand.structureIndex(namespaceFields.keys().indexOf(namespaceFieldStore.fieldName()))
+ LlvmTypedOperand.structureIndex(namespaceTypeInfo.fieldIndex(namespaceFieldStore.fieldName()))
)
)).addInstruction(new LlvmStore(
LlvmCompilerTypes.VALUE_TYPE,
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
index 85caf95e..3bbf51a3 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
@@ -5,23 +5,23 @@ import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypePointer;
import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypeStructure;
import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.types.Type;
-import org.shedlang.compiler.util.POrderedMap;
+import org.shedlang.compiler.types.NamespaceTypeInfo;
+
+import java.util.Collections;
public class LlvmCompilerNamespaces {
private LlvmCompilerNamespaces() {
}
- public static LlvmTypePointer typeNamespacePointer(POrderedMap<String, Type> namespaceFields) {
- return new LlvmTypePointer(typeNamespaceStruct(namespaceFields));
+ public static LlvmTypePointer typeNamespacePointer(NamespaceTypeInfo namespaceTypeInfo) {
+ return new LlvmTypePointer(typeNamespaceStruct(namespaceTypeInfo));
}
- public static LlvmType typeNamespaceStruct(POrderedMap<String, Type> namespaceFields) {
- return new LlvmTypeStructure(
- namespaceFields.values().stream()
- .map(x -> LlvmCompilerTypes.VALUE_TYPE)
- .toList()
- );
+ public static LlvmType typeNamespaceStruct(NamespaceTypeInfo namespaceTypeInfo) {
+ return new LlvmTypeStructure(Collections.nCopies(
+ namespaceTypeInfo.fieldCount(),
+ LlvmCompilerTypes.VALUE_TYPE
+ ));
}
public static LlvmVariableGlobal operandNamespaceValue(NamespaceName namespaceName) {
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
index b16169a7..a377058a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java
@@ -4,6 +4,7 @@ import org.pcollections.Empty;
import org.pcollections.PMap;
import org.pcollections.POrderedSet;
import org.shedlang.compiler.types.NamespaceName;
+import org.shedlang.compiler.types.NamespaceTypeInfo;
import org.shedlang.compiler.types.Type;
import org.shedlang.compiler.util.POrderedMap;
@@ -24,18 +25,18 @@ public class TypeCheckerContext {
private final PMap<String, Type> environment;
private final Set<String> boundVariables;
private final POrderedSet<String> freeVariables;
- private final PMap<NamespaceName, POrderedMap<String, Type>> namespaceFields;
+ private final PMap<NamespaceName, NamespaceTypeInfo> namespaceTypeInfo;
public TypeCheckerContext(
PMap<String, Type> environment,
Set<String> boundVariables,
POrderedSet<String> freeVariables,
- PMap<NamespaceName, POrderedMap<String, Type>> namespaceFields
+ PMap<NamespaceName, NamespaceTypeInfo> namespaceTypeInfo
) {
this.environment = environment;
this.boundVariables = boundVariables;
this.freeVariables = freeVariables;
- this.namespaceFields = namespaceFields;
+ this.namespaceTypeInfo = namespaceTypeInfo;
}
public TypeCheckerContext enter(PMap<String, Type> environment) {
@@ -43,7 +44,7 @@ public class TypeCheckerContext {
this.environment.plusAll(environment),
environment.keySet(),
Empty.orderedSet(),
- this.namespaceFields
+ this.namespaceTypeInfo
);
}
@@ -63,7 +64,7 @@ public class TypeCheckerContext {
environment,
boundVariables,
freeVariables.plus(name),
- this.namespaceFields
+ this.namespaceTypeInfo
);
}
@@ -75,16 +76,18 @@ public class TypeCheckerContext {
NamespaceName namespaceName,
POrderedMap<String, Type> fields
) {
+ var namespaceTypeInfo = new NamespaceTypeInfo(fields);
+
return new TypeCheckerContext(
this.environment,
this.boundVariables,
this.freeVariables,
- namespaceFields.plus(namespaceName, fields)
+ this.namespaceTypeInfo.plus(namespaceName, namespaceTypeInfo)
);
}
- public PMap<NamespaceName, POrderedMap<String, Type>> namespaceFields() {
- return namespaceFields;
+ public PMap<NamespaceName, NamespaceTypeInfo> namespaceTypeInfo() {
+ return namespaceTypeInfo;
}
public <T> TypeCheckerResult<T> toResult(T value) {
@@ -108,6 +111,6 @@ public class TypeCheckerContext {
}
public TypeInfo toTypeInfo() {
- return new TypeInfo(namespaceFields);
+ return new TypeInfo(namespaceTypeInfo);
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java
index cfce56ef..5cb5a5b0 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java
@@ -3,22 +3,21 @@ package org.shedlang.compiler.typechecker;
import org.pcollections.Empty;
import org.pcollections.PMap;
import org.shedlang.compiler.types.NamespaceName;
-import org.shedlang.compiler.types.Type;
-import org.shedlang.compiler.util.POrderedMap;
+import org.shedlang.compiler.types.NamespaceTypeInfo;
public class TypeInfo {
public static final TypeInfo EMPTY = new TypeInfo(Empty.map());
- private final PMap<NamespaceName, POrderedMap<String, Type>> namespaceFields;
+ private final PMap<NamespaceName, NamespaceTypeInfo> namespaceTypeInfo;
public TypeInfo(
- PMap<NamespaceName, POrderedMap<String, Type>> namespaceFields
+ PMap<NamespaceName, NamespaceTypeInfo> namespaceTypeInfo
) {
- this.namespaceFields = namespaceFields;
+ this.namespaceTypeInfo = namespaceTypeInfo;
}
- public POrderedMap<String, Type> namespaceFields(NamespaceName namespaceName) {
+ public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) {
// TODO: handle missing key
- return namespaceFields.get(namespaceName);
+ return namespaceTypeInfo.get(namespaceName);
}
}
diff --git a/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java b/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java
new file mode 100644
index 00000000..7540714b
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/types/NamespaceTypeInfo.java
@@ -0,0 +1,14 @@
+package org.shedlang.compiler.types;
+
+import org.shedlang.compiler.util.POrderedMap;
+
+public record NamespaceTypeInfo(POrderedMap<String, Type> fields) {
+ public int fieldCount() {
+ return fields.size();
+ }
+
+ public int fieldIndex(String fieldName) {
+ // TODO: handle missing field
+ return fields.keys().indexOf(fieldName);
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/util/POrderedMap.java b/src/main/java/org/shedlang/compiler/util/POrderedMap.java
index 60bc6209..71150430 100644
--- a/src/main/java/org/shedlang/compiler/util/POrderedMap.java
+++ b/src/main/java/org/shedlang/compiler/util/POrderedMap.java
@@ -46,6 +46,10 @@ public class POrderedMap<K, V> {
return map.values();
}
+ public int size() {
+ return keys.size();
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {