Преглед изворни кода

Some more work on Variants, still WIP

kindlich пре 6 година
родитељ
комит
c711a7f474
No known key found for this signature in database

+ 27
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java Прегледај датотеку

@@ -366,6 +366,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
366 366
 			if (!checkAndExecuteMethodInfo(expression.member))
367 367
 				throw new IllegalStateException("Call target has no method info!");
368 368
 
369
+			if(expression.instancedHeader.returnType != BasicTypeID.VOID)
370
+				javaWriter.checkCast("java/lang/String");
369 371
 			return null;
370 372
 		}
371 373
 
@@ -1736,7 +1738,9 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1736 1738
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1737 1739
 		javaWriter.loadObject(0);
1738 1740
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
1739
-		javaWriter.getField(new JavaFieldInfo(expression.value.option.getTag(JavaClass.class), "Field" + expression.index, type.accept(JavaTypeVisitor.INSTANCE).getInternalName()));
1741
+		final JavaClass tag = expression.value.option.getTag(JavaClass.class);
1742
+		javaWriter.checkCast(tag.internalName);
1743
+		javaWriter.getField(new JavaFieldInfo(tag, "Field" + expression.index, type.accept(JavaTypeVisitor.INSTANCE).getDescriptor()));
1740 1744
 		return null;
1741 1745
 		//throw new UnsupportedOperationException(); // TODO
1742 1746
 	}
@@ -2003,7 +2007,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2003 2007
 		for (MatchExpression.Case aCase : expression.cases) {
2004 2008
 			if (aCase.key instanceof VariantOptionSwitchValue) {
2005 2009
 				VariantOptionSwitchValue variantOptionSwitchValue = (VariantOptionSwitchValue) aCase.key;
2006
-				javaWriter.invokeVirtual(new JavaMethodInfo(new JavaClass("", variantOptionSwitchValue.option.getName(), JavaClass.Kind.CLASS), "getDenominator", "()I", 0));
2010
+				final String className = variantOptionSwitchValue.option.getTag(JavaClass.class).internalName;
2011
+				javaWriter.invokeVirtual(new JavaMethodInfo(new JavaClass("", className.substring(0, className.lastIndexOf('$')), JavaClass.Kind.CLASS), "getDenominator", "()I", 0));
2007 2012
 				break;
2008 2013
 			}
2009 2014
 		}
@@ -2345,7 +2350,26 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
2345 2350
 
2346 2351
 	@Override
2347 2352
 	public Void visitVariantValue(VariantValueExpression expression) {
2348
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
2353
+		final String internalName = expression.option.getTag(JavaClass.class).internalName;
2354
+		javaWriter.newObject(internalName);
2355
+		javaWriter.dup();
2356
+
2357
+		for (Expression argument : expression.arguments) {
2358
+			argument.accept(this);
2359
+		}
2360
+
2361
+		final StringBuilder builder = new StringBuilder("(");
2362
+		for (ITypeID type : expression.option.getOption().types) {
2363
+			builder.append(type.accept(JavaTypeVisitor.INSTANCE).getDescriptor());
2364
+		}
2365
+		builder.append(")V");
2366
+
2367
+
2368
+		javaWriter.invokeSpecial(internalName, "<init>", builder.toString());
2369
+
2370
+
2371
+
2372
+		return null;
2349 2373
 	}
2350 2374
 
2351 2375
 	@Override

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeVisitor.java Прегледај датотеку

@@ -35,7 +35,7 @@ public class JavaTypeVisitor implements ITypeVisitor<Type> {
35 35
 
36 36
 	@Override
37 37
 	public Type visitDefinition(DefinitionTypeID definition) {
38
-		return Type.getType("L" + definition + ";");
38
+		return Type.getType("L" + definition.definition.name + ";");
39 39
 	}
40 40
 
41 41
 	@Override

+ 41
- 5
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java Прегледај датотеку

@@ -200,6 +200,9 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
200 200
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
201 201
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
202 202
 
203
+			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
204
+
205
+
203 206
 			option.setTag(JavaClass.class, optionClass);
204 207
 
205 208
 
@@ -221,12 +224,36 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
221 224
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
222 225
 			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
223 226
 
227
+
228
+			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
229
+
224 230
 			ITypeID[] types = option.types;
225 231
 			for (int i = 0; i < types.length; ++i) {
226
-				final ITypeID type = types[i];
227
-				final String internalName = type.accept(JavaTypeVisitor.INSTANCE).getInternalName();
232
+				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
233
+				final String internalName = type.getDescriptor();
234
+				optionInitDescBuilder.append(internalName);
228 235
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
229 236
 			}
237
+			optionInitDescBuilder.append(")V");
238
+
239
+
240
+			final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitDescBuilder.toString(), null);
241
+			initWriter.start();
242
+			initWriter.loadObject(0);
243
+			initWriter.dup();
244
+			initWriter.invokeSpecial(variantName, "<init>", "()V");
245
+			for (int i = 0; i < types.length; ++i) {
246
+				initWriter.dup();
247
+				initWriter.loadObject(i + 1);
248
+
249
+				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
250
+				final String internalName = type.getDescriptor();
251
+
252
+				initWriter.putField(optionClassName, "Field" + i, internalName);
253
+			}
254
+			initWriter.pop();
255
+			initWriter.ret();
256
+			initWriter.end();
230 257
 
231 258
 
232 259
 			//Denominator for switch-cases
@@ -237,12 +264,14 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
237 264
 			getDenominator.end();
238 265
 
239 266
 
240
-			//Print the option files, won't be in production
241 267
 			optionVisitor.end();
242 268
 			optionWriter.visitEnd();
243
-			JavaModule.classes.put(optionClassName, optionWriter.toByteArray());
269
+			final byte[] byteArray = optionWriter.toByteArray();
270
+			JavaModule.classes.put(optionClassName, byteArray);
271
+
272
+			//Print the option files, won't be in production
244 273
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
245
-				out.write(optionWriter.toByteArray());
274
+				out.write(byteArray);
246 275
 			} catch (IOException e) {
247 276
 				e.printStackTrace();
248 277
 			}
@@ -253,6 +282,13 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
253 282
 			member.accept(visitor);
254 283
 		}
255 284
 
285
+		final JavaWriter superInitWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<init>", "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
286
+		superInitWriter.start();
287
+		superInitWriter.loadObject(0);
288
+		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
289
+		superInitWriter.ret();
290
+		superInitWriter.end();
291
+
256 292
 		visitor.end();
257 293
 		writer.visitEnd();
258 294
 

Loading…
Откажи
Сачувај