Browse Source

Some more work on Variants, still WIP

kindlich 6 years ago
parent
commit
c711a7f474
No known key found for this signature in database

+ 27
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java View File

366
 			if (!checkAndExecuteMethodInfo(expression.member))
366
 			if (!checkAndExecuteMethodInfo(expression.member))
367
 				throw new IllegalStateException("Call target has no method info!");
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
 			return null;
371
 			return null;
370
 		}
372
 		}
371
 
373
 
1736
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1738
 	public Void visitGetMatchingVariantField(GetMatchingVariantField expression) {
1737
 		javaWriter.loadObject(0);
1739
 		javaWriter.loadObject(0);
1738
 		final ITypeID type = expression.value.option.getParameterType(expression.index);
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
 		return null;
1744
 		return null;
1741
 		//throw new UnsupportedOperationException(); // TODO
1745
 		//throw new UnsupportedOperationException(); // TODO
1742
 	}
1746
 	}
2003
 		for (MatchExpression.Case aCase : expression.cases) {
2007
 		for (MatchExpression.Case aCase : expression.cases) {
2004
 			if (aCase.key instanceof VariantOptionSwitchValue) {
2008
 			if (aCase.key instanceof VariantOptionSwitchValue) {
2005
 				VariantOptionSwitchValue variantOptionSwitchValue = (VariantOptionSwitchValue) aCase.key;
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
 				break;
2012
 				break;
2008
 			}
2013
 			}
2009
 		}
2014
 		}
2345
 
2350
 
2346
 	@Override
2351
 	@Override
2347
 	public Void visitVariantValue(VariantValueExpression expression) {
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
 	@Override
2375
 	@Override

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeVisitor.java View File

35
 
35
 
36
 	@Override
36
 	@Override
37
 	public Type visitDefinition(DefinitionTypeID definition) {
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
 	@Override
41
 	@Override

+ 41
- 5
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java View File

200
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
200
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
201
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
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
 			option.setTag(JavaClass.class, optionClass);
206
 			option.setTag(JavaClass.class, optionClass);
204
 
207
 
205
 
208
 
221
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
224
 			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
222
 			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
225
 			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
223
 
226
 
227
+
228
+			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
229
+
224
 			ITypeID[] types = option.types;
230
 			ITypeID[] types = option.types;
225
 			for (int i = 0; i < types.length; ++i) {
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
 				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
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
 			//Denominator for switch-cases
259
 			//Denominator for switch-cases
237
 			getDenominator.end();
264
 			getDenominator.end();
238
 
265
 
239
 
266
 
240
-			//Print the option files, won't be in production
241
 			optionVisitor.end();
267
 			optionVisitor.end();
242
 			optionWriter.visitEnd();
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
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
273
 			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
245
-				out.write(optionWriter.toByteArray());
274
+				out.write(byteArray);
246
 			} catch (IOException e) {
275
 			} catch (IOException e) {
247
 				e.printStackTrace();
276
 				e.printStackTrace();
248
 			}
277
 			}
253
 			member.accept(visitor);
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
 		visitor.end();
292
 		visitor.end();
257
 		writer.visitEnd();
293
 		writer.visitEnd();
258
 
294
 

Loading…
Cancel
Save