Browse Source

WIP - Expansion methods

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

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

44
             String signature,
44
             String signature,
45
             String[] exceptions,
45
             String[] exceptions,
46
             String... annotations) {
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
         this.clazzVisitor = visitor;
61
         this.clazzVisitor = visitor;
48
         this.method = method;
62
         this.method = method;
49
         this.forDefinition = forDefinition;
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
         for (String annotation : annotations) {
67
         for (String annotation : annotations) {
54
             methodVisitor.visitAnnotation(annotation, true).visitEnd();
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
         this.nameVariables = nameVariables;
72
         this.nameVariables = nameVariables;
59
     }
73
     }
60
 
74
 
75
+
76
+
77
+
61
     public JavaWriter(ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
78
     public JavaWriter(ClassVisitor visitor, JavaMethod method, HighLevelDefinition forDefinition, String signature, String[] exceptions, String... annotations) {
62
         this(visitor, true, method, forDefinition, signature, exceptions, annotations);
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 View File

12
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
12
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
13
 import org.openzen.zenscript.javabytecode.compiler.*;
13
 import org.openzen.zenscript.javabytecode.compiler.*;
14
 
14
 
15
+import java.io.FileNotFoundException;
15
 import java.io.FileOutputStream;
16
 import java.io.FileOutputStream;
16
 import java.io.IOException;
17
 import java.io.IOException;
17
 import java.util.ArrayList;
18
 import java.util.ArrayList;
163
 		final String internalName = expansionClassInfo.internalName;
164
 		final String internalName = expansionClassInfo.internalName;
164
 
165
 
165
 		writer.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC |Opcodes.ACC_STATIC, internalName, null, "java/lang/Object", null);
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
 		for (IDefinitionMember member : definition.members) {
169
 		for (IDefinitionMember member : definition.members) {
169
 			member.accept(memberVisitor);
170
 			member.accept(memberVisitor);
171
 		memberVisitor.end();
172
 		memberVisitor.end();
172
 		writer.visitEnd();
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
 	@Override
187
 	@Override

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

2
 
2
 
3
 import org.objectweb.asm.ClassWriter;
3
 import org.objectweb.asm.ClassWriter;
4
 import org.objectweb.asm.Label;
4
 import org.objectweb.asm.Label;
5
+import org.objectweb.asm.Type;
6
+import org.openzen.zenscript.codemodel.FunctionParameter;
5
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
7
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
6
 import org.openzen.zenscript.codemodel.member.*;
8
 import org.openzen.zenscript.codemodel.member.*;
9
+import org.openzen.zenscript.codemodel.type.StoredType;
7
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
10
 import org.openzen.zenscript.javabytecode.JavaBytecodeContext;
8
 import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
11
 import org.openzen.zenscript.javabytecode.compiler.CompilerUtils;
9
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
12
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
10
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
13
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
11
-import org.openzen.zenscript.javashared.JavaClass;
12
 import org.openzen.zenscript.javashared.JavaCompiledModule;
14
 import org.openzen.zenscript.javashared.JavaCompiledModule;
13
 import org.openzen.zenscript.javashared.JavaField;
15
 import org.openzen.zenscript.javashared.JavaField;
14
 import org.openzen.zenscript.javashared.JavaMethod;
16
 import org.openzen.zenscript.javashared.JavaMethod;
17
 
19
 
18
 	private final ClassWriter writer;
20
 	private final ClassWriter writer;
19
 	private final JavaBytecodeContext context;
21
 	private final JavaBytecodeContext context;
20
-	private final JavaClass toClass;
22
+	private final StoredType expandedClass;
21
 	private final HighLevelDefinition definition;
23
 	private final HighLevelDefinition definition;
22
 	private final JavaCompiledModule javaModule;
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
 		this.writer = writer;
27
 		this.writer = writer;
26
-		this.toClass = toClass;
28
+		this.expandedClass = expandedClass;
27
 		this.definition = definition;
29
 		this.definition = definition;
28
 		this.context = context;
30
 		this.context = context;
29
 		javaModule = context.getJavaModule(definition.module);
31
 		javaModule = context.getJavaModule(definition.module);
58
 	public Void visitMethod(MethodMember member) {
60
 	public Void visitMethod(MethodMember member) {
59
 		final boolean isStatic = member.isStatic();
61
 		final boolean isStatic = member.isStatic();
60
 		final JavaMethod method = context.getJavaMethod(member);
62
 		final JavaMethod method = context.getJavaMethod(member);
61
-		if(!method.compile)
63
+		if (!method.compile)
62
 			return null;
64
 			return null;
63
 
65
 
64
 
66
 
65
 		CompilerUtils.tagMethodParameters(context, javaModule, member.header, member.isStatic());
67
 		CompilerUtils.tagMethodParameters(context, javaModule, member.header, member.isStatic());
66
 
68
 
67
-
69
+		final String expandedClassDescriptor = context.getDescriptor(expandedClass);
68
 		final Label methodStart = new Label();
70
 		final Label methodStart = new Label();
69
 		final Label methodEnd = new Label();
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
 		return null;
106
 		return null;
73
 	}
107
 	}
74
 
108
 
109
+
75
 	@Override
110
 	@Override
76
 	public Void visitGetter(GetterMember member) {
111
 	public Void visitGetter(GetterMember member) {
77
-		throw new IllegalStateException("Cannot add getters via expansions");
112
+		return null;
78
 	}
113
 	}
79
 
114
 
80
 	@Override
115
 	@Override
81
 	public Void visitSetter(SetterMember member) {
116
 	public Void visitSetter(SetterMember member) {
82
-		throw new IllegalStateException("Cannot add setters via expansions");
117
+		return null;
83
 	}
118
 	}
84
 
119
 
85
 	@Override
120
 	@Override

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

130
 		final Label methodStart = new Label();
130
 		final Label methodStart = new Label();
131
 		final Label methodEnd = new Label();
131
 		final Label methodEnd = new Label();
132
 	    final JavaWriter methodWriter = new JavaWriter(writer, method, definition, context.getMethodSignature(member.header), null);
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
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
134
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, javaModule, methodWriter);
141
 
135
 

Loading…
Cancel
Save