Browse Source

Commit before merge

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

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

122
     }
122
     }
123
 
123
 
124
     private static void createLambdaInterface(JavaBytecodeContext context, FunctionHeader header, JavaClass cls) {
124
     private static void createLambdaInterface(JavaBytecodeContext context, FunctionHeader header, JavaClass cls) {
125
-        ClassWriter ifaceWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
125
+        ClassWriter ifaceWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
126
         ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
126
         ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
127
         ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.internalName, null, "java/lang/Object", null);
127
         ifaceWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, cls.internalName, null, "java/lang/Object", null);
128
 
128
 

+ 46
- 0
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaClassWriter.java View File

2
 
2
 
3
 import org.objectweb.asm.ClassWriter;
3
 import org.objectweb.asm.ClassWriter;
4
 
4
 
5
+import java.util.HashMap;
6
+import java.util.Map;
7
+
5
 public class JavaClassWriter extends ClassWriter {
8
 public class JavaClassWriter extends ClassWriter {
9
+
10
+	private static final Map<String, String> super_classes = new HashMap<>();
11
+
12
+	public static void registerSuperClass(String child, String superClass) {
13
+		super_classes.put(child, superClass);
14
+	}
15
+
16
+	public static Map<String, String> getSuper_classes() {
17
+		return super_classes;
18
+	}
19
+
6
 	public JavaClassWriter(int flags) {
20
 	public JavaClassWriter(int flags) {
7
 		super(flags);
21
 		super(flags);
8
 	}
22
 	}
23
+
24
+	@Override
25
+	protected String getCommonSuperClass(String type1, String type2) {
26
+
27
+		//FIXME big TODO, make this more efficient!!!
28
+		try {
29
+			return super.getCommonSuperClass(type1, type2);
30
+		} catch (Exception ignored){}
31
+
32
+
33
+		if(type1.equals(type2))
34
+			return type1;
35
+
36
+		String newType2 = type2;
37
+		while(super_classes.containsKey(newType2)){
38
+			newType2 = super_classes.get(newType2);
39
+			if(type1.equals(newType2))
40
+				return type1;
41
+		}
42
+
43
+		String newType1 = type1;
44
+		while(super_classes.containsKey(newType1)){
45
+			newType1 = super_classes.get(newType1);
46
+			if(type2.equals(newType1))
47
+				return type2;
48
+		}
49
+
50
+		return super_classes.containsKey(type1) ? getCommonSuperClass(super_classes.get(type1), type2) : super_classes.containsKey(type2) ? getCommonSuperClass(type1, super_classes.get(type2)) : "java/lang/Object";
51
+
52
+	}
53
+
54
+
9
 }
55
 }

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

357
 
357
 
358
 			if (!checkAndExecuteMethodInfo(expression.member))
358
 			if (!checkAndExecuteMethodInfo(expression.member))
359
 				throw new IllegalStateException("Call target has no method info!");
359
 				throw new IllegalStateException("Call target has no method info!");
360
+			//if (expression.member.getHeader().returnType != expression.type)
361
+
362
+			//TODO see if the types differ (e.g. if a generic method was invoked) and only cast then
363
+			if(expression.type != BasicTypeID.VOID)
364
+				javaWriter.checkCast(context.getInternalName(expression.type));
360
 			return null;
365
 			return null;
361
 		}
366
 		}
362
 
367
 
1577
 		final String name = CompilerUtils.getLambdaCounter();
1582
 		final String name = CompilerUtils.getLambdaCounter();
1578
 
1583
 
1579
 		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1584
 		final JavaMethodInfo methodInfo = new JavaMethodInfo(javaWriter.method.javaClass, "accept", signature, Opcodes.ACC_PUBLIC);
1580
-		final ClassWriter lambdaCW = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
1585
+		final ClassWriter lambdaCW = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
1581
 		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{JavaSynthesizedClassNamer.createFunctionName(new FunctionTypeID(null, expression.header)).cls.internalName});
1586
 		lambdaCW.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, name, null, "java/lang/Object", new String[]{JavaSynthesizedClassNamer.createFunctionName(new FunctionTypeID(null, expression.header)).cls.internalName});
1582
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1587
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1583
 
1588
 
1721
 		javaWriter.checkCast(tag.internalName);
1726
 		javaWriter.checkCast(tag.internalName);
1722
 		javaWriter.getField(new JavaField(tag, "Field" + expression.index, context.getDescriptor(type)));
1727
 		javaWriter.getField(new JavaField(tag, "Field" + expression.index, context.getDescriptor(type)));
1723
 		return null;
1728
 		return null;
1724
-		//throw new UnsupportedOperationException(); // TODO
1725
 	}
1729
 	}
1726
 
1730
 
1727
 	@Override
1731
 	@Override

+ 4
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachVisitor.java View File

59
 
59
 
60
 	@Override
60
 	@Override
61
 	public Void visitStringCharacterIterator() {
61
 	public Void visitStringCharacterIterator() {
62
-		// TODO: implement this one
63
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
62
+		//TODO UNTESTED!
63
+		javaWriter.invokeSpecial("java/lang/String", "toCharArray()", "()[C");
64
+		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
65
+		return null;
64
 	}
66
 	}
65
 
67
 
66
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
68
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {

+ 22
- 21
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeGenericVisitor.java View File

4
 import org.openzen.zenscript.codemodel.FunctionParameter;
4
 import org.openzen.zenscript.codemodel.FunctionParameter;
5
 import org.openzen.zenscript.codemodel.generic.*;
5
 import org.openzen.zenscript.codemodel.generic.*;
6
 import org.openzen.zenscript.codemodel.type.*;
6
 import org.openzen.zenscript.codemodel.type.*;
7
+import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
7
 
8
 
8
 import java.util.Collection;
9
 import java.util.Collection;
9
 
10
 
10
 public class JavaTypeGenericVisitor implements ITypeVisitor<String> {
11
 public class JavaTypeGenericVisitor implements ITypeVisitor<String> {
11
 
12
 
12
-	public static final JavaTypeGenericVisitor INSTANCE = new JavaTypeGenericVisitor();
13
+	private final JavaBytecodeContext context;
14
+
15
+	public JavaTypeGenericVisitor(JavaBytecodeContext context) {
16
+		this.context = context;
17
+	}
13
 
18
 
14
 
19
 
15
-	public static String getGenericSignature(ITypeID... types) {
20
+	public String getGenericSignature(ITypeID... types) {
16
 		if (types == null || types.length == 0)
21
 		if (types == null || types.length == 0)
17
 			return "";
22
 			return "";
18
 		final StringBuilder builder = new StringBuilder();
23
 		final StringBuilder builder = new StringBuilder();
19
 		for (ITypeID type : types) {
24
 		for (ITypeID type : types) {
20
-			builder.append(type.accept(INSTANCE));
25
+			builder.append(type.accept(this));
21
 		}
26
 		}
22
 
27
 
23
 		return builder.toString();
28
 		return builder.toString();
24
 	}
29
 	}
25
 
30
 
26
 
31
 
27
-	public static String getGenericSignature(TypeParameter... parameters) {
32
+	public String getGenericSignature(TypeParameter... parameters) {
28
 		if (parameters == null || parameters.length == 0)
33
 		if (parameters == null || parameters.length == 0)
29
 			return "";
34
 			return "";
30
 
35
 
35
 		return builder.toString();
40
 		return builder.toString();
36
 	}
41
 	}
37
 
42
 
38
-	public static String getSignatureWithBound(ITypeID type) {
43
+	public String getSignatureWithBound(ITypeID type) {
39
 		if(type instanceof GenericTypeID){
44
 		if(type instanceof GenericTypeID){
40
 			final TypeParameter parameter = ((GenericTypeID) type).parameter;
45
 			final TypeParameter parameter = ((GenericTypeID) type).parameter;
41
 			return parameter.name + ":" + getGenericBounds(parameter.bounds);
46
 			return parameter.name + ":" + getGenericBounds(parameter.bounds);
43
 		throw new IllegalStateException("Type " + type + " is of the wrong class");
48
 		throw new IllegalStateException("Type " + type + " is of the wrong class");
44
 	}
49
 	}
45
 
50
 
46
-	private static String getGenericSignature(FunctionParameter... parameters) {
51
+	private String getGenericSignature(FunctionParameter... parameters) {
47
 		if(parameters == null || parameters.length == 0)
52
 		if(parameters == null || parameters.length == 0)
48
 			return "";
53
 			return "";
49
 		final StringBuilder builder = new StringBuilder();
54
 		final StringBuilder builder = new StringBuilder();
50
 		for (FunctionParameter parameter : parameters) {
55
 		for (FunctionParameter parameter : parameters) {
51
-			builder.append(parameter.type.accept(INSTANCE));
56
+			builder.append(parameter.type.accept(this));
52
 		}
57
 		}
53
 		return builder.toString();
58
 		return builder.toString();
54
 	}
59
 	}
55
 
60
 
56
-	public static String getGenericMethodSignature(FunctionHeader header) {
61
+	public String getGenericMethodSignature(FunctionHeader header) {
57
 		return "(" + getGenericSignature(header.parameters) +
62
 		return "(" + getGenericSignature(header.parameters) +
58
 				")" +
63
 				")" +
59
 				getGenericSignature(header.returnType);
64
 				getGenericSignature(header.returnType);
60
 	}
65
 	}
61
 
66
 
62
 
67
 
63
-	public static String getGenericBounds(Collection<GenericParameterBound> collection) {
68
+	public String getGenericBounds(Collection<GenericParameterBound> collection) {
64
 		if (collection == null)
69
 		if (collection == null)
65
 			return "";
70
 			return "";
66
 		for (GenericParameterBound parameterBound : collection) {
71
 		for (GenericParameterBound parameterBound : collection) {
72
 
77
 
73
 				@Override
78
 				@Override
74
 				public String visitType(ParameterTypeBound bound) {
79
 				public String visitType(ParameterTypeBound bound) {
75
-					return bound.type.accept(INSTANCE);
80
+					return bound.type.accept(JavaTypeGenericVisitor.this);
76
 				}
81
 				}
77
 			});
82
 			});
78
 			if (s != null)
83
 			if (s != null)
81
 		return "Ljava/lang/Object;";
86
 		return "Ljava/lang/Object;";
82
 	}
87
 	}
83
 
88
 
84
-
85
-	private JavaTypeGenericVisitor() {
86
-	}
87
-
88
 	@Override
89
 	@Override
89
 	public String visitBasic(BasicTypeID basic) {
90
 	public String visitBasic(BasicTypeID basic) {
90
-		return basic.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
91
+		return context.getDescriptor(basic);
91
 	}
92
 	}
92
 
93
 
93
 	@Override
94
 	@Override
94
 	public String visitArray(ArrayTypeID array) {
95
 	public String visitArray(ArrayTypeID array) {
95
-		return array.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
96
+		return context.getDescriptor(array);
96
 	}
97
 	}
97
 
98
 
98
 	@Override
99
 	@Override
99
 	public String visitAssoc(AssocTypeID assoc) {
100
 	public String visitAssoc(AssocTypeID assoc) {
100
-		return assoc.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
101
+		return context.getDescriptor(assoc);
101
 	}
102
 	}
102
 
103
 
103
 	@Override
104
 	@Override
104
 	public String visitGenericMap(GenericMapTypeID map) {
105
 	public String visitGenericMap(GenericMapTypeID map) {
105
-		return map.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
106
+		return context.getDescriptor(map);
106
 	}
107
 	}
107
 
108
 
108
 	@Override
109
 	@Override
109
 	public String visitIterator(IteratorTypeID iterator) {
110
 	public String visitIterator(IteratorTypeID iterator) {
110
-		return iterator.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
111
+		return context.getDescriptor(iterator);
111
 	}
112
 	}
112
 
113
 
113
 	@Override
114
 	@Override
114
 	public String visitFunction(FunctionTypeID function) {
115
 	public String visitFunction(FunctionTypeID function) {
115
-		return function.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
116
+		return context.getDescriptor(function);
116
 	}
117
 	}
117
 
118
 
118
 	@Override
119
 	@Override
138
 
139
 
139
 	@Override
140
 	@Override
140
 	public String visitRange(RangeTypeID range) {
141
 	public String visitRange(RangeTypeID range) {
141
-		return range.accept(JavaTypeVisitor.INSTANCE).getDescriptor();
142
+		return context.getDescriptor(range);
142
 	}
143
 	}
143
 
144
 
144
 	@Override
145
 	@Override

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

37
 
37
 
38
 	private final JavaClassWriter outerWriter;
38
 	private final JavaClassWriter outerWriter;
39
 	private final JavaBytecodeContext context;
39
 	private final JavaBytecodeContext context;
40
+	final JavaTypeGenericVisitor javaTypeGenericVisitor;
40
 
41
 
41
     public JavaDefinitionVisitor(JavaBytecodeContext context, JavaClassWriter outerWriter) {
42
     public JavaDefinitionVisitor(JavaBytecodeContext context, JavaClassWriter outerWriter) {
42
 		this.context = context;
43
 		this.context = context;
43
 		this.outerWriter = outerWriter;
44
 		this.outerWriter = outerWriter;
45
+	    this.javaTypeGenericVisitor = new JavaTypeGenericVisitor(context);
44
 	}
46
 	}
45
 
47
 
46
 	@Override
48
 	@Override
73
 	@Override
75
 	@Override
74
 	public byte[] visitInterface(InterfaceDefinition definition) {
76
 	public byte[] visitInterface(InterfaceDefinition definition) {
75
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.INTERFACE);
77
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.INTERFACE);
76
-		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
78
+		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
77
 
79
 
78
 		//TODO: Calculate signature from generic parameters
80
 		//TODO: Calculate signature from generic parameters
79
 		//TODO: Extending Interfaces?
81
 		//TODO: Extending Interfaces?
98
         else
100
         else
99
             superType = context.getType(definition.getSuperType());
101
             superType = context.getType(definition.getSuperType());
100
 
102
 
101
-		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
103
+		ClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
102
 
104
 
103
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_ENUM | Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL, definition.name, "Ljava/lang/Enum<L" + definition.name + ";>;", superType.getInternalName(), null);
105
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_ENUM | Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER | Opcodes.ACC_FINAL, definition.name, "Ljava/lang/Enum<L" + definition.name + ";>;", superType.getInternalName(), null);
104
 
106
 
191
 		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
193
 		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
192
 
194
 
193
 
195
 
194
-		final String ss = "<" + JavaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
195
-
196
+		final String ss = "<" + javaTypeGenericVisitor.getGenericSignature(variant.genericParameters) + ">Ljava/lang/Object;";
197
+		JavaClassWriter.registerSuperClass(variantName, "java/lang/Object");
196
 
198
 
197
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, ss, "java/lang/Object", null);
199
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, ss, "java/lang/Object", null);
198
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
200
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
206
 			final String optionClassName = variantName + "$" + option.name;
208
 			final String optionClassName = variantName + "$" + option.name;
207
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
209
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
208
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
210
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
211
+			JavaClassWriter.registerSuperClass(optionClassName, variantName);
209
 
212
 
210
 			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
213
 			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
211
 
214
 
220
 				//TODO check if this can be changed to what Stan was up to
223
 				//TODO check if this can be changed to what Stan was up to
221
 				builder.append("<");
224
 				builder.append("<");
222
 				for (final ITypeID type : option.types) {
225
 				for (final ITypeID type : option.types) {
223
-					builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
226
+					builder.append(javaTypeGenericVisitor.getSignatureWithBound(type));
224
 				}
227
 				}
225
 				builder.append(">");
228
 				builder.append(">");
226
 				builder.append("L").append(variantName).append("<");
229
 				builder.append("L").append(variantName).append("<");
236
 							}
239
 							}
237
 						}
240
 						}
238
 					if (t)
241
 					if (t)
239
-						builder.append(JavaTypeGenericVisitor.getGenericBounds(genericParameter.bounds));
242
+						builder.append(javaTypeGenericVisitor.getGenericBounds(genericParameter.bounds));
240
 
243
 
241
 				}
244
 				}
242
 
245
 
251
 
254
 
252
 			ITypeID[] types = option.types;
255
 			ITypeID[] types = option.types;
253
 			for (int i = 0; i < types.length; ++i) {
256
 			for (int i = 0; i < types.length; ++i) {
254
-				final String internalName = context.getInternalName(types[i]);
255
-				optionInitDescBuilder.append(internalName);
257
+				final String descriptor = context.getDescriptor(types[i]);
258
+				optionInitDescBuilder.append(descriptor);
256
 				optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
259
 				optionInitSignatureBuilder.append("T").append(((GenericTypeID) types[i]).parameter.name).append(";");
257
-				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
260
+				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, descriptor, "T" + ((GenericTypeID) types[i]).parameter.name + ";", null).visitEnd();
258
 			}
261
 			}
259
 			optionInitDescBuilder.append(")V");
262
 			optionInitDescBuilder.append(")V");
260
 			optionInitSignatureBuilder.append(")V");
263
 			optionInitSignatureBuilder.append(")V");

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java View File

141
 		final Label methodStart = new Label();
141
 		final Label methodStart = new Label();
142
 		final Label methodEnd = new Label();
142
 		final Label methodEnd = new Label();
143
 		//TODO see if this can be changed to Stan's changes (context call maybe?)
143
 		//TODO see if this can be changed to Stan's changes (context call maybe?)
144
-		final JavaWriter methodWriter = new JavaWriter(writer, method, definition, JavaTypeGenericVisitor.getGenericMethodSignature(member.header), null);
144
+	    final JavaWriter methodWriter = new JavaWriter(writer, method, definition, new JavaTypeGenericVisitor(context).getGenericMethodSignature(member.header), null);
145
 		methodWriter.label(methodStart);
145
 		methodWriter.label(methodStart);
146
 		for (final FunctionParameter parameter : member.header.parameters) {
146
 		for (final FunctionParameter parameter : member.header.parameters) {
147
 			methodWriter.nameParameter(0, parameter.name);
147
 			methodWriter.nameParameter(0, parameter.name);
148
 			if (!isAbstract)
148
 			if (!isAbstract)
149
-				methodWriter.nameVariable(parameter.getTag(JavaParameterInfo.class).index, parameter.name, methodStart, methodEnd, parameter.type.accept(JavaTypeVisitor.INSTANCE));
149
+				methodWriter.nameVariable(parameter.getTag(JavaParameterInfo.class).index, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
150
 		}
150
 		}
151
 
151
 
152
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, methodWriter);
152
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, methodWriter);

Loading…
Cancel
Save