diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-13 23:43:42 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-13 23:43:42 +0100 |
| commit | f53ad99ff807ad0e8f04e365390828af2e9592d0 (patch) | |
| tree | 06a6e1228994668783fd1b4555f947a9ad54fa44 /src/main/java | |
| parent | b003b9c7bad4126d7963d1a28ef46faeab4b4b6e (diff) | |
Introduce NamespaceTypeInfo
Diffstat (limited to 'src/main/java')
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) { |
