瀏覽代碼

Commit before merge

kindlich 6 年之前
父節點
當前提交
5c5a6c9e84
沒有發現已知的金鑰在資料庫的簽署中

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java 查看文件

@@ -122,7 +122,7 @@ public class CompilerUtils {
122 122
     }
123 123
 
124 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 126
         ifaceWriter.visitAnnotation("java/lang/FunctionalInterface", true).visitEnd();
127 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 查看文件

@@ -2,8 +2,54 @@ package org.openzen.zenscript.javabytecode.compiler;
2 2
 
3 3
 import org.objectweb.asm.ClassWriter;
4 4
 
5
+import java.util.HashMap;
6
+import java.util.Map;
7
+
5 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 20
 	public JavaClassWriter(int flags) {
7 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 查看文件

@@ -357,6 +357,11 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
357 357
 
358 358
 			if (!checkAndExecuteMethodInfo(expression.member))
359 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 365
 			return null;
361 366
 		}
362 367
 
@@ -1577,7 +1582,7 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1577 1582
 		final String name = CompilerUtils.getLambdaCounter();
1578 1583
 
1579 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 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 1587
 		final JavaWriter functionWriter = new JavaWriter(lambdaCW, methodInfo, null, signature, null, "java/lang/Override");
1583 1588
 
@@ -1721,7 +1726,6 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void> {
1721 1726
 		javaWriter.checkCast(tag.internalName);
1722 1727
 		javaWriter.getField(new JavaField(tag, "Field" + expression.index, context.getDescriptor(type)));
1723 1728
 		return null;
1724
-		//throw new UnsupportedOperationException(); // TODO
1725 1729
 	}
1726 1730
 
1727 1731
 	@Override

+ 4
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachVisitor.java 查看文件

@@ -59,8 +59,10 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
59 59
 
60 60
 	@Override
61 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 68
 	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {

+ 22
- 21
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeGenericVisitor.java 查看文件

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

+ 12
- 9
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java 查看文件

@@ -37,10 +37,12 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
37 37
 
38 38
 	private final JavaClassWriter outerWriter;
39 39
 	private final JavaBytecodeContext context;
40
+	final JavaTypeGenericVisitor javaTypeGenericVisitor;
40 41
 
41 42
     public JavaDefinitionVisitor(JavaBytecodeContext context, JavaClassWriter outerWriter) {
42 43
 		this.context = context;
43 44
 		this.outerWriter = outerWriter;
45
+	    this.javaTypeGenericVisitor = new JavaTypeGenericVisitor(context);
44 46
 	}
45 47
 
46 48
 	@Override
@@ -73,7 +75,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
73 75
 	@Override
74 76
 	public byte[] visitInterface(InterfaceDefinition definition) {
75 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 80
 		//TODO: Calculate signature from generic parameters
79 81
 		//TODO: Extending Interfaces?
@@ -98,7 +100,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
98 100
         else
99 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 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,8 +193,8 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
191 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 199
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, ss, "java/lang/Object", null);
198 200
 		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
@@ -206,6 +208,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
206 208
 			final String optionClassName = variantName + "$" + option.name;
207 209
 			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
208 210
 			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
211
+			JavaClassWriter.registerSuperClass(optionClassName, variantName);
209 212
 
210 213
 			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
211 214
 
@@ -220,7 +223,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
220 223
 				//TODO check if this can be changed to what Stan was up to
221 224
 				builder.append("<");
222 225
 				for (final ITypeID type : option.types) {
223
-					builder.append(JavaTypeGenericVisitor.getSignatureWithBound(type));
226
+					builder.append(javaTypeGenericVisitor.getSignatureWithBound(type));
224 227
 				}
225 228
 				builder.append(">");
226 229
 				builder.append("L").append(variantName).append("<");
@@ -236,7 +239,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
236 239
 							}
237 240
 						}
238 241
 					if (t)
239
-						builder.append(JavaTypeGenericVisitor.getGenericBounds(genericParameter.bounds));
242
+						builder.append(javaTypeGenericVisitor.getGenericBounds(genericParameter.bounds));
240 243
 
241 244
 				}
242 245
 
@@ -251,10 +254,10 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
251 254
 
252 255
 			ITypeID[] types = option.types;
253 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 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 262
 			optionInitDescBuilder.append(")V");
260 263
 			optionInitSignatureBuilder.append(")V");

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java 查看文件

@@ -141,12 +141,12 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
141 141
 		final Label methodStart = new Label();
142 142
 		final Label methodEnd = new Label();
143 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 145
 		methodWriter.label(methodStart);
146 146
 		for (final FunctionParameter parameter : member.header.parameters) {
147 147
 			methodWriter.nameParameter(0, parameter.name);
148 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 152
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, methodWriter);

Loading…
取消
儲存