Procházet zdrojové kódy

Properly implement expressions without return value. Also fixed some bugs in expressions that do return a values. Also added a position to the JavaWriter for easier debugging.

Stan Hebben před 6 roky
rodič
revize
3633ce97d7

+ 2
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeContext.java Zobrazit soubor

@@ -8,6 +8,7 @@ package org.openzen.zenscript.javabytecode;
8 8
 import org.objectweb.asm.ClassWriter;
9 9
 import org.objectweb.asm.Opcodes;
10 10
 import org.objectweb.asm.Type;
11
+import org.openzen.zencode.shared.CodePosition;
11 12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
12 13
 import org.openzen.zenscript.codemodel.type.StoredType;
13 14
 import org.openzen.zenscript.codemodel.type.TypeID;
@@ -101,7 +102,7 @@ public class JavaBytecodeContext extends JavaContext {
101 102
 		rangeWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "to", getDescriptor(range.baseType), null, null).visitEnd();
102 103
 		
103 104
 		JavaMethod method = JavaMethod.getConstructor(range.cls, "(" + getDescriptor(range.baseType) + getDescriptor(range.baseType) + ")V", Opcodes.ACC_PUBLIC);
104
-		JavaWriter constructorWriter = new JavaWriter(rangeWriter, method, null, method.descriptor, null);
105
+		JavaWriter constructorWriter = new JavaWriter(CodePosition.GENERATED, rangeWriter, method, null, method.descriptor, null);
105 106
 		constructorWriter.loadObject(0);
106 107
 		constructorWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
107 108
 		constructorWriter.loadObject(0);

+ 2
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunUnit.java Zobrazit soubor

@@ -17,6 +17,7 @@ import java.util.logging.Level;
17 17
 import java.util.logging.Logger;
18 18
 import org.objectweb.asm.ClassWriter;
19 19
 import org.objectweb.asm.Opcodes;
20
+import org.openzen.zencode.shared.CodePosition;
20 21
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
21 22
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
22 23
 import org.openzen.zenscript.javashared.JavaClass;
@@ -77,7 +78,7 @@ public class JavaBytecodeRunUnit {
77 78
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
78 79
 		
79 80
 		JavaMethod runMethod = JavaMethod.getStatic(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
80
-		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
81
+		final JavaWriter runWriter = new JavaWriter(CodePosition.GENERATED, scriptsClassWriter, runMethod, null, null, null);
81 82
 		runWriter.start();
82 83
 		for (JavaMethod method : scripts)
83 84
 			runWriter.invokeStatic(method);

+ 2
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java Zobrazit soubor

@@ -9,6 +9,7 @@ import java.util.HashMap;
9 9
 import java.util.Map;
10 10
 import org.objectweb.asm.ClassWriter;
11 11
 import org.objectweb.asm.Opcodes;
12
+import org.openzen.zencode.shared.CodePosition;
12 13
 import org.openzen.zencode.shared.SourceFile;
13 14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
14 15
 import org.openzen.zenscript.codemodel.ScriptBlock;
@@ -73,7 +74,7 @@ public class JavaCompiler {
73 74
 			JavaMethod method = JavaMethod.getStatic(new JavaClass(context.getPackageName(script.pkg), className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
74 75
 			scriptFile.scriptMethods.add(method);
75 76
 
76
-			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(visitor, method, null, null, null));
77
+			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(CodePosition.UNKNOWN, visitor, method, null, null, null));
77 78
 			statementVisitor.start();
78 79
 			for (Statement statement : script.statements) {
79 80
 				statement.accept(statementVisitor);

+ 10
- 30
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java Zobrazit soubor

@@ -1746,36 +1746,12 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
1746 1746
 
1747 1747
 	@Override
1748 1748
 	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
1749
-		javaWriter.loadObject(0);
1750
-		if (javaWriter.method.cls.isEnum()) {
1751
-			javaWriter.loadObject(1);
1752
-			javaWriter.loadInt(2);
1753
-		}
1754
-
1755
-		for (Expression argument : expression.arguments.arguments) {
1756
-			argument.accept(this);
1757
-		}
1758
-		String internalName = context.getInternalName(expression.objectType);
1759
-		javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.cls.isEnum()
1760
-				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
1761
-				: context.getMethodDescriptor(expression.constructor.getHeader()));
1762
-		return null;
1749
+		throw new UnsupportedOperationException("Invalid usage");
1763 1750
 	}
1764 1751
 
1765 1752
 	@Override
1766 1753
 	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
1767
-		javaWriter.loadObject(0);
1768
-		for (Expression argument : expression.arguments.arguments) {
1769
-			argument.accept(this);
1770
-		}
1771
-		//No super calls in enums possible, and that's already handled in the enum constructor itself.
1772
-		javaWriter.invokeSpecial(
1773
-				context.getInternalName(expression.objectType),
1774
-				"<init>",
1775
-				context.getMethodDescriptor(expression.constructor.getHeader()));
1776
-
1777
-		CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, javaWriter.forDefinition, false);
1778
-		return null;
1754
+		throw new UnsupportedOperationException("Invalid usage");
1779 1755
 	}
1780 1756
 
1781 1757
 	@Override
@@ -1801,7 +1777,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
1801 1777
 		final JavaMethod methodInfo = JavaMethod.getNativeVirtual(javaWriter.method.cls, "accept", descriptor);
1802 1778
 		final ClassWriter lambdaCW = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
1803 1779
 		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{context.getInternalName(new FunctionTypeID(null, expression.header).stored(UniqueStorageTag.INSTANCE))});
1804
-		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1780
+		final JavaWriter functionWriter = new JavaWriter(expression.position, lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1805 1781
 
1806 1782
 		javaWriter.newObject(name);
1807 1783
 		javaWriter.dup();
@@ -1809,7 +1785,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
1809 1785
 		final String constructorDesc = calcFunctionSignature(expression.closure);
1810 1786
 
1811 1787
 
1812
-		final JavaWriter constructorWriter = new JavaWriter(lambdaCW, JavaMethod.getConstructor(javaWriter.method.cls, constructorDesc, Opcodes.ACC_PUBLIC), null, null, null);
1788
+		final JavaWriter constructorWriter = new JavaWriter(expression.position, lambdaCW, JavaMethod.getConstructor(javaWriter.method.cls, constructorDesc, Opcodes.ACC_PUBLIC), null, null, null);
1813 1789
 		constructorWriter.start();
1814 1790
 		constructorWriter.loadObject(0);
1815 1791
 		constructorWriter.dup();
@@ -3488,6 +3464,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
3488 3464
 						javaWriter.constant(255);
3489 3465
 						javaWriter.iAnd();
3490 3466
 					}, PushOption.BEFORE);
3467
+					return null;
3491 3468
 				case SBYTE_INC:
3492 3469
 					modify(expression.target, () -> {
3493 3470
 						javaWriter.iConst1();
@@ -3648,8 +3625,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
3648 3625
 
3649 3626
 	@Override
3650 3627
 	public Void visitSetField(SetFieldExpression expression) {
3651
-		expression.target.accept(this);
3652 3628
 		expression.value.accept(this);
3629
+		expression.target.accept(this);
3630
+		javaWriter.dupX1(false, CompilerUtils.isLarge(expression.type));
3653 3631
 		putField(expression.field);
3654 3632
 		return null;
3655 3633
 	}
@@ -3657,6 +3635,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
3657 3635
 	@Override
3658 3636
 	public Void visitSetFunctionParameter(SetFunctionParameterExpression expression) {
3659 3637
 		expression.value.accept(this);
3638
+		javaWriter.dup(CompilerUtils.isLarge(expression.value.type));
3660 3639
 		JavaParameterInfo parameter = module.getParameterInfo(expression.parameter);
3661 3640
 		javaWriter.store(context.getType(expression.type), parameter.index);
3662 3641
 		return null;
@@ -3670,14 +3649,15 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
3670 3649
 		final JavaLocalVariableInfo tag = javaWriter.getLocalVariable(expression.variable.variable);
3671 3650
 		tag.end = label;
3672 3651
 
3652
+		javaWriter.dup(CompilerUtils.isLarge(expression.value.type));
3673 3653
 		javaWriter.store(tag.type, tag.local);
3674
-
3675 3654
 		return null;
3676 3655
 	}
3677 3656
 
3678 3657
 	@Override
3679 3658
 	public Void visitSetStaticField(SetStaticFieldExpression expression) {
3680 3659
 		expression.value.accept(this);
3660
+		javaWriter.dup(CompilerUtils.isLarge(expression.value.type));
3681 3661
 		javaWriter.putStaticField(context.getJavaField(expression.field));
3682 3662
 		return null;
3683 3663
 	}

+ 686
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaNonPushingExpressionVisitor.java Zobrazit soubor

@@ -0,0 +1,686 @@
1
+/*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+package org.openzen.zenscript.javabytecode.compiler;
7
+
8
+import org.objectweb.asm.Label;
9
+import org.openzen.zenscript.codemodel.expression.AndAndExpression;
10
+import org.openzen.zenscript.codemodel.expression.ArrayExpression;
11
+import org.openzen.zenscript.codemodel.expression.CallExpression;
12
+import org.openzen.zenscript.codemodel.expression.CallStaticExpression;
13
+import org.openzen.zenscript.codemodel.expression.CapturedClosureExpression;
14
+import org.openzen.zenscript.codemodel.expression.CapturedDirectExpression;
15
+import org.openzen.zenscript.codemodel.expression.CapturedLocalVariableExpression;
16
+import org.openzen.zenscript.codemodel.expression.CapturedParameterExpression;
17
+import org.openzen.zenscript.codemodel.expression.CapturedThisExpression;
18
+import org.openzen.zenscript.codemodel.expression.CastExpression;
19
+import org.openzen.zenscript.codemodel.expression.CheckNullExpression;
20
+import org.openzen.zenscript.codemodel.expression.CoalesceExpression;
21
+import org.openzen.zenscript.codemodel.expression.CompareExpression;
22
+import org.openzen.zenscript.codemodel.expression.ConditionalExpression;
23
+import org.openzen.zenscript.codemodel.expression.ConstExpression;
24
+import org.openzen.zenscript.codemodel.expression.ConstantBoolExpression;
25
+import org.openzen.zenscript.codemodel.expression.ConstantByteExpression;
26
+import org.openzen.zenscript.codemodel.expression.ConstantCharExpression;
27
+import org.openzen.zenscript.codemodel.expression.ConstantDoubleExpression;
28
+import org.openzen.zenscript.codemodel.expression.ConstantFloatExpression;
29
+import org.openzen.zenscript.codemodel.expression.ConstantIntExpression;
30
+import org.openzen.zenscript.codemodel.expression.ConstantLongExpression;
31
+import org.openzen.zenscript.codemodel.expression.ConstantSByteExpression;
32
+import org.openzen.zenscript.codemodel.expression.ConstantShortExpression;
33
+import org.openzen.zenscript.codemodel.expression.ConstantStringExpression;
34
+import org.openzen.zenscript.codemodel.expression.ConstantUIntExpression;
35
+import org.openzen.zenscript.codemodel.expression.ConstantULongExpression;
36
+import org.openzen.zenscript.codemodel.expression.ConstantUShortExpression;
37
+import org.openzen.zenscript.codemodel.expression.ConstantUSizeExpression;
38
+import org.openzen.zenscript.codemodel.expression.ConstructorSuperCallExpression;
39
+import org.openzen.zenscript.codemodel.expression.ConstructorThisCallExpression;
40
+import org.openzen.zenscript.codemodel.expression.EnumConstantExpression;
41
+import org.openzen.zenscript.codemodel.expression.Expression;
42
+import org.openzen.zenscript.codemodel.expression.ExpressionVisitor;
43
+import org.openzen.zenscript.codemodel.expression.FunctionExpression;
44
+import org.openzen.zenscript.codemodel.expression.GetFieldExpression;
45
+import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
46
+import org.openzen.zenscript.codemodel.expression.GetLocalVariableExpression;
47
+import org.openzen.zenscript.codemodel.expression.GetMatchingVariantField;
48
+import org.openzen.zenscript.codemodel.expression.GetStaticFieldExpression;
49
+import org.openzen.zenscript.codemodel.expression.GetterExpression;
50
+import org.openzen.zenscript.codemodel.expression.GlobalCallExpression;
51
+import org.openzen.zenscript.codemodel.expression.GlobalExpression;
52
+import org.openzen.zenscript.codemodel.expression.InterfaceCastExpression;
53
+import org.openzen.zenscript.codemodel.expression.IsExpression;
54
+import org.openzen.zenscript.codemodel.expression.MakeConstExpression;
55
+import org.openzen.zenscript.codemodel.expression.MapExpression;
56
+import org.openzen.zenscript.codemodel.expression.MatchExpression;
57
+import org.openzen.zenscript.codemodel.expression.NewExpression;
58
+import org.openzen.zenscript.codemodel.expression.NullExpression;
59
+import org.openzen.zenscript.codemodel.expression.OrOrExpression;
60
+import org.openzen.zenscript.codemodel.expression.PanicExpression;
61
+import org.openzen.zenscript.codemodel.expression.PostCallExpression;
62
+import org.openzen.zenscript.codemodel.expression.RangeExpression;
63
+import org.openzen.zenscript.codemodel.expression.SameObjectExpression;
64
+import org.openzen.zenscript.codemodel.expression.SetFieldExpression;
65
+import org.openzen.zenscript.codemodel.expression.SetFunctionParameterExpression;
66
+import org.openzen.zenscript.codemodel.expression.SetLocalVariableExpression;
67
+import org.openzen.zenscript.codemodel.expression.SetStaticFieldExpression;
68
+import org.openzen.zenscript.codemodel.expression.SetterExpression;
69
+import org.openzen.zenscript.codemodel.expression.StaticGetterExpression;
70
+import org.openzen.zenscript.codemodel.expression.StaticSetterExpression;
71
+import org.openzen.zenscript.codemodel.expression.StorageCastExpression;
72
+import org.openzen.zenscript.codemodel.expression.SupertypeCastExpression;
73
+import org.openzen.zenscript.codemodel.expression.ThisExpression;
74
+import org.openzen.zenscript.codemodel.expression.ThrowExpression;
75
+import org.openzen.zenscript.codemodel.expression.TryConvertExpression;
76
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsExceptionExpression;
77
+import org.openzen.zenscript.codemodel.expression.TryRethrowAsResultExpression;
78
+import org.openzen.zenscript.codemodel.expression.VariantValueExpression;
79
+import org.openzen.zenscript.codemodel.expression.WrapOptionalExpression;
80
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
81
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
82
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
83
+import org.openzen.zenscript.javabytecode.JavaBytecodeModule;
84
+import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
85
+import org.openzen.zenscript.javabytecode.compiler.JavaModificationExpressionVisitor.PushOption;
86
+import org.openzen.zenscript.javashared.JavaCompiledModule;
87
+import org.openzen.zenscript.javashared.JavaParameterInfo;
88
+
89
+/**
90
+ *
91
+ * @author Hoofdgebruiker
92
+ */
93
+public class JavaNonPushingExpressionVisitor implements ExpressionVisitor<Void> {
94
+	private final JavaBytecodeContext context;
95
+	private final JavaCompiledModule module;
96
+	private final JavaWriter javaWriter;
97
+	private final JavaExpressionVisitor original;
98
+	
99
+	public JavaNonPushingExpressionVisitor(JavaBytecodeContext context, JavaCompiledModule module, JavaWriter javaWriter, JavaExpressionVisitor original) {
100
+		this.context = context;
101
+		this.module = module;
102
+		this.javaWriter = javaWriter;
103
+		this.original = original;
104
+	}
105
+
106
+	@Override
107
+	public Void visitAndAnd(AndAndExpression expression) {
108
+		Label end = new Label();
109
+		expression.left.accept(original);
110
+		javaWriter.ifEQ(end);
111
+		expression.right.accept(this);
112
+		javaWriter.label(end);
113
+		return null;
114
+	}
115
+	
116
+	private void fallback(Expression expression) {
117
+		expression.accept(original);
118
+		if (expression.type.type != BasicTypeID.VOID)
119
+			javaWriter.pop(CompilerUtils.isLarge(expression.type));
120
+	}
121
+	
122
+	private void modify(Expression source, Runnable modification) {
123
+		source.accept(new JavaModificationExpressionVisitor(context, module, javaWriter, original, modification, PushOption.NONE));
124
+	}
125
+	
126
+	private boolean compileIncrementOrDecrement(Expression target, BuiltinID builtin) {
127
+		if (builtin == null)
128
+			return false;
129
+		
130
+		switch (builtin) {
131
+			case BYTE_INC:
132
+				modify(target, () -> {
133
+					javaWriter.iConst1();
134
+					javaWriter.iAdd();
135
+					javaWriter.constant(255);
136
+					javaWriter.iAnd();
137
+				});
138
+				return true;
139
+			case BYTE_DEC:
140
+				modify(target, () -> {
141
+					javaWriter.iConst1();
142
+					javaWriter.iSub();
143
+					javaWriter.constant(255);
144
+					javaWriter.iAnd();
145
+				});
146
+				return true;
147
+			case SBYTE_INC:
148
+				modify(target, () -> {
149
+					javaWriter.iConst1();
150
+					javaWriter.iAdd();
151
+					javaWriter.i2b();
152
+				});
153
+				return true;
154
+			case SBYTE_DEC:
155
+				modify(target, () -> {
156
+					javaWriter.iConst1();
157
+					javaWriter.iSub();
158
+					javaWriter.i2b();
159
+				});
160
+				return true;
161
+			case SHORT_INC:
162
+				modify(target, () -> {
163
+					javaWriter.iConst1();
164
+					javaWriter.iAdd();
165
+					javaWriter.i2s();
166
+				});
167
+				return true;
168
+			case SHORT_DEC:
169
+				modify(target, () -> {
170
+					javaWriter.iConst1();
171
+					javaWriter.iSub();
172
+					javaWriter.i2s();
173
+				});
174
+				return true;
175
+			case USHORT_INC:
176
+				modify(target, () -> {
177
+					javaWriter.iConst1();
178
+					javaWriter.iAdd();
179
+					javaWriter.constant(0xFFFF);
180
+					javaWriter.iAnd();
181
+				});
182
+				return true;
183
+			case USHORT_DEC:
184
+				modify(target, () -> {
185
+					javaWriter.iConst1();
186
+					javaWriter.iSub();
187
+					javaWriter.constant(0xFFFF);
188
+					javaWriter.iAnd();
189
+				});
190
+				return true;
191
+			case INT_INC:
192
+			case UINT_INC:
193
+			case USIZE_INC:
194
+				if (target instanceof GetLocalVariableExpression) {
195
+					JavaLocalVariableInfo local = javaWriter.getLocalVariable(((GetLocalVariableExpression)target).variable.variable);
196
+					javaWriter.iinc(local.local);
197
+				} else {
198
+					modify(target, () -> {
199
+						javaWriter.iConst1();
200
+						javaWriter.iAdd();
201
+					});
202
+				}
203
+				return true;
204
+			case INT_DEC:
205
+			case UINT_DEC:
206
+			case USIZE_DEC:
207
+				if (target instanceof GetLocalVariableExpression) {
208
+					JavaLocalVariableInfo local = javaWriter.getLocalVariable(((GetLocalVariableExpression)target).variable.variable);
209
+					javaWriter.iinc(local.local, -1);
210
+				} else {
211
+					modify(target, () -> {
212
+						javaWriter.iConst1();
213
+						javaWriter.iSub();
214
+					});
215
+				}
216
+				return true;
217
+			case LONG_INC:
218
+			case ULONG_INC:
219
+				modify(target, () -> {
220
+					javaWriter.constant(1l);
221
+					javaWriter.lAdd();
222
+				});
223
+				return true;
224
+			case LONG_DEC:
225
+			case ULONG_DEC:
226
+				modify(target, () -> {
227
+					javaWriter.constant(1l);
228
+					javaWriter.lSub();
229
+				});
230
+				return true;
231
+			case FLOAT_INC:
232
+				modify(target, () -> {
233
+					javaWriter.constant(1f);
234
+					javaWriter.fAdd();
235
+				});
236
+				return true;
237
+			case FLOAT_DEC:
238
+				modify(target, () -> {
239
+					javaWriter.constant(1f);
240
+					javaWriter.fSub();
241
+				});
242
+				return true;
243
+			case DOUBLE_INC:
244
+				modify(target, () -> {
245
+					javaWriter.constant(1d);
246
+					javaWriter.dAdd();
247
+				});
248
+				return true;
249
+			case DOUBLE_DEC:
250
+				modify(target, () -> {
251
+					javaWriter.constant(1d);
252
+					javaWriter.dSub();
253
+				});
254
+				return true;
255
+			default:
256
+				return false;
257
+		}
258
+	}
259
+
260
+	@Override
261
+	public Void visitArray(ArrayExpression expression) {
262
+		for (Expression value : expression.expressions)
263
+			value.accept(this);
264
+		
265
+		return null;
266
+	}
267
+
268
+	@Override
269
+	public Void visitCompare(CompareExpression expression) {
270
+		expression.left.accept(this);
271
+		expression.right.accept(this);
272
+		return null;
273
+	}
274
+
275
+	@Override
276
+	public Void visitCall(CallExpression expression) {
277
+		if (!compileIncrementOrDecrement(expression.target, expression.member.getBuiltin()))
278
+			fallback(expression);
279
+		
280
+		return null;
281
+	}
282
+
283
+	@Override
284
+	public Void visitCallStatic(CallStaticExpression expression) {
285
+		fallback(expression);
286
+		return null;
287
+	}
288
+
289
+	@Override
290
+	public Void visitCapturedClosure(CapturedClosureExpression expression) {
291
+		return expression.value.accept(this);
292
+	}
293
+
294
+	@Override
295
+	public Void visitCapturedDirect(CapturedDirectExpression expression) {
296
+		return expression.value.accept(this);
297
+	}
298
+
299
+	@Override
300
+	public Void visitCapturedLocalVariable(CapturedLocalVariableExpression expression) {
301
+		return null;
302
+	}
303
+
304
+	@Override
305
+	public Void visitCapturedParameter(CapturedParameterExpression expression) {
306
+		return null;
307
+	}
308
+
309
+	@Override
310
+	public Void visitCapturedThis(CapturedThisExpression expression) {
311
+		return null;
312
+	}
313
+
314
+	@Override
315
+	public Void visitCast(CastExpression expression) {
316
+		return expression.target.accept(this);
317
+	}
318
+
319
+	@Override
320
+	public Void visitCheckNull(CheckNullExpression expression) {
321
+		return expression.value.accept(this);
322
+	}
323
+
324
+	@Override
325
+	public Void visitCoalesce(CoalesceExpression expression) {
326
+		final Label end = new Label();
327
+		expression.left.accept(original);
328
+		javaWriter.ifNonNull(end);
329
+		expression.right.accept(this);
330
+		javaWriter.label(end);
331
+		return null;
332
+	}
333
+
334
+	@Override
335
+	public Void visitConditional(ConditionalExpression expression) {
336
+		final Label end = new Label();
337
+		final Label onElse = new Label();
338
+		expression.condition.accept(original);
339
+		javaWriter.ifEQ(onElse);
340
+		expression.ifThen.accept(this);
341
+		javaWriter.goTo(end);
342
+		javaWriter.label(onElse);
343
+		expression.ifElse.accept(this);
344
+		javaWriter.label(end);
345
+		return null;
346
+	}
347
+
348
+	@Override
349
+	public Void visitConst(ConstExpression expression) {
350
+		return null;
351
+	}
352
+
353
+	@Override
354
+	public Void visitConstantBool(ConstantBoolExpression expression) {
355
+		return null;
356
+	}
357
+
358
+	@Override
359
+	public Void visitConstantByte(ConstantByteExpression expression) {
360
+		return null;
361
+	}
362
+
363
+	@Override
364
+	public Void visitConstantChar(ConstantCharExpression expression) {
365
+		return null;
366
+	}
367
+
368
+	@Override
369
+	public Void visitConstantDouble(ConstantDoubleExpression expression) {
370
+		return null;
371
+	}
372
+
373
+	@Override
374
+	public Void visitConstantFloat(ConstantFloatExpression expression) {
375
+		return null;
376
+	}
377
+
378
+	@Override
379
+	public Void visitConstantInt(ConstantIntExpression expression) {
380
+		return null;
381
+	}
382
+
383
+	@Override
384
+	public Void visitConstantLong(ConstantLongExpression expression) {
385
+		return null;
386
+	}
387
+
388
+	@Override
389
+	public Void visitConstantSByte(ConstantSByteExpression expression) {
390
+		return null;
391
+	}
392
+
393
+	@Override
394
+	public Void visitConstantShort(ConstantShortExpression expression) {
395
+		return null;
396
+	}
397
+
398
+	@Override
399
+	public Void visitConstantString(ConstantStringExpression expression) {
400
+		return null;
401
+	}
402
+
403
+	@Override
404
+	public Void visitConstantUInt(ConstantUIntExpression expression) {
405
+		return null;
406
+	}
407
+
408
+	@Override
409
+	public Void visitConstantULong(ConstantULongExpression expression) {
410
+		return null;
411
+	}
412
+
413
+	@Override
414
+	public Void visitConstantUShort(ConstantUShortExpression expression) {
415
+		return null;
416
+	}
417
+
418
+	@Override
419
+	public Void visitConstantUSize(ConstantUSizeExpression expression) {
420
+		return null;
421
+	}
422
+
423
+	@Override
424
+	public Void visitConstructorThisCall(ConstructorThisCallExpression expression) {
425
+		javaWriter.loadObject(0);
426
+		if (javaWriter.method.cls.isEnum()) {
427
+			javaWriter.loadObject(1);
428
+			javaWriter.loadInt(2);
429
+		}
430
+
431
+		for (Expression argument : expression.arguments.arguments) {
432
+			argument.accept(this);
433
+		}
434
+		String internalName = context.getInternalName(expression.objectType);
435
+		javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.cls.isEnum()
436
+				? context.getEnumConstructorDescriptor(expression.constructor.getHeader())
437
+				: context.getMethodDescriptor(expression.constructor.getHeader()));
438
+		return null;
439
+	}
440
+
441
+	@Override
442
+	public Void visitConstructorSuperCall(ConstructorSuperCallExpression expression) {
443
+		javaWriter.loadObject(0);
444
+		for (Expression argument : expression.arguments.arguments) {
445
+			argument.accept(this);
446
+		}
447
+		//No super calls in enums possible, and that's already handled in the enum constructor itself.
448
+		javaWriter.invokeSpecial(
449
+				context.getInternalName(expression.objectType),
450
+				"<init>",
451
+				context.getMethodDescriptor(expression.constructor.getHeader()));
452
+
453
+		CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, javaWriter.forDefinition, false);
454
+		return null;
455
+	}
456
+
457
+	@Override
458
+	public Void visitEnumConstant(EnumConstantExpression expression) {
459
+		return null;
460
+	}
461
+
462
+	@Override
463
+	public Void visitFunction(FunctionExpression expression) {
464
+		return null;
465
+	}
466
+
467
+	@Override
468
+	public Void visitGetField(GetFieldExpression expression) {
469
+		return expression.target.accept(this);
470
+	}
471
+
472
+	@Override
473
+	public Void visitGetFunctionParameter(GetFunctionParameterExpression expression) {
474
+		return null;
475
+	}
476
+
477
+	@Override
478
+	public Void visitGetLocalVariable(GetLocalVariableExpression expression) {
479
+		return null;
480
+	}
481
+
482
+	@Override
483
+	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
484
+		fallback(expression);
485
+		return null;
486
+	}
487
+
488
+	@Override
489
+	public Void visitGetStaticField(GetStaticFieldExpression expression) {
490
+		return null;
491
+	}
492
+
493
+	@Override
494
+	public Void visitGetter(GetterExpression expression) {
495
+		return expression.target.accept(this);
496
+	}
497
+
498
+	@Override
499
+	public Void visitGlobal(GlobalExpression expression) {
500
+		return null;
501
+	}
502
+
503
+	@Override
504
+	public Void visitGlobalCall(GlobalCallExpression expression) {
505
+		fallback(expression);
506
+		return null;
507
+	}
508
+
509
+	@Override
510
+	public Void visitInterfaceCast(InterfaceCastExpression expression) {
511
+		return expression.value.accept(this);
512
+	}
513
+
514
+	@Override
515
+	public Void visitIs(IsExpression expression) {
516
+		return expression.value.accept(this);
517
+	}
518
+
519
+	@Override
520
+	public Void visitMakeConst(MakeConstExpression expression) {
521
+		return expression.value.accept(this);
522
+	}
523
+
524
+	@Override
525
+	public Void visitMap(MapExpression expression) {
526
+		fallback(expression);
527
+		return null;
528
+	}
529
+
530
+	@Override
531
+	public Void visitMatch(MatchExpression expression) {
532
+		fallback(expression);
533
+		return null;
534
+	}
535
+
536
+	@Override
537
+	public Void visitNew(NewExpression expression) {
538
+		fallback(expression);
539
+		return null;
540
+	}
541
+
542
+	@Override
543
+	public Void visitNull(NullExpression expression) {
544
+		return null;
545
+	}
546
+
547
+	@Override
548
+	public Void visitOrOr(OrOrExpression expression) {
549
+		Label end = new Label();
550
+		expression.left.accept(original);
551
+		javaWriter.ifNE(end);
552
+		expression.right.accept(this);
553
+		javaWriter.label(end);
554
+		return null;
555
+	}
556
+
557
+	@Override
558
+	public Void visitPanic(PanicExpression expression) {
559
+		javaWriter.newObject("java/lang/AssertionError");
560
+		javaWriter.dup();
561
+		expression.value.accept(this);
562
+		javaWriter.invokeSpecial(AssertionError.class, "<init>", "(Ljava/lang/String;)V");
563
+		javaWriter.aThrow();
564
+		return null;
565
+	}
566
+
567
+	@Override
568
+	public Void visitPostCall(PostCallExpression expression) {
569
+		if (!compileIncrementOrDecrement(expression.target, expression.member.getBuiltin()))
570
+			fallback(expression);
571
+		
572
+		return null;
573
+	}
574
+
575
+	@Override
576
+	public Void visitRange(RangeExpression expression) {
577
+		expression.from.accept(this);
578
+		expression.to.accept(this);
579
+		return null;
580
+	}
581
+
582
+	@Override
583
+	public Void visitSameObject(SameObjectExpression expression) {
584
+		expression.left.accept(this);
585
+		expression.right.accept(this);
586
+		return null;
587
+	}
588
+
589
+	@Override
590
+	public Void visitSetField(SetFieldExpression expression) {
591
+		expression.target.accept(original);
592
+		expression.value.accept(original);
593
+		original.putField(expression.field);
594
+		return null;
595
+	}
596
+
597
+	@Override
598
+	public Void visitSetFunctionParameter(SetFunctionParameterExpression expression) {
599
+		expression.value.accept(original);
600
+		JavaParameterInfo parameter = module.getParameterInfo(expression.parameter);
601
+		javaWriter.store(context.getType(expression.type), parameter.index);
602
+		return null;
603
+	}
604
+
605
+	@Override
606
+	public Void visitSetLocalVariable(SetLocalVariableExpression expression) {
607
+		expression.value.accept(original);
608
+		Label label = new Label();
609
+		javaWriter.label(label);
610
+		final JavaLocalVariableInfo tag = javaWriter.getLocalVariable(expression.variable.variable);
611
+		tag.end = label;
612
+
613
+		javaWriter.store(tag.type, tag.local);
614
+		return null;
615
+	}
616
+
617
+	@Override
618
+	public Void visitSetStaticField(SetStaticFieldExpression expression) {
619
+		expression.value.accept(original);
620
+		javaWriter.putStaticField(context.getJavaField(expression.field));
621
+		return null;
622
+	}
623
+
624
+	@Override
625
+	public Void visitSetter(SetterExpression expression) {
626
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
627
+	}
628
+
629
+	@Override
630
+	public Void visitStaticGetter(StaticGetterExpression expression) {
631
+		return null;
632
+	}
633
+
634
+	@Override
635
+	public Void visitStaticSetter(StaticSetterExpression expression) {
636
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
637
+	}
638
+
639
+	@Override
640
+	public Void visitStorageCast(StorageCastExpression expression) {
641
+		return expression.value.accept(this);
642
+	}
643
+
644
+	@Override
645
+	public Void visitSupertypeCast(SupertypeCastExpression expression) {
646
+		return expression.value.accept(this);
647
+	}
648
+
649
+	@Override
650
+	public Void visitThis(ThisExpression expression) {
651
+		return null;
652
+	}
653
+
654
+	@Override
655
+	public Void visitThrow(ThrowExpression expression) {
656
+		expression.value.accept(this);
657
+		javaWriter.aThrow();
658
+		return null;
659
+	}
660
+
661
+	@Override
662
+	public Void visitTryConvert(TryConvertExpression expression) {
663
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
664
+	}
665
+
666
+	@Override
667
+	public Void visitTryRethrowAsException(TryRethrowAsExceptionExpression expression) {
668
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
669
+	}
670
+
671
+	@Override
672
+	public Void visitTryRethrowAsResult(TryRethrowAsResultExpression expression) {
673
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
674
+	}
675
+
676
+	@Override
677
+	public Void visitVariantValue(VariantValueExpression expression) {
678
+		fallback(expression);
679
+		return null;
680
+	}
681
+
682
+	@Override
683
+	public Void visitWrapOptional(WrapOptionalExpression expression) {
684
+		return expression.value.accept(this);
685
+	}
686
+}

+ 3
- 6
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java Zobrazit soubor

@@ -16,6 +16,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
16 16
     private final JavaWriter javaWriter;
17 17
 	private final JavaBytecodeContext context;
18 18
     public JavaExpressionVisitor expressionVisitor;
19
+	public JavaNonPushingExpressionVisitor nonPushingExpressionVisitor;
19 20
 
20 21
     /**
21 22
      * @param javaWriter the method writer that compiles the statement
@@ -24,6 +25,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
24 25
         this.javaWriter = javaWriter;
25 26
 		this.context = context;
26 27
         this.expressionVisitor = new JavaExpressionVisitor(context, module, javaWriter);
28
+		nonPushingExpressionVisitor = new JavaNonPushingExpressionVisitor(context, module, javaWriter, expressionVisitor);
27 29
     }
28 30
 
29 31
     public JavaStatementVisitor(JavaBytecodeContext context, JavaExpressionVisitor expressionVisitor) {
@@ -80,12 +82,7 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
80 82
 
81 83
 	@Override
82 84
 	public Boolean visitExpression(ExpressionStatement statement) {
83
-		statement.expression.accept(expressionVisitor);
84
-		
85
-		// TODO: make the expression not push anything
86
-		if (statement.expression.type.type != BasicTypeID.VOID)
87
-			javaWriter.pop(CompilerUtils.isLarge(statement.expression.type));
88
-		
85
+		statement.expression.accept(nonPushingExpressionVisitor);
89 86
 		return false;
90 87
 	}
91 88
 

+ 18
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java Zobrazit soubor

@@ -10,7 +10,6 @@ import static org.objectweb.asm.Opcodes.*;
10 10
 import org.objectweb.asm.commons.LocalVariablesSorter;
11 11
 import org.openzen.zencode.shared.CodePosition;
12 12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
13
-import org.openzen.zenscript.codemodel.statement.VarStatement;
14 13
 import org.openzen.zenscript.codemodel.statement.VariableID;
15 14
 import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
16 15
 import org.openzen.zenscript.javashared.JavaParameterInfo;
@@ -26,6 +25,7 @@ public class JavaWriter {
26 25
 
27 26
     public final JavaMethod method;
28 27
     public final HighLevelDefinition forDefinition;
28
+	private final CodePosition position;
29 29
 
30 30
     private final LocalVariablesSorter visitor;
31 31
     private final List<JavaLocalVariableInfo> localVariableInfos = new ArrayList<>();
@@ -37,6 +37,7 @@ public class JavaWriter {
37 37
 	private final Map<VariableID, JavaLocalVariableInfo> localVariables = new HashMap<>();
38 38
 	
39 39
     public JavaWriter(
40
+			CodePosition position,
40 41
             ClassVisitor visitor,
41 42
             boolean nameVariables,
42 43
             JavaMethod method,
@@ -44,11 +45,12 @@ public class JavaWriter {
44 45
             String signature,
45 46
             String[] exceptions,
46 47
             String... annotations) {
47
-        this(visitor, nameVariables, method, forDefinition, false, signature, method.descriptor, exceptions, annotations);
48
+        this(position, visitor, nameVariables, method, forDefinition, false, signature, method.descriptor, exceptions, annotations);
48 49
     }
49 50
 
50 51
 
51 52
     public JavaWriter(
53
+			CodePosition position,
52 54
             ClassVisitor visitor,
53 55
             boolean nameVariables,
54 56
             JavaMethod method,
@@ -61,6 +63,7 @@ public class JavaWriter {
61 63
         this.clazzVisitor = visitor;
62 64
         this.method = method;
63 65
         this.forDefinition = forDefinition;
66
+		this.position = position;
64 67
 
65 68
         final MethodVisitor methodVisitor = visitor.visitMethod(isExtension ? method.modifiers | Opcodes.ACC_STATIC : method.modifiers, method.name, descriptor, signature, exceptions);
66 69
 
@@ -75,8 +78,8 @@ public class JavaWriter {
75 78
 
76 79
 
77 80
 
78
-    public JavaWriter(ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
79
-        this(visitor, true, method, forDefinition, signature, exceptions, annotations);
81
+    public JavaWriter(CodePosition position, ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
82
+        this(position, visitor, true, method, forDefinition, signature, exceptions, annotations);
80 83
     }
81 84
 	
82 85
 	public void setLocalVariable(VariableID variable, JavaLocalVariableInfo info) {
@@ -233,6 +236,17 @@ public class JavaWriter {
233 236
 
234 237
         visitor.visitInsn(DUP_X1);
235 238
     }
239
+	
240
+	public void dupX1(boolean tosLarge, boolean large) {
241
+		if (debug)
242
+            System.out.println("dupx1");
243
+
244
+		if (tosLarge) {
245
+	        visitor.visitInsn(large ? DUP2_X2 : DUP_X2);
246
+		} else {
247
+	        visitor.visitInsn(large ? DUP2_X1 : DUP_X1);
248
+		}
249
+	}
236 250
 
237 251
     public void dupX2() {
238 252
         if (debug)

+ 7
- 7
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java Zobrazit soubor

@@ -105,7 +105,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
105 105
         }
106 106
 
107 107
 		JavaMethod valuesMethod = JavaMethod.getStatic(toClass, "values", "()[L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
108
-		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethod, definition, null, null);
108
+		JavaWriter valuesWriter = new JavaWriter(definition.position, writer, true, valuesMethod, definition, null, null);
109 109
 		valuesWriter.start();
110 110
 		valuesWriter.getStaticField(toClass.internalName, "$VALUES", "[L" + toClass.internalName + ";");
111 111
 		valuesWriter.invokeVirtual(ARRAY_CLONE);
@@ -114,7 +114,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
114 114
 		valuesWriter.end();
115 115
 
116 116
 		JavaMethod valueOfMethod = JavaMethod.getStatic(toClass, "valueOf", "(Ljava/lang/String;)L" + toClass.internalName + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
117
-		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethod, definition, null, null);
117
+		JavaWriter valueOfWriter = new JavaWriter(definition.position, writer, true, valueOfMethod, definition, null, null);
118 118
 		valueOfWriter.start();
119 119
 		valueOfWriter.invokeStatic(CLASS_FORNAME);
120 120
 		valueOfWriter.loadObject(0);
@@ -139,7 +139,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
139 139
         final String signature = context.getMethodSignature(definition.header);
140 140
 		final JavaMethod method = context.getJavaMethod(definition.caller);
141 141
 
142
-		final JavaWriter writer = new JavaWriter(outerWriter, true, method, definition, signature, null);
142
+		final JavaWriter writer = new JavaWriter(definition.position, outerWriter, true, method, definition, signature, null);
143 143
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(definition.module), writer);
144 144
         statementVisitor.start();
145 145
 		boolean returns = definition.caller.body.accept(statementVisitor);
@@ -261,8 +261,8 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
261 261
 			optionInitDescBuilder.append(")V");
262 262
 			optionInitSignatureBuilder.append(")V");
263 263
 
264
-JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOptionClass, optionInitDescBuilder.toString(), JavaModifiers.PUBLIC);
265
-			final JavaWriter initWriter = new JavaWriter(optionWriter, constructorMethod, variant, optionInitSignatureBuilder.toString(), null);
264
+			JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOptionClass, optionInitDescBuilder.toString(), JavaModifiers.PUBLIC);
265
+			final JavaWriter initWriter = new JavaWriter(option.position, optionWriter, constructorMethod, variant, optionInitSignatureBuilder.toString(), null);
266 266
 			initWriter.start();
267 267
 			initWriter.loadObject(0);
268 268
 			initWriter.dup();
@@ -280,7 +280,7 @@ JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOption
280 280
 
281 281
 			//Denominator for switch-cases
282 282
 			JavaMethod denominator = JavaMethod.getVirtual(optionTag.variantOptionClass, "getDenominator", "()I", JavaModifiers.PUBLIC);
283
-			final JavaWriter getDenominator = new JavaWriter(optionWriter, denominator, null, null, null, "java/lang/Override");
283
+			final JavaWriter getDenominator = new JavaWriter(option.position, optionWriter, denominator, null, null, null, "java/lang/Override");
284 284
 			getDenominator.start();
285 285
 			getDenominator.constant(option.ordinal);
286 286
 			getDenominator.returnInt();
@@ -304,7 +304,7 @@ JavaMethod constructorMethod = JavaMethod.getConstructor(optionTag.variantOption
304 304
 			member.accept(visitor);
305 305
 		}
306 306
 
307
-		final JavaWriter superInitWriter = new JavaWriter(writer, JavaMethod.getConstructor(toClass, "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
307
+		final JavaWriter superInitWriter = new JavaWriter(variant.position, writer, JavaMethod.getConstructor(toClass, "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
308 308
 		superInitWriter.start();
309 309
 		superInitWriter.loadObject(0);
310 310
 		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaExpansionMemberVisitor.java Zobrazit soubor

@@ -78,7 +78,7 @@ public class JavaExpansionMemberVisitor implements MemberVisitor<Void> {
78 78
 		}
79 79
 
80 80
 
81
-		final JavaWriter methodWriter = new JavaWriter(writer, true, method, definition, true, methodSignature, methodSignature, null);
81
+		final JavaWriter methodWriter = new JavaWriter(member.position, writer, true, method, definition, true, methodSignature, methodSignature, null);
82 82
 		methodWriter.label(methodStart);
83 83
 
84 84
 		if (!isStatic) {

+ 4
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java Zobrazit soubor

@@ -35,7 +35,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
35 35
 		this.context = context;
36 36
 		javaModule = context.getJavaModule(definition.module);
37 37
 
38
-        final JavaWriter javaWriter = new JavaWriter(writer, new JavaMethod(toClass, JavaMethod.Kind.STATICINIT, "<clinit>", true, "()V", 0, false), definition, null, null);
38
+        final JavaWriter javaWriter = new JavaWriter(definition.position, writer, new JavaMethod(toClass, JavaMethod.Kind.STATICINIT, "<clinit>", true, "()V", 0, false), definition, null, null);
39 39
         this.clinitStatementVisitor = new JavaStatementVisitor(context, javaModule, javaWriter);
40 40
         this.clinitStatementVisitor.start();
41 41
         CompilerUtils.writeDefaultFieldInitializers(context, javaWriter, definition, true);
@@ -62,7 +62,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
62 62
 
63 63
         final Label constructorStart = new Label();
64 64
         final Label constructorEnd = new Label();
65
-        final JavaWriter constructorWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
65
+        final JavaWriter constructorWriter = new JavaWriter(member.position, writer, method, definition, context.getMethodSignature(member.header), null);
66 66
         constructorWriter.label(constructorStart);
67 67
         CompilerUtils.tagConstructorParameters(context, javaModule, member.header, isEnum);
68 68
         for (FunctionParameter parameter : member.header.parameters) {
@@ -108,7 +108,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
108 108
 
109 109
 		final Label constructorStart = new Label();
110 110
 		final Label constructorEnd = new Label();
111
-		final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
111
+		final JavaWriter destructorWriter = new JavaWriter(member.position, writer, method, definition, null, null);
112 112
 		destructorWriter.label(constructorStart);
113 113
 
114 114
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, destructorWriter);
@@ -129,7 +129,7 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
129 129
 
130 130
 		final Label methodStart = new Label();
131 131
 		final Label methodEnd = new Label();
132
-	    final JavaWriter methodWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
132
+	    final JavaWriter methodWriter = new JavaWriter(member.position, writer, method, definition, context.getMethodSignature(member.header), null);
133 133
 
134 134
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
135 135
 

Loading…
Zrušit
Uložit