浏览代码

WIP - Expansion methods

kindlich 6 年前
父节点
当前提交
812211e240
找不到此签名对应的密钥

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

@@ -44,20 +44,37 @@ public class JavaWriter {
44 44
             String signature,
45 45
             String[] exceptions,
46 46
             String... annotations) {
47
+        this(visitor, nameVariables, method, forDefinition, false, signature, method.descriptor, exceptions, annotations);
48
+    }
49
+
50
+
51
+    public JavaWriter(
52
+            ClassVisitor visitor,
53
+            boolean nameVariables,
54
+            JavaMethod method,
55
+            HighLevelDefinition forDefinition,
56
+            boolean isExtension,
57
+            String signature,
58
+            String descriptor,
59
+            String[] exceptions,
60
+            String... annotations) {
47 61
         this.clazzVisitor = visitor;
48 62
         this.method = method;
49 63
         this.forDefinition = forDefinition;
50 64
 
51
-        final MethodVisitor methodVisitor = visitor.visitMethod(method.modifiers, method.name, method.descriptor, signature, exceptions);
65
+        final MethodVisitor methodVisitor = visitor.visitMethod(isExtension ? method.modifiers | Opcodes.ACC_STATIC : method.modifiers, method.name, descriptor, signature, exceptions);
52 66
 
53 67
         for (String annotation : annotations) {
54 68
             methodVisitor.visitAnnotation(annotation, true).visitEnd();
55 69
         }
56 70
 
57
-        this.visitor = new LocalVariablesSorter(method.modifiers, method.descriptor, methodVisitor);
71
+        this.visitor = new LocalVariablesSorter(isExtension ? method.modifiers | Opcodes.ACC_STATIC : method.modifiers, descriptor, methodVisitor);
58 72
         this.nameVariables = nameVariables;
59 73
     }
60 74
 
75
+
76
+
77
+
61 78
     public JavaWriter(ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
62 79
         this(visitor, true, method, forDefinition, signature, exceptions, annotations);
63 80
     }

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

@@ -12,6 +12,7 @@ import org.openzen.zenscript.codemodel.type.GenericTypeID;
12 12
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13 13
 import org.openzen.zenscript.javabytecode.compiler.*;
14 14
 
15
+import java.io.FileNotFoundException;
15 16
 import java.io.FileOutputStream;
16 17
 import java.io.IOException;
17 18
 import java.util.ArrayList;
@@ -163,7 +164,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
163 164
 		final String internalName = expansionClassInfo.internalName;
164 165
 
165 166
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC |Opcodes.ACC_STATIC, internalName, null, "java/lang/Object", null);
166
-		JavaExpansionMemberVisitor memberVisitor = new JavaExpansionMemberVisitor(context, writer, expansionClassInfo, definition);
167
+		JavaExpansionMemberVisitor memberVisitor = new JavaExpansionMemberVisitor(context, writer, definition.target, definition);
167 168
 
168 169
 		for (IDefinitionMember member : definition.members) {
169 170
 			member.accept(memberVisitor);
@@ -171,7 +172,16 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
171 172
 		memberVisitor.end();
172 173
 		writer.visitEnd();
173 174
 
174
-		return writer.toByteArray();
175
+
176
+		final byte[] classBytes = writer.toByteArray();
177
+
178
+		try (FileOutputStream out = new FileOutputStream("ttt.class")) {
179
+			out.write(classBytes);
180
+		} catch (IOException e) {
181
+			e.printStackTrace();
182
+		}
183
+
184
+		return classBytes;
175 185
 	}
176 186
 
177 187
 	@Override

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

@@ -2,13 +2,15 @@ package org.openzen.zenscript.javabytecode.compiler.definitions;
2 2
 
3 3
 import org.objectweb.asm.ClassWriter;
4 4
 import org.objectweb.asm.Label;
5
+import org.objectweb.asm.Type;
6
+import org.openzen.zenscript.codemodel.FunctionParameter;
5 7
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
6 8
 import org.openzen.zenscript.codemodel.member.*;
9
+import org.openzen.zenscript.codemodel.type.StoredType;
7 10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
8 11
 import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
9 12
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
10 13
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
11
-import org.openzen.zenscript.javashared.JavaClass;
12 14
 import org.openzen.zenscript.javashared.JavaCompiledModule;
13 15
 import org.openzen.zenscript.javashared.JavaField;
14 16
 import org.openzen.zenscript.javashared.JavaMethod;
@@ -17,13 +19,13 @@ public class JavaExpansionMemberVisitor implements MemberVisitor<Void> {
17 19
 
18 20
 	private final ClassWriter writer;
19 21
 	private final JavaBytecodeContext context;
20
-	private final JavaClass toClass;
22
+	private final StoredType expandedClass;
21 23
 	private final HighLevelDefinition definition;
22 24
 	private final JavaCompiledModule javaModule;
23 25
 
24
-	public JavaExpansionMemberVisitor(JavaBytecodeContext context, ClassWriter writer, JavaClass toClass, HighLevelDefinition definition) {
26
+	public JavaExpansionMemberVisitor(JavaBytecodeContext context, ClassWriter writer, StoredType expandedClass, HighLevelDefinition definition) {
25 27
 		this.writer = writer;
26
-		this.toClass = toClass;
28
+		this.expandedClass = expandedClass;
27 29
 		this.definition = definition;
28 30
 		this.context = context;
29 31
 		javaModule = context.getJavaModule(definition.module);
@@ -58,28 +60,61 @@ public class JavaExpansionMemberVisitor implements MemberVisitor<Void> {
58 60
 	public Void visitMethod(MethodMember member) {
59 61
 		final boolean isStatic = member.isStatic();
60 62
 		final JavaMethod method = context.getJavaMethod(member);
61
-		if(!method.compile)
63
+		if (!method.compile)
62 64
 			return null;
63 65
 
64 66
 
65 67
 		CompilerUtils.tagMethodParameters(context, javaModule, member.header, member.isStatic());
66 68
 
67
-
69
+		final String expandedClassDescriptor = context.getDescriptor(expandedClass);
68 70
 		final Label methodStart = new Label();
69 71
 		final Label methodEnd = new Label();
70
-		final JavaWriter methodWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
72
+		final String methodSignature;
73
+
74
+		if (!isStatic) {
75
+			methodSignature = "(" + expandedClassDescriptor + context.getMethodSignature(member.header).substring(1);
76
+		} else {
77
+			methodSignature = context.getMethodSignature(member.header);
78
+		}
79
+
80
+
81
+		final JavaWriter methodWriter = new JavaWriter(writer, true, method, definition, true, methodSignature, methodSignature, null);
82
+		methodWriter.label(methodStart);
83
+
84
+		if (!isStatic) {
85
+			methodWriter.nameVariable(0, "expandedObj", methodStart, methodEnd, Type.getType(expandedClassDescriptor));
86
+			for (final FunctionParameter parameter : member.header.parameters) {
87
+				methodWriter.nameParameter(0, parameter.name);
88
+				methodWriter.nameVariable(javaModule.getParameterInfo(parameter).index + 1, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
89
+			}
90
+		} else {
91
+			for (final FunctionParameter parameter : member.header.parameters) {
92
+				methodWriter.nameParameter(0, parameter.name);
93
+				methodWriter.nameVariable(javaModule.getParameterInfo(parameter).index, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
94
+			}
95
+		}
96
+
97
+
98
+		{
99
+			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
100
+			statementVisitor.start();
101
+			member.body.accept(statementVisitor);
102
+			methodWriter.label(methodEnd);
103
+			statementVisitor.end();
104
+		}
71 105
 
72 106
 		return null;
73 107
 	}
74 108
 
109
+
75 110
 	@Override
76 111
 	public Void visitGetter(GetterMember member) {
77
-		throw new IllegalStateException("Cannot add getters via expansions");
112
+		return null;
78 113
 	}
79 114
 
80 115
 	@Override
81 116
 	public Void visitSetter(SetterMember member) {
82
-		throw new IllegalStateException("Cannot add setters via expansions");
117
+		return null;
83 118
 	}
84 119
 
85 120
 	@Override

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

@@ -130,12 +130,6 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
130 130
 		final Label methodStart = new Label();
131 131
 		final Label methodEnd = new Label();
132 132
 	    final JavaWriter methodWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
133
-		methodWriter.label(methodStart);
134
-		for (final FunctionParameter parameter : member.header.parameters) {
135
-			methodWriter.nameParameter(0, parameter.name);
136
-			if (!isAbstract)
137
-				methodWriter.nameVariable(javaModule.getParameterInfo(parameter).index, parameter.name, methodStart, methodEnd, context.getType(parameter.type));
138
-		}
139 133
 
140 134
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
141 135
 

正在加载...
取消
保存