Skip to content

Commit f11b965

Browse files
committed
Fixed remaining critical bugs in the current implementation.
1 parent 92234bc commit f11b965

19 files changed

Lines changed: 107 additions & 27 deletions

File tree

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/FunctionHeader.java‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public boolean matchesExactly(CallArguments arguments, TypeScope scope) {
190190

191191
FunctionHeader header = fillGenericArguments(scope.getTypeRegistry(), arguments.typeArguments, scope.getLocalTypeParameters());
192192
for (int i = 0; i < header.parameters.length; i++) {
193-
if (arguments.arguments[i].type != header.parameters[i].type)
193+
if (!arguments.arguments[i].type.equals(header.parameters[i].type))
194194
return false;
195195
}
196196

@@ -366,9 +366,7 @@ public boolean isSimilarTo(FunctionHeader other) {
366366
public FunctionHeader instanceForCall(GlobalTypeRegistry registry, CallArguments arguments) {
367367
if (arguments.getNumberOfTypeArguments() > 0) {
368368
Map<TypeParameter, StoredType> typeParameters = StoredType.getMapping(this.typeParameters, arguments.typeArguments);
369-
return withGenericArguments(
370-
registry,
371-
new GenericMapper(registry, typeParameters));
369+
return instance(new GenericMapper(registry, typeParameters));
372370
} else {
373371
return this;
374372
}
@@ -378,6 +376,10 @@ public FunctionHeader withGenericArguments(GlobalTypeRegistry registry, GenericM
378376
if (typeParameters.length > 0)
379377
mapper = mapper.getInner(registry, StoredType.getSelfMapping(registry, typeParameters));
380378

379+
return instance(mapper);
380+
}
381+
382+
private FunctionHeader instance(GenericMapper mapper) {
381383
StoredType returnType = this.returnType.instance(mapper);
382384
FunctionParameter[] parameters = new FunctionParameter[this.parameters.length];
383385
for (int i = 0; i < parameters.length; i++) {

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/GenericMapper.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ public StoredType[] map(StoredType[] original) {
4848
}
4949

5050
public StoredType map(GenericTypeID type) {
51-
if (!mapping.containsKey(type.parameter))
52-
throw new IllegalStateException("No mapping found for type " + type);
51+
//if (!mapping.containsKey(type.parameter))
52+
// throw new IllegalStateException("No mapping found for type " + type);
5353

5454
return mapping.containsKey(type.parameter) ? mapping.get(type.parameter) : type.stored();
5555
}

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/context/FileResolutionContext.java‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import java.util.List;
1010
import java.util.Map;
1111
import org.openzen.zencode.shared.CodePosition;
12+
import org.openzen.zencode.shared.CompileExceptionCode;
1213
import org.openzen.zenscript.codemodel.HighLevelDefinition;
1314
import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
1415
import org.openzen.zenscript.codemodel.type.GenericName;
1516
import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
17+
import org.openzen.zenscript.codemodel.type.InvalidTypeID;
1618
import org.openzen.zenscript.codemodel.type.StoredType;
1719
import org.openzen.zenscript.codemodel.type.TypeID;
1820
import org.openzen.zenscript.codemodel.type.storage.StorageTag;
@@ -48,9 +50,13 @@ public AnnotationDefinition getAnnotation(String name) {
4850
@Override
4951
public TypeID getType(CodePosition position, List<GenericName> name) {
5052
if (imports.containsKey(name.get(0).name)) {
53+
HighLevelDefinition definition = imports.get(name.get(0).name);
54+
if (definition.getNumberOfGenericParameters() != name.get(0).arguments.length)
55+
return new InvalidTypeID(position, CompileExceptionCode.INVALID_TYPE_ARGUMENTS, "Invalid number of type arguments");
56+
5157
return GenericName.getInnerType(
5258
getTypeRegistry(),
53-
getTypeRegistry().getForDefinition(imports.get(name.get(0).name), name.get(0).arguments),
59+
getTypeRegistry().getForDefinition(definition, name.get(0).arguments),
5460
name,
5561
1);
5662
}

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/expression/NewExpression.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.openzen.zenscript.codemodel.member.ref.FunctionalMemberRef;
1111
import org.openzen.zenscript.codemodel.scope.TypeScope;
1212
import org.openzen.zenscript.codemodel.type.StoredType;
13+
import org.openzen.zenscript.codemodel.type.member.BuiltinID;
1314

1415
/**
1516
*

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/DefinitionScope.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public DefinitionScope(BaseScope outer, HighLevelDefinition definition, boolean
6666
typeParameters = StoredType.getSelfMapping(outer.getTypeRegistry(), expansion.typeParameters);
6767
} else {
6868
DefinitionTypeID definitionType = outer.getTypeRegistry().getForMyDefinition(definition);
69-
type = definitionType.stored(BorrowStorageTag.THIS);
69+
type = definitionType.stored();
7070

7171
List<TypeParameter> typeParameterList = new ArrayList<>();
7272
while (definitionType != null) {

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/StoredType.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public StorageTag getActualStorage() {
6161
}
6262

6363
public StoredType getNormalized() {
64-
return type.getNormalized() == type ? this : new StoredType(type, storage);
64+
return type.getNormalized() == type ? this : new StoredType(type.getNormalized(), storage);
6565
}
6666

6767
public StoredType getSuperType(GlobalTypeRegistry registry) {

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberBuilder.java‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ public Void visitArray(Void context, ArrayTypeID array) {
215215
ARRAY_INDEXGET);
216216

217217
if (dimension == 1) {
218-
FunctionHeader sliceHeader = new FunctionHeader(type, new FunctionParameter(RangeTypeID.USIZE.stored, "range"));
218+
FunctionHeader sliceHeader = new FunctionHeader(new StoredType(type.type, UniqueStorageTag.INSTANCE), new FunctionParameter(RangeTypeID.USIZE.stored, "range"));
219219
operator(
220220
definition,
221221
OperatorType.INDEXGET,
@@ -291,7 +291,7 @@ public Void visitArray(Void context, ArrayTypeID array) {
291291
VOID.stored,
292292
null,
293293
null,
294-
new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(BorrowStorageTag.INVOCATION), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
294+
new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
295295
new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithoutIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
296296
members.addConstructor(new ConstructorMember(
297297
BUILTIN,
@@ -314,7 +314,7 @@ public Void visitArray(Void context, ArrayTypeID array) {
314314
VOID.stored,
315315
null,
316316
null,
317-
new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(BorrowStorageTag.INVOCATION), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
317+
new FunctionParameter(registry.getArray(registry.getGeneric(mappedConstructorParameter).stored(), dimension).stored(BorrowStorageTag.INVOCATION), "original"),
318318
new FunctionParameter(registry.getFunction(mappedConstructorHeaderWithIndex).stored(BorrowStorageTag.INVOCATION), "projection"));
319319
constructor(definition, ARRAY_CONSTRUCTOR_PROJECTED_INDEXED, mappedConstructorFunctionWithIndex);
320320
}

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMemberGroup.java‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope,
332332
if (!(method.member.isStatic() ? allowStatic : allowNonStatic))
333333
continue;
334334

335-
FunctionHeader header = method.member.getHeader();
335+
FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
336336
if (header.matchesExactly(arguments, scope))
337337
return method.member;
338338
}
@@ -347,14 +347,15 @@ public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope,
347347

348348
scope.getPreparer().prepare(method.member.getTarget());
349349

350-
FunctionHeader header = method.member.getHeader();
350+
FunctionHeader header = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
351351
if (!header.matchesImplicitly(arguments, scope))
352352
continue;
353353

354354
if (selected != null) {
355355
StringBuilder explanation = new StringBuilder();
356-
explanation.append("Function A: ").append(selected.getHeader().toString()).append("\n");
357-
explanation.append("Function B: ").append(method.member.getHeader().toString());
356+
FunctionHeader selectedHeader = selected.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
357+
explanation.append("Function A: ").append(selectedHeader.toString()).append("\n");
358+
explanation.append("Function B: ").append(header.toString());
358359
throw new CompileException(position, CompileExceptionCode.CALL_AMBIGUOUS, "Ambiguous call; multiple methods match:\n" + explanation.toString());
359360
}
360361

@@ -374,7 +375,8 @@ public FunctionalMemberRef selectMethod(CodePosition position, TypeScope scope,
374375
continue;
375376
}
376377

377-
message.append(method.member.getHeader().explainWhyIncompatible(scope, arguments)).append("\n");
378+
FunctionHeader instancedHeader = method.member.getHeader().instanceForCall(scope.getTypeRegistry(), arguments);
379+
message.append(instancedHeader.explainWhyIncompatible(scope, arguments)).append("\n");
378380
}
379381

380382
throw new CompileException(position, CompileExceptionCode.CALL_NO_VALID_METHOD, "No matching method found for " + name + ":\n" + message.toString());

‎CodeModel/src/main/java/org/openzen/zenscript/codemodel/type/member/TypeMembers.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ public Expression castImplicit(CodePosition position, Expression value, StoredTy
487487
return castEquivalent(position, caster.member.cast(position, value, implicit), toType);
488488
}
489489
for (TypeMember<ImplementationMemberRef> implementation : implementations) {
490-
if (implementation.member.implementsType.equals(toType.type))
490+
if (implementation.member.implementsType.getNormalized() == toType.type)
491491
return castEquivalent(position, new InterfaceCastExpression(position, value, toType.type.stored(type.getActualStorage())), toType);
492492
}
493493
if (extendsType(toType.type))

‎JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
import org.openzen.zenscript.codemodel.type.GlobalTypeRegistry;
1212
import org.openzen.zenscript.codemodel.type.StoredType;
1313
import org.openzen.zenscript.codemodel.type.TypeID;
14-
import org.openzen.zenscript.codemodel.type.storage.AutoStorageTag;
15-
import org.openzen.zenscript.codemodel.type.storage.SharedStorageTag;
1614
import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
1715
import org.openzen.zenscript.javashared.JavaContext;
1816
import org.openzen.zenscript.javashared.JavaMethod;
@@ -118,6 +116,10 @@ private void createRangeClass(JavaSynthesizedRange range) {
118116

119117
register(range.cls.internalName, rangeWriter.toByteArray());
120118
}
119+
120+
private void createSharedClass() {
121+
// TODO
122+
}
121123

122124
public String getLambdaCounter() {
123125
return "lambda" + ++lambdaCounter;
@@ -134,5 +136,10 @@ public void synthesizeFunction(JavaSynthesizedFunction function) {
134136
public void synthesizeRange(JavaSynthesizedRange range) {
135137
createRangeClass(range);
136138
}
139+
140+
@Override
141+
public void synthesizeShared() {
142+
createSharedClass();
143+
}
137144
}
138145
}

0 commit comments

Comments
 (0)