Skip to content

Commit 17d8d35

Browse files
stanhebbenWitixin1512TheSilkMinerkindlich
authored
Feature/refactor data flow analyses broken arrays map 2 (#138)
* Attempt to fix arrays/arrays-maps-2 * Switch order of stuff * Actually fix the thing * Cleanup JavaWriter Constants * Fix methodDescriptor for generic expansion methods in generic expansions * Add Test for accessing nested classes --------- Co-authored-by: Witixin1512 <[email protected]> Co-authored-by: Silk <[email protected]> Co-authored-by: kindlich <[email protected]>
1 parent f9dafe8 commit 17d8d35

File tree

19 files changed

+466
-156
lines changed

19 files changed

+466
-156
lines changed

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/ExpressionCompiler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44
import org.openzen.zencode.shared.CompileError;
55
import org.openzen.zenscript.codemodel.FunctionHeader;
66
import org.openzen.zenscript.codemodel.GenericName;
7-
import org.openzen.zenscript.codemodel.VariableDefinition;
7+
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalExpression;
88
import org.openzen.zenscript.codemodel.expression.LambdaClosure;
9-
import org.openzen.zenscript.codemodel.statement.VarStatement;
109
import org.openzen.zenscript.codemodel.type.TypeID;
1110

1211
import java.util.List;
@@ -19,6 +18,8 @@ public interface ExpressionCompiler extends TypeResolver {
1918

2019
Optional<TypeID> getThisType();
2120

21+
Optional<CompilingExpression> getThis(CodePosition position);
22+
2223
Optional<LocalType> getLocalType();
2324

2425
Optional<TypeID> getThrowableType();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.openzen.zenscript.codemodel.compilation.impl.capture;
2+
3+
import org.openzen.zencode.shared.CodePosition;
4+
import org.openzen.zenscript.codemodel.FunctionParameter;
5+
import org.openzen.zenscript.codemodel.compilation.CompilingExpression;
6+
import org.openzen.zenscript.codemodel.compilation.ExpressionCompiler;
7+
import org.openzen.zenscript.codemodel.compilation.expression.AbstractCompilingExpression;
8+
import org.openzen.zenscript.codemodel.expression.*;
9+
import org.openzen.zenscript.codemodel.ssa.CodeBlockStatement;
10+
import org.openzen.zenscript.codemodel.ssa.SSAVariableCollector;
11+
import org.openzen.zenscript.codemodel.type.TypeID;
12+
13+
public class LocalThisExpression implements LocalExpression {
14+
private final CodePosition position;
15+
private final TypeID type;
16+
17+
public LocalThisExpression(CodePosition position, TypeID type) {
18+
this.position = position;
19+
this.type = type;
20+
}
21+
22+
@Override
23+
public LocalExpression capture(LambdaClosure closure) {
24+
CapturedExpression value = new CapturedThisExpression(position, type, closure);
25+
closure.add(value);
26+
return new LocalCapturedExpression(value);
27+
}
28+
29+
@Override
30+
public CompilingExpression compile(ExpressionCompiler compiler) {
31+
return new Compiling(compiler, position, type);
32+
}
33+
34+
private static class Compiling extends AbstractCompilingExpression {
35+
private final TypeID type;
36+
37+
public Compiling(ExpressionCompiler compiler, CodePosition position, TypeID type) {
38+
super(compiler, position);
39+
40+
this.type = type;
41+
}
42+
43+
@Override
44+
public Expression eval() {
45+
return compiler.at(position).getThis(type);
46+
}
47+
48+
@Override
49+
public CompilingExpression assign(CompilingExpression value) {
50+
return this;
51+
}
52+
53+
@Override
54+
public void collect(SSAVariableCollector collector) {}
55+
56+
@Override
57+
public void linkVariables(CodeBlockStatement.VariableLinker linker) {}
58+
}
59+
}

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/impl/compiler/ExpressionCompilerImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.openzen.zenscript.codemodel.compilation.*;
77
import org.openzen.zencode.shared.CodePosition;
88
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalExpression;
9+
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalThisExpression;
910
import org.openzen.zenscript.codemodel.expression.*;
1011
import org.openzen.zenscript.codemodel.globals.IGlobal;
1112
import org.openzen.zenscript.codemodel.identifiers.instances.FieldInstance;
@@ -56,6 +57,11 @@ public Optional<TypeID> getThisType() {
5657
return Optional.ofNullable(localType).map(LocalType::getThisType);
5758
}
5859

60+
@Override
61+
public Optional<CompilingExpression> getThis(CodePosition position) {
62+
return getThisType().map(thisType -> locals.capture(position, new LocalThisExpression(position, thisType)).compile(this));
63+
}
64+
5965
@Override
6066
public Optional<LocalType> getLocalType() {
6167
return Optional.ofNullable(localType);

CodeModel/src/main/java/org/openzen/zenscript/codemodel/compilation/impl/compiler/LocalSymbols.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
import org.openzen.zenscript.codemodel.FunctionParameter;
66
import org.openzen.zenscript.codemodel.compilation.CompilableExpression;
77
import org.openzen.zenscript.codemodel.compilation.CompilingVariable;
8-
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalExpression;
9-
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalParameterExpression;
10-
import org.openzen.zenscript.codemodel.compilation.impl.capture.LocalVariableExpression;
8+
import org.openzen.zenscript.codemodel.compilation.impl.capture.*;
119
import org.openzen.zenscript.codemodel.compilation.statement.CompilingLoopStatement;
1210
import org.openzen.zenscript.codemodel.expression.LambdaClosure;
11+
import org.openzen.zenscript.codemodel.type.TypeID;
1312

1413
import java.util.HashMap;
1514
import java.util.Map;
@@ -112,6 +111,15 @@ else if (closure != null)
112111
return parent.findLocalVariable(position, name);
113112
}
114113

114+
public LocalExpression capture(CodePosition position, LocalExpression local) {
115+
if (this.parent == null)
116+
return local;
117+
else if (closure != null)
118+
return local.capture(closure);
119+
else
120+
return parent.capture(position, local);
121+
}
122+
115123
public Optional<CompilableExpression> getDollar() {
116124
return Optional.ofNullable(dollar);
117125
}

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ public static int calcAccess(Modifiers modifiers) {
5858
}
5959

6060
public static void tagMethodParameters(JavaBytecodeContext context, JavaCompiledModule module, FunctionHeader header, boolean isStatic, List<TypeParameter> baseTypeTypeParameters) {
61-
int index = isStatic ? 0 : 1;
61+
int index = 0;
6262

6363
for (TypeParameter baseTypeTypeParameter : baseTypeTypeParameters) {
6464
module.setTypeParameterInfo(baseTypeTypeParameter, new JavaTypeParameterInfo(index));
6565
index++;
6666
}
6767

68+
if (!isStatic) index++;
69+
6870
for (int i = 0; i < header.typeParameters.length; i++) {
6971
TypeParameter parameter = header.typeParameters[i];
7072
module.setTypeParameterInfo(parameter, new JavaTypeParameterInfo(index));

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.openzen.zenscript.codemodel.CompareType;
99
import org.openzen.zenscript.codemodel.FunctionParameter;
1010
import org.openzen.zenscript.codemodel.OperatorType;
11+
import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
1112
import org.openzen.zenscript.codemodel.identifiers.MethodID;
1213
import org.openzen.zenscript.codemodel.identifiers.ModuleSymbol;
1314
import org.openzen.zenscript.codemodel.expression.*;
@@ -311,7 +312,13 @@ public Void visitCapturedParameter(CapturedParameterExpression expression) {
311312

312313
@Override
313314
public Void visitCapturedThis(CapturedThisExpression expression) {
314-
return expression.accept(capturedExpressionVisitor);
315+
// TODO - does this cover all situations?
316+
int thisLocal = 0;
317+
if (javaWriter.forDefinition instanceof ExpansionDefinition) {
318+
thisLocal = javaWriter.forDefinition.typeParameters.length;
319+
}
320+
javaWriter.load(context.getType(expression.type), thisLocal);
321+
return null;
315322
}
316323

317324
@Override
@@ -412,7 +419,7 @@ public Void visitConstantSByte(ConstantSByteExpression expression) {
412419

413420
@Override
414421
public Void visitConstantShort(ConstantShortExpression expression) {
415-
getJavaWriter().siPush(expression.value);
422+
getJavaWriter().constant(expression.value);
416423
return null;
417424
}
418425

@@ -564,12 +571,19 @@ public Void visitFunction(FunctionExpression expression) {
564571
for (CapturedExpression capture : expression.closure.captures) {
565572
constructorWriter.dup();
566573
Type type = context.getType(capture.type);
567-
lambdaCW.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE, "captured" + ++i, type.getDescriptor(), null, null).visitEnd();
574+
String name;
575+
++i;
576+
if (capture instanceof CapturedThisExpression) {
577+
name = "capturedThis";
578+
} else {
579+
name = "captured" + i;
580+
}
581+
lambdaCW.visitField(Opcodes.ACC_FINAL | Opcodes.ACC_PRIVATE, name, type.getDescriptor(), null, null).visitEnd();
568582

569583
capture.accept(this);
570584

571585
constructorWriter.load(type, i);
572-
constructorWriter.putField(className, "captured" + i, type.getDescriptor());
586+
constructorWriter.putField(className, name, type.getDescriptor());
573587
}
574588

575589
constructorWriter.pop();
@@ -595,7 +609,6 @@ public Void visitGetLocalVariable(GetLocalVariableExpression varExpression) {
595609
return null;
596610
}
597611

598-
599612
final int position = calculateMemberPosition(varExpression, expression);
600613
functionWriter.loadObject(0);
601614
functionWriter.getField(className, "captured" + position, context.getDescriptor(varExpression.variable.type));
@@ -609,6 +622,13 @@ public Void visitCapturedParameter(CapturedParameterExpression varExpression) {
609622
functionWriter.getField(className, "captured" + position, context.getDescriptor(varExpression.parameter.type));
610623
return null;
611624
}
625+
626+
@Override
627+
public Void visitCapturedThis(CapturedThisExpression expression) {
628+
functionWriter.loadObject(0);
629+
functionWriter.getField(className, "capturedThis", context.getDescriptor(expression.type));
630+
return null;
631+
}
612632
});
613633

614634
expression.body.accept(CSV);
@@ -1243,7 +1263,11 @@ public Void visitSubtypeCast(SubtypeCastExpression expression) {
12431263

12441264
@Override
12451265
public Void visitThis(ThisExpression expression) {
1246-
javaWriter.load(context.getType(expression.type), 0);
1266+
int thisLocal = 0;
1267+
if (javaWriter.forDefinition instanceof ExpansionDefinition) {
1268+
thisLocal = javaWriter.forDefinition.typeParameters.length;
1269+
}
1270+
javaWriter.load(context.getType(expression.type), thisLocal);
12471271
return null;
12481272
}
12491273

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo)
9898
ArrayTypeID listType = (ArrayTypeID) statement.list.type.withoutOptional();
9999
if (listType.elementType == BasicTypeID.BYTE) {
100100
javaWriter.arrayLoad(Type.BYTE_TYPE);
101-
javaWriter.siPush((short) 255);
101+
javaWriter.constant(0xFF);
102102
javaWriter.iAnd();
103103
} else if (listType.elementType == BasicTypeID.USHORT) {
104104
javaWriter.arrayLoad(Type.SHORT_TYPE);

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -165,16 +165,19 @@ public Void nativeConstructor(JavaNativeMethod method, TypeID type, CallArgument
165165

166166
@Override
167167
public Void nativeVirtualMethod(JavaNativeMethod method, TypeID returnType, Expression target, CallArguments arguments) {
168+
if (arguments.expansionTypeArguments.length > 0) {
169+
final JavaTypeExpressionVisitor javaTypeExpressionVisitor = new JavaTypeExpressionVisitor(context);
170+
for (int i = 0; i < arguments.expansionTypeArguments.length; i++) {
171+
arguments.expansionTypeArguments[i].accept(javaWriter, javaTypeExpressionVisitor);
172+
}
173+
}
168174
target.accept(expressionVisitor);
169175
return nativeStaticMethod(method, returnType, arguments);
170176
}
171177

172178
@Override
173179
public Void nativeStaticMethod(JavaNativeMethod method, TypeID returnType, CallArguments arguments) {
174180
handleArguments(arguments.typeArguments.length, method, arguments);
175-
if (method.compile) {
176-
handleTypeArguments(method, arguments);
177-
}
178181

179182
if (method.kind == JavaNativeMethod.Kind.STATIC) {
180183
javaWriter.invokeStatic(method);
@@ -205,14 +208,14 @@ public Void nativeStaticMethod(JavaNativeMethod method, TypeID returnType, CallA
205208
public Void nativeSpecialMethod(JavaNativeMethod method, TypeID returnType, Expression target, CallArguments arguments) {
206209
target.accept(expressionVisitor);
207210
handleArguments(arguments.typeArguments.length, method, arguments);
208-
if (method.compile) {
209-
handleTypeArguments(method, arguments);
210-
}
211211
javaWriter.invokeSpecial(method);
212212
return null;
213213
}
214214

215215
private void handleArguments(int typeArguments, JavaNativeMethod method, CallArguments arguments) {
216+
if (method.compile) {
217+
handleTypeArguments(method, arguments);
218+
}
216219
for (int index = 0; index < arguments.arguments.length; index++) {
217220
Expression argument = arguments.arguments[index];
218221
argument.accept(expressionVisitor);
@@ -227,9 +230,6 @@ private void handleTypeArguments(JavaNativeMethod method, CallArguments argument
227230
if (arguments.typeArguments.length != method.typeParameterArguments.length)
228231
throw new IllegalArgumentException("Number of type parameters doesn't match");
229232

230-
for (int i = 0; i < arguments.expansionTypeArguments.length; i++) {
231-
arguments.expansionTypeArguments[i].accept(javaWriter, javaTypeExpressionVisitor);
232-
}
233233
for (int i = 0; i < arguments.typeArguments.length; i++) {
234234
if (method.typeParameterArguments[i])
235235
arguments.typeArguments[i].accept(javaWriter, javaTypeExpressionVisitor);
@@ -335,7 +335,7 @@ public Void builtinStaticMethod(BuiltinMethodSymbol method, TypeID returnType, C
335335
case BYTE_ADD_STRING:
336336
case BYTE_CAT_STRING:
337337
arguments[0].accept(expressionVisitor);
338-
javaWriter.siPush((short) 0xFF);
338+
javaWriter.constant(0xFF);
339339
javaWriter.iAnd();
340340
javaWriter.invokeStatic(INTEGER_TO_STRING);
341341
arguments[1].accept(expressionVisitor);
@@ -570,42 +570,42 @@ public Void builtinStaticMethod(BuiltinMethodSymbol method, TypeID returnType, C
570570
javaWriter.i2b();
571571
break;
572572
case BYTE_TO_SHORT:
573-
javaWriter.siPush((short) 0xFF);
573+
javaWriter.constant(0xFF);
574574
javaWriter.iAnd();
575575
javaWriter.i2s();
576576
break;
577577
case BYTE_TO_USHORT:
578578
case BYTE_TO_INT:
579579
case BYTE_TO_UINT:
580580
case BYTE_TO_USIZE:
581-
javaWriter.siPush((short) 0xFF);
581+
javaWriter.constant(0xFF);
582582
javaWriter.iAnd();
583583
break;
584584
case BYTE_TO_LONG:
585585
case BYTE_TO_ULONG:
586-
javaWriter.siPush((short) 0xFF);
586+
javaWriter.constant(0xFF);
587587
javaWriter.iAnd();
588588
javaWriter.i2l();
589589
break;
590590
case BYTE_TO_FLOAT:
591-
javaWriter.siPush((short) 0xFF);
591+
javaWriter.constant(0xFF);
592592
javaWriter.iAnd();
593593
javaWriter.i2f();
594594
break;
595595
case BYTE_TO_DOUBLE:
596-
javaWriter.siPush((short) 0xFF);
596+
javaWriter.constant(0xFF);
597597
javaWriter.iAnd();
598598
javaWriter.i2d();
599599
break;
600600
case BYTE_TO_CHAR:
601-
javaWriter.siPush((short) 0xFF);
601+
javaWriter.constant(0xFF);
602602
javaWriter.iAnd();
603603
break;
604604
case BYTE_TO_STRING:
605605
if (arguments[0].type.isOptional()) {
606606
javaWriter.invokeStatic(OBJECTS_TOSTRING);
607607
} else {
608-
javaWriter.siPush((short) 0xFF);
608+
javaWriter.constant(0xFF);
609609
javaWriter.iAnd();
610610
javaWriter.invokeStatic(INTEGER_TO_STRING);
611611
}

0 commit comments

Comments
 (0)