Browse Source

Merge remote-tracking branch 'remotes/kindlich/development' into development

# Conflicts:
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaFieldInfo.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaOptionalTypeClassVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreDecrementVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaPreIncrementVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeClassVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaTypeVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
#	JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
Stan Hebben 6 years ago
parent
commit
dfcdfe0827
35 changed files with 1473 additions and 1099 deletions
  1. 8
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java
  2. 6
    6
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/implementations/IntRange.java
  3. 0
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeImplementation.java
  4. 2
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java
  5. 5
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTargetType.java
  6. 2
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java
  7. 5
    4
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTargetType.java
  8. 20
    19
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  9. 12
    12
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaLocalVariableInfo.java
  10. 11
    12
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMethodInfo.java
  11. 11
    10
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java
  12. 1
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaParameterInfo.java
  13. 45
    51
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/CompilerUtils.java
  14. 115
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaBoxingTypeVisitor.java
  15. 31
    31
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaCapturedExpressionVisitor.java
  16. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaClassWriter.java
  17. 484
    400
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
  18. 67
    67
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachVisitor.java
  19. 3
    3
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java
  20. 280
    281
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java
  21. 1
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaSwitchLabel.java
  22. 4
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaWriter.java
  23. 194
    77
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaDefinitionVisitor.java
  24. 10
    10
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaInitializedVariables.java
  25. 96
    97
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaMemberVisitor.java
  26. 9
    0
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/definitions/JavaOptionInfoTag.java
  27. 0
    0
      ScriptingExample/scripts/ttt/classes.zs
  28. 0
    0
      ScriptingExample/scripts/ttt/conditionals.zs
  29. 0
    0
      ScriptingExample/scripts/ttt/functions.zs
  30. 22
    0
      ScriptingExample/scripts/ttt/functions_lambdas.zs
  31. 0
    0
      ScriptingExample/scripts/ttt/helloworld.zs
  32. 26
    1
      ScriptingExample/scripts/ttt/match.zs
  33. 0
    0
      ScriptingExample/scripts/ttt/moreHellos.zs
  34. 0
    0
      ScriptingExample/scripts/ttt/statements.zs
  35. 0
    0
      ScriptingExample/scripts/ttt/switch.zs

+ 8
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/member/ref/VariantOptionRef.java View File

@@ -32,4 +32,12 @@ public class VariantOptionRef {
32 32
 	public <T> T getTag(Class<T> type) {
33 33
 		return option.getTag(type);
34 34
 	}
35
+
36
+	public int getOrdinal() {
37
+		return option.ordinal;
38
+	}
39
+
40
+	public VariantDefinition.Option getOption() {
41
+		return option;
42
+	}
35 43
 }

+ 6
- 6
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/implementations/IntRange.java View File

@@ -1,12 +1,12 @@
1 1
 package org.openzen.zenscript.implementations;
2 2
 
3 3
 public class IntRange {
4
-    public final int from;
5
-    public final int to;
4
+	public final int from;
5
+	public final int to;
6 6
 
7 7
 
8
-    public IntRange(int from, int to) {
9
-        this.from = from;
10
-        this.to = to;
11
-    }
8
+	public IntRange(int from, int to) {
9
+		this.from = from;
10
+		this.to = to;
11
+	}
12 12
 }

+ 0
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeImplementation.java View File

@@ -8,7 +8,6 @@ package org.openzen.zenscript.javabytecode;
8 8
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
9 9
 
10 10
 /**
11
- *
12 11
  * @author Hoofdgebruiker
13 12
  */
14 13
 public interface JavaBytecodeImplementation {

+ 2
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTarget.java View File

@@ -11,7 +11,6 @@ import org.openzen.zenscript.compiler.SemanticModule;
11 11
 import org.openzen.zenscript.compiler.Target;
12 12
 
13 13
 /**
14
- *
15 14
  * @author Hoofdgebruiker
16 15
  */
17 16
 public class JavaBytecodeJarTarget implements Target {
@@ -19,14 +18,14 @@ public class JavaBytecodeJarTarget implements Target {
19 18
 	private final String name;
20 19
 	private final File file;
21 20
 	private final boolean debugCompiler;
22
-	
21
+
23 22
 	public JavaBytecodeJarTarget(JSONObject definition) {
24 23
 		module = definition.getString("module");
25 24
 		name = definition.getString("name");
26 25
 		file = new File(definition.getString("output"));
27 26
 		debugCompiler = definition.optBoolean("debugCompiler", false);
28 27
 	}
29
-	
28
+
30 29
 	@Override
31 30
 	public JavaCompiler createCompiler(SemanticModule module) {
32 31
 		return new JavaCompiler(debugCompiler, file);

+ 5
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeJarTargetType.java View File

@@ -5,19 +5,20 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
-import java.io.File;
9 8
 import org.json.JSONObject;
10 9
 import org.openzen.zenscript.compiler.Target;
11 10
 import org.openzen.zenscript.compiler.TargetType;
12 11
 
12
+import java.io.File;
13
+
13 14
 /**
14
- *
15 15
  * @author Hoofdgebruiker
16 16
  */
17 17
 public class JavaBytecodeJarTargetType implements TargetType {
18 18
 	public static final JavaBytecodeJarTargetType INSTANCE = new JavaBytecodeJarTargetType();
19
-	
20
-	private JavaBytecodeJarTargetType() {}
19
+
20
+	private JavaBytecodeJarTargetType() {
21
+	}
21 22
 
22 23
 	@Override
23 24
 	public Target create(File projectDir, JSONObject definition) {

+ 2
- 3
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTarget.java View File

@@ -10,20 +10,19 @@ import org.openzen.zenscript.compiler.SemanticModule;
10 10
 import org.openzen.zenscript.compiler.Target;
11 11
 
12 12
 /**
13
- *
14 13
  * @author Hoofdgebruiker
15 14
  */
16 15
 public class JavaBytecodeRunTarget implements Target {
17 16
 	private final String module;
18 17
 	private final String name;
19 18
 	private final boolean debugCompiler;
20
-	
19
+
21 20
 	public JavaBytecodeRunTarget(JSONObject definition) {
22 21
 		module = definition.getString("module");
23 22
 		name = definition.getString("name");
24 23
 		debugCompiler = definition.optBoolean("debugCompiler", false);
25 24
 	}
26
-	
25
+
27 26
 	@Override
28 27
 	public JavaCompiler createCompiler(SemanticModule module) {
29 28
 		return new JavaCompiler(debugCompiler, null);

+ 5
- 4
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunTargetType.java View File

@@ -5,19 +5,20 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
-import java.io.File;
9 8
 import org.json.JSONObject;
10 9
 import org.openzen.zenscript.compiler.Target;
11 10
 import org.openzen.zenscript.compiler.TargetType;
12 11
 
12
+import java.io.File;
13
+
13 14
 /**
14
- *
15 15
  * @author Hoofdgebruiker
16 16
  */
17 17
 public class JavaBytecodeRunTargetType implements TargetType {
18 18
 	public static final JavaBytecodeRunTargetType INSTANCE = new JavaBytecodeRunTargetType();
19
-	
20
-	private JavaBytecodeRunTargetType() {}
19
+
20
+	private JavaBytecodeRunTargetType() {
21
+	}
21 22
 
22 23
 	@Override
23 24
 	public Target create(File projectDir, JSONObject definition) {

+ 20
- 19
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java View File

@@ -16,17 +16,18 @@ import org.openzen.zenscript.codemodel.HighLevelDefinition;
16 16
 import org.openzen.zenscript.codemodel.ScriptBlock;
17 17
 import org.openzen.zenscript.codemodel.statement.Statement;
18 18
 import org.openzen.zenscript.compiler.SemanticModule;
19
-
19
+import org.openzen.zenscript.compiler.ZenCodeCompiler;
20 20
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
21 21
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
22
-import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
23 22
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
24 23
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
25
-import org.openzen.zenscript.compiler.ZenCodeCompiler;
24
+import org.openzen.zenscript.javabytecode.compiler.definitions.JavaDefinitionVisitor;
25
+
26
+import java.util.HashMap;
27
+import java.util.Map;
26 28
 import org.openzen.zenscript.javashared.JavaClass;
27 29
 
28 30
 /**
29
- *
30 31
  * @author Hoofdgebruiker
31 32
  */
32 33
 public class JavaCompiler implements ZenCodeCompiler {
@@ -41,7 +42,7 @@ public class JavaCompiler implements ZenCodeCompiler {
41 42
 	public JavaCompiler(File jarFile) {
42 43
 		this(false, jarFile);
43 44
 	}
44
-	
45
+
45 46
 	public JavaCompiler(boolean debug, File jarFile) {
46 47
 		target = new JavaModule();
47 48
 		this.jarFile = jarFile;
@@ -50,20 +51,20 @@ public class JavaCompiler implements ZenCodeCompiler {
50 51
 		scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
51 52
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
52 53
 	}
53
-	
54
+
54 55
 	@Override
55 56
 	public void addDefinition(HighLevelDefinition definition, SemanticModule module) {
56 57
 		String className = getClassName(definition.position.getFilename());
57 58
 		JavaScriptFile scriptFile = getScriptFile(className);
58 59
 		target.register(definition.name, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
59 60
 	}
60
-	
61
+
61 62
 	@Override
62 63
 	public void addScriptBlock(ScriptBlock script) {
63 64
 		final SourceFile sourceFile = script.getTag(SourceFile.class);
64 65
 		final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
65 66
 		JavaScriptFile scriptFile = getScriptFile(className);
66
-		
67
+
67 68
 		String methodName = scriptFile.scriptMethods.isEmpty() ? "run" : "run" + scriptFile.scriptMethods.size();
68 69
 
69 70
 		// convert scripts into methods (add them to a Scripts class?)
@@ -71,7 +72,7 @@ public class JavaCompiler implements ZenCodeCompiler {
71 72
 		final JavaClassWriter visitor = scriptFile.classWriter;
72 73
 		JavaMethodInfo method = new JavaMethodInfo(new JavaClass(script.pkg.fullName, className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
73 74
 		scriptFile.scriptMethods.add(method);
74
-		
75
+
75 76
 		final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, new JavaWriter(visitor, method, null, null, null));
76 77
 		statementVisitor.start();
77 78
 		for (Statement statement : script.statements) {
@@ -80,7 +81,7 @@ public class JavaCompiler implements ZenCodeCompiler {
80 81
 		target.register("Scripts", scriptsClassWriter.toByteArray());
81 82
 		statementVisitor.end();
82 83
 	}
83
-	
84
+
84 85
 	private String getClassName(String filename) {
85 86
 		if (filename == null) {
86 87
 			return "generatedBlock" + (generatedScriptBlockCounter++);
@@ -90,26 +91,26 @@ public class JavaCompiler implements ZenCodeCompiler {
90 91
 			return filename.substring(0, filename.lastIndexOf('.')).replace("/", "_");
91 92
 		}
92 93
 	}
93
-	
94
+
94 95
 	private JavaScriptFile getScriptFile(String className) {
95 96
 		if (!scriptBlocks.containsKey(className)) {
96 97
 			JavaClassWriter scriptFileWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
97 98
 			scriptFileWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null);
98 99
 			scriptBlocks.put(className, new JavaScriptFile(scriptFileWriter));
99 100
 		}
100
-		
101
+
101 102
 		return scriptBlocks.get(className);
102 103
 	}
103
-	
104
+
104 105
 	@Override
105 106
 	public void finish() {
106 107
 		JavaModule module = finishAndGetModule();
107
-		
108
+
108 109
 		if (jarFile != null) {
109 110
 			// TODO: write module to a Jar file
110 111
 		}
111 112
 	}
112
-	
113
+
113 114
 	@Override
114 115
 	public void run() {
115 116
 		if (!finished)
@@ -117,26 +118,26 @@ public class JavaCompiler implements ZenCodeCompiler {
117 118
 		
118 119
 		// TODO: execute this
119 120
 	}
120
-	
121
+
121 122
 	public JavaModule finishAndGetModule() {
122 123
 		if (finished)
123 124
 			throw new IllegalStateException("Already finished!");
124 125
 		
125 126
 		finished = true;
126
-		
127
+
127 128
 		JavaMethodInfo runMethod = new JavaMethodInfo(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
128 129
 		final JavaWriter runWriter = new JavaWriter(scriptsClassWriter, runMethod, null, null, null);
129 130
 		runWriter.start();
130 131
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
131 132
 			for (JavaMethodInfo method : entry.getValue().scriptMethods)
132 133
 				runWriter.invokeStatic(method);
133
-			
134
+
134 135
 			entry.getValue().classWriter.visitEnd();
135 136
 			target.register(entry.getKey(), entry.getValue().classWriter.toByteArray());
136 137
 		}
137 138
 		runWriter.ret();
138 139
 		runWriter.end();
139
-		
140
+
140 141
 		target.register("Scripts", scriptsClassWriter.toByteArray());
141 142
 		return target;
142 143
 	}

+ 12
- 12
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaLocalVariableInfo.java View File

@@ -4,17 +4,17 @@ import org.objectweb.asm.Label;
4 4
 import org.objectweb.asm.Type;
5 5
 
6 6
 public class JavaLocalVariableInfo {
7
-    public final Type type;
8
-    public final int local;
9
-    public final Label start;
10
-    public final String name;
11
-    public Label end;
7
+	public final Type type;
8
+	public final int local;
9
+	public final Label start;
10
+	public final String name;
11
+	public Label end;
12 12
 
13
-    public JavaLocalVariableInfo(Type type, int local, Label start, String name) {
14
-        this.type = type;
15
-        this.local = local;
16
-        this.start = start;
17
-        this.end = start;
18
-        this.name = name;
19
-    }
13
+	public JavaLocalVariableInfo(Type type, int local, Label start, String name) {
14
+		this.type = type;
15
+		this.local = local;
16
+		this.start = start;
17
+		this.end = start;
18
+		this.name = name;
19
+	}
20 20
 }

+ 11
- 12
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaMethodInfo.java View File

@@ -10,33 +10,32 @@ import org.objectweb.asm.Type;
10 10
 import org.openzen.zenscript.javashared.JavaClass;
11 11
 
12 12
 /**
13
- *
14 13
  * @author Hoofdgebruiker
15 14
  */
16 15
 public class JavaMethodInfo {
17 16
 	public static JavaMethodInfo get(int modifiers, Class owner, String name, Class result, Class... arguments) {
18
-        StringBuilder descriptor = new StringBuilder();
19
-        descriptor.append('(');
20
-        for (Class argument : arguments) {
21
-            descriptor.append(Type.getDescriptor(argument));
22
-        }
23
-        descriptor.append(')');
24
-        descriptor.append(result == null ? 'V' : Type.getDescriptor(result));
17
+		StringBuilder descriptor = new StringBuilder();
18
+		descriptor.append('(');
19
+		for (Class argument : arguments) {
20
+			descriptor.append(Type.getDescriptor(argument));
21
+		}
22
+		descriptor.append(')');
23
+		descriptor.append(result == null ? 'V' : Type.getDescriptor(result));
25 24
 		return new JavaMethodInfo(JavaCompileUtils.get(owner), name, descriptor.toString(), modifiers);
26
-    }
27
-	
25
+	}
26
+
28 27
 	public final JavaClass javaClass;
29 28
 	public final String name;
30 29
 	public final String descriptor;
31 30
 	public final int modifiers;
32
-	
31
+
33 32
 	public JavaMethodInfo(JavaClass javaClass, String name, String signature, int modifiers) {
34 33
 		this.javaClass = javaClass;
35 34
 		this.name = name;
36 35
 		this.descriptor = signature;
37 36
 		this.modifiers = modifiers;
38 37
 	}
39
-	
38
+
40 39
 	public boolean isStatic() {
41 40
 		return (modifiers & Opcodes.ACC_STATIC) > 0;
42 41
 	}

+ 11
- 10
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaModule.java View File

@@ -5,7 +5,9 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode;
7 7
 
8
-import java.io.*;
8
+import java.io.File;
9
+import java.io.FileOutputStream;
10
+import java.io.IOException;
9 11
 import java.lang.reflect.InvocationTargetException;
10 12
 import java.util.HashMap;
11 13
 import java.util.Map;
@@ -13,36 +15,35 @@ import java.util.logging.Level;
13 15
 import java.util.logging.Logger;
14 16
 
15 17
 /**
16
- *
17 18
  * @author Hoofdgebruiker
18 19
  */
19 20
 public class JavaModule {
20 21
 	public static final Map<String, byte[]> classes = new HashMap<>();
21
-	
22
+
22 23
 	public JavaModule() {
23
-		
24
+
24 25
 	}
25
-	
26
+
26 27
 	public void register(String classname, byte[] bytecode) {
27
-		if(bytecode == null) return;
28
+		if (bytecode == null) return;
28 29
 		classes.put(classname, bytecode);
29
-		try(FileOutputStream writer = new FileOutputStream(new File(classname + ".class"))) {
30
+		try (FileOutputStream writer = new FileOutputStream(new File(classname + ".class"))) {
30 31
 			writer.write(bytecode);
31 32
 		} catch (IOException e) {
32 33
 			e.printStackTrace();
33 34
 		}
34 35
 	}
35
-	
36
+
36 37
 	public void execute() {
37 38
 		ScriptClassLoader classLoader = new ScriptClassLoader();
38
-		
39
+
39 40
 		try {
40 41
 			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
41 42
 		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
42 43
 			Logger.getLogger(JavaModule.class.getName()).log(Level.SEVERE, null, ex);
43 44
 		}
44 45
 	}
45
-	
46
+
46 47
 	public class ScriptClassLoader extends ClassLoader {
47 48
 		private final Map<String, Class> customClasses = new HashMap<>();
48 49
 

+ 1
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaParameterInfo.java View File

@@ -8,13 +8,12 @@ package org.openzen.zenscript.javabytecode;
8 8
 import org.objectweb.asm.Type;
9 9
 
10 10
 /**
11
- *
12 11
  * @author Hoofdgebruiker
13 12
  */
14 13
 public class JavaParameterInfo {
15 14
 	public final int index;
16 15
 	public final Type type;
17
-	
16
+
18 17
 	public JavaParameterInfo(int index, Type type) {
19 18
 		this.index = index;
20 19
 		this.type = type;

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

@@ -8,13 +8,7 @@ import org.openzen.zenscript.codemodel.FunctionHeader;
8 8
 import org.openzen.zenscript.codemodel.FunctionParameter;
9 9
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
10 10
 import org.openzen.zenscript.codemodel.Modifiers;
11
-import org.openzen.zenscript.codemodel.expression.switchvalue.CharSwitchValue;
12
-import org.openzen.zenscript.codemodel.expression.switchvalue.EnumConstantSwitchValue;
13
-import org.openzen.zenscript.codemodel.expression.switchvalue.IntSwitchValue;
14
-import org.openzen.zenscript.codemodel.expression.switchvalue.StringSwitchValue;
15
-import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValue;
16
-import org.openzen.zenscript.codemodel.expression.switchvalue.SwitchValueVisitor;
17
-import org.openzen.zenscript.codemodel.expression.switchvalue.VariantOptionSwitchValue;
11
+import org.openzen.zenscript.codemodel.expression.switchvalue.*;
18 12
 import org.openzen.zenscript.codemodel.member.FieldMember;
19 13
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
20 14
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
@@ -34,47 +28,47 @@ import org.openzen.zenscript.javashared.JavaSynthesizedClassNamer;
34 28
 public class CompilerUtils {
35 29
 	private CompilerUtils() {}
36 30
 
37
-    public static boolean isPrimitive(ITypeID id) {
38
-        if (id instanceof BasicTypeID) {
39
-            switch ((BasicTypeID) id) {
40
-                case BOOL:
41
-                case BYTE:
42
-                case SBYTE:
43
-                case SHORT:
44
-                case USHORT:
45
-                case INT:
46
-                case UINT:
47
-                case LONG:
48
-                case ULONG:
49
-                case FLOAT:
50
-                case DOUBLE:
51
-                case CHAR:
52
-                    return true;
53
-            }
54
-        }
55
-        return false;
56
-    }
31
+	public static boolean isPrimitive(ITypeID id) {
32
+		if (id instanceof BasicTypeID) {
33
+			switch ((BasicTypeID) id) {
34
+				case BOOL:
35
+				case BYTE:
36
+				case SBYTE:
37
+				case SHORT:
38
+				case USHORT:
39
+				case INT:
40
+				case UINT:
41
+				case LONG:
42
+				case ULONG:
43
+				case FLOAT:
44
+				case DOUBLE:
45
+				case CHAR:
46
+					return true;
47
+			}
48
+		}
49
+		return false;
50
+	}
57 51
 
58
-    public static int calcAccess(int modifiers) {
59
-        int out = 0;
60
-        if (Modifiers.isStatic(modifiers))
61
-            out |= Opcodes.ACC_STATIC;
62
-        if (Modifiers.isFinal(modifiers))
63
-            out |= Opcodes.ACC_FINAL;
64
-        if (Modifiers.isPublic(modifiers))
65
-            out |= Opcodes.ACC_PUBLIC;
66
-        if (Modifiers.isPrivate(modifiers))
67
-            out |= Opcodes.ACC_PRIVATE;
68
-        if (Modifiers.isProtected(modifiers))
69
-            out |= Opcodes.ACC_PROTECTED;
70
-        if (Modifiers.isAbstract(modifiers))
71
-            out |= Opcodes.ACC_ABSTRACT;
72
-        return out;
73
-    }
52
+	public static int calcAccess(int modifiers) {
53
+		int out = 0;
54
+		if (Modifiers.isStatic(modifiers))
55
+			out |= Opcodes.ACC_STATIC;
56
+		if (Modifiers.isFinal(modifiers))
57
+			out |= Opcodes.ACC_FINAL;
58
+		if (Modifiers.isPublic(modifiers))
59
+			out |= Opcodes.ACC_PUBLIC;
60
+		if (Modifiers.isPrivate(modifiers))
61
+			out |= Opcodes.ACC_PRIVATE;
62
+		if (Modifiers.isProtected(modifiers))
63
+			out |= Opcodes.ACC_PROTECTED;
64
+		if (Modifiers.isAbstract(modifiers))
65
+			out |= Opcodes.ACC_ABSTRACT;
66
+		return out;
67
+	}
74 68
 
75
-    public static String calcClasName(CodePosition position) {
76
-        return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
77
-    }
69
+	public static String calcClasName(CodePosition position) {
70
+		return position.getFilename().substring(0, position.getFilename().lastIndexOf('.')).replace("/", "_");
71
+	}
78 72
 
79 73
     public static void tagMethodParameters(JavaContext context, FunctionHeader header, boolean isStatic) {
80 74
         for (int i = 0; i < header.parameters.length; i++) {
@@ -153,10 +147,10 @@ public class CompilerUtils {
153 147
         return "lambda" + ++lambdaCounter;
154 148
     }
155 149
 
156
-    public static int getKeyForSwitch(SwitchValue expression) {
150
+	public static int getKeyForSwitch(SwitchValue expression) {
157 151
 		return expression.accept(new SwitchKeyVisitor());
158
-    }
159
-	
152
+	}
153
+
160 154
 	private static class SwitchKeyVisitor implements SwitchValueVisitor<Integer> {
161 155
 
162 156
 		@Override
@@ -166,7 +160,7 @@ public class CompilerUtils {
166 160
 
167 161
 		@Override
168 162
 		public Integer acceptChar(CharSwitchValue value) {
169
-			return (int)value.value;
163
+			return (int) value.value;
170 164
 		}
171 165
 
172 166
 		@Override
@@ -181,7 +175,7 @@ public class CompilerUtils {
181 175
 
182 176
 		@Override
183 177
 		public Integer acceptVariantOption(VariantOptionSwitchValue value) {
184
-			throw new UnsupportedOperationException("Not there yet");
178
+			return value.option.getOrdinal();
185 179
 		}
186 180
 	}
187 181
 }

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

@@ -0,0 +1,115 @@
1
+package org.openzen.zenscript.javabytecode.compiler;
2
+
3
+import org.openzen.zenscript.codemodel.type.*;
4
+import org.openzen.zenscript.javabytecode.JavaMethodInfo;
5
+import org.openzen.zenscript.javashared.JavaClass;
6
+
7
+public class JavaBoxingTypeVisitor implements ITypeVisitor<JavaMethodInfo> {
8
+
9
+	private final JavaWriter writer;
10
+
11
+	public JavaBoxingTypeVisitor(JavaWriter writer) {
12
+		this.writer = writer;
13
+	}
14
+
15
+	@Override
16
+	public JavaMethodInfo visitBasic(BasicTypeID basic) {
17
+		final JavaMethodInfo info;
18
+		switch (basic) {
19
+			case BOOL:
20
+				writer.newObject(Boolean.class);
21
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Boolean", JavaClass.Kind.CLASS), "<init>", "(Z)V", -1);
22
+				break;
23
+			case BYTE:
24
+			case SBYTE:
25
+				writer.newObject(Byte.class);
26
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Byte", JavaClass.Kind.CLASS), "<init>", "(B)V", -1);
27
+				break;
28
+			case SHORT:
29
+			case USHORT:
30
+				writer.newObject(Short.class);
31
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Short", JavaClass.Kind.CLASS), "<init>", "(S)V", -1);
32
+				break;
33
+			case INT:
34
+			case UINT:
35
+				writer.newObject(Byte.class);
36
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Byte", JavaClass.Kind.CLASS), "<init>", "(B)V", -1);
37
+				break;
38
+			case LONG:
39
+			case ULONG:
40
+				writer.newObject(Long.class);
41
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Long", JavaClass.Kind.CLASS), "<init>", "(S)V", -1);
42
+				break;
43
+			case FLOAT:
44
+				writer.newObject(Float.class);
45
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Float", JavaClass.Kind.CLASS), "<init>", "(F)V", -1);
46
+				break;
47
+			case DOUBLE:
48
+				writer.newObject(Double.class);
49
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Double", JavaClass.Kind.CLASS), "<init>", "(D)V", -1);
50
+				break;
51
+			case CHAR:
52
+				writer.newObject(Character.class);
53
+				info = new JavaMethodInfo(new JavaClass("java.lang", "Character", JavaClass.Kind.CLASS), "<init>", "(C)V", -1);
54
+				break;
55
+			default:
56
+				return null;
57
+		}
58
+		writer.dup();
59
+		return info;
60
+	}
61
+
62
+	@Override
63
+	public JavaMethodInfo visitArray(ArrayTypeID array) {
64
+		//NO-OP
65
+		return null;
66
+	}
67
+
68
+	@Override
69
+	public JavaMethodInfo visitAssoc(AssocTypeID assoc) {
70
+		//NO-OP
71
+		return null;
72
+	}
73
+
74
+	@Override
75
+	public JavaMethodInfo visitGenericMap(GenericMapTypeID map) {
76
+		//NO-OP
77
+		return null;
78
+	}
79
+
80
+	@Override
81
+	public JavaMethodInfo visitIterator(IteratorTypeID iterator) {
82
+		//NO-OP
83
+		return null;
84
+	}
85
+
86
+	@Override
87
+	public JavaMethodInfo visitFunction(FunctionTypeID function) {
88
+		//NO-OP
89
+		return null;
90
+	}
91
+
92
+	@Override
93
+	public JavaMethodInfo visitDefinition(DefinitionTypeID definition) {
94
+		//NO-OP
95
+		return null;
96
+	}
97
+
98
+	@Override
99
+	public JavaMethodInfo visitGeneric(GenericTypeID generic) {
100
+		//NO-OP
101
+		return null;
102
+	}
103
+
104
+	@Override
105
+	public JavaMethodInfo visitRange(RangeTypeID range) {
106
+		//NO-OP
107
+		return null;
108
+	}
109
+
110
+	@Override
111
+	public JavaMethodInfo visitModified(ModifiedTypeID type) {
112
+		//NO-OP
113
+		return null;
114
+	}
115
+}

+ 31
- 31
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaCapturedExpressionVisitor.java View File

@@ -4,35 +4,35 @@ import org.openzen.zenscript.codemodel.expression.*;
4 4
 
5 5
 public class JavaCapturedExpressionVisitor implements CapturedExpressionVisitor<Void> {
6 6
 
7
-    public final JavaExpressionVisitor expressionVisitor;
8
-
9
-    public JavaCapturedExpressionVisitor(JavaExpressionVisitor expressionVisitor) {
10
-        this.expressionVisitor = expressionVisitor;
11
-    }
12
-
13
-    @Override
14
-    public Void visitCapturedThis(CapturedThisExpression expression) {
15
-        return null;
16
-    }
17
-
18
-    @Override
19
-    public Void visitCapturedParameter(CapturedParameterExpression expression) {
20
-        return new GetFunctionParameterExpression(expression.position, expression.parameter).accept(expressionVisitor);
21
-    }
22
-
23
-    @Override
24
-    public Void visitCapturedLocal(CapturedLocalVariableExpression expression) {
25
-        return new GetLocalVariableExpression(expression.position, expression.variable)
26
-                .accept(expressionVisitor);
27
-    }
28
-
29
-    @Override
30
-    public Void visitCapturedDirect(CapturedDirectExpression expression) {
31
-        return expression.value.accept(expressionVisitor);
32
-    }
33
-
34
-    @Override
35
-    public Void visitRecaptured(CapturedClosureExpression expression) {
36
-        return expression.value.accept(this);
37
-    }
7
+	public final JavaExpressionVisitor expressionVisitor;
8
+
9
+	public JavaCapturedExpressionVisitor(JavaExpressionVisitor expressionVisitor) {
10
+		this.expressionVisitor = expressionVisitor;
11
+	}
12
+
13
+	@Override
14
+	public Void visitCapturedThis(CapturedThisExpression expression) {
15
+		return null;
16
+	}
17
+
18
+	@Override
19
+	public Void visitCapturedParameter(CapturedParameterExpression expression) {
20
+		return new GetFunctionParameterExpression(expression.position, expression.parameter).accept(expressionVisitor);
21
+	}
22
+
23
+	@Override
24
+	public Void visitCapturedLocal(CapturedLocalVariableExpression expression) {
25
+		return new GetLocalVariableExpression(expression.position, expression.variable)
26
+				.accept(expressionVisitor);
27
+	}
28
+
29
+	@Override
30
+	public Void visitCapturedDirect(CapturedDirectExpression expression) {
31
+		return expression.value.accept(expressionVisitor);
32
+	}
33
+
34
+	@Override
35
+	public Void visitRecaptured(CapturedClosureExpression expression) {
36
+		return expression.value.accept(this);
37
+	}
38 38
 }

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

@@ -3,7 +3,7 @@ package org.openzen.zenscript.javabytecode.compiler;
3 3
 import org.objectweb.asm.ClassWriter;
4 4
 
5 5
 public class JavaClassWriter extends ClassWriter {
6
-    public JavaClassWriter(int flags) {
7
-        super(flags);
8
-    }
6
+	public JavaClassWriter(int flags) {
7
+		super(flags);
8
+	}
9 9
 }

+ 484
- 400
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java
File diff suppressed because it is too large
View File


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

@@ -8,54 +8,54 @@ import org.openzen.zenscript.javabytecode.JavaLocalVariableInfo;
8 8
 
9 9
 public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
10 10
 
11
-    private final JavaWriter javaWriter;
12
-    private final VarStatement[] variables;
13
-    private final Statement content;
14
-    private final Label startLabel;
15
-    private final Label endLabel;
16
-    private final JavaStatementVisitor statementVisitor;
17
-
18
-    public JavaForeachVisitor(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
19
-        this.statementVisitor = statementVisitor;
20
-        this.javaWriter = statementVisitor.getJavaWriter();
21
-        this.variables = variables;
22
-        this.content = content;
23
-        this.startLabel = start;
24
-        this.endLabel = end;
25
-    }
26
-
27
-    @Override
28
-    public Void visitIntRange() {
29
-        javaWriter.dup();
30
-        javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "to", "I");
31
-        javaWriter.swap();
32
-        javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "from", "I");
33
-
34
-        final int z = variables[0].getTag(JavaLocalVariableInfo.class).local;
35
-        javaWriter.storeInt(z);
36
-        javaWriter.label(startLabel);
37
-        javaWriter.dup();
38
-        javaWriter.loadInt(z);
39
-        javaWriter.ifICmpLE(endLabel);
40
-
41
-        content.accept(statementVisitor);
42
-        javaWriter.iinc(z);
43
-
44
-
45
-        return null;
46
-    }
47
-
48
-    @Override
49
-    public Void visitArrayValueIterator() {
50
-        handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
51
-        return null;
52
-    }
53
-
54
-    @Override
55
-    public Void visitArrayKeyValueIterator() {
56
-        handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
57
-        return null;
58
-    }
11
+	private final JavaWriter javaWriter;
12
+	private final VarStatement[] variables;
13
+	private final Statement content;
14
+	private final Label startLabel;
15
+	private final Label endLabel;
16
+	private final JavaStatementVisitor statementVisitor;
17
+
18
+	public JavaForeachVisitor(JavaStatementVisitor statementVisitor, VarStatement[] variables, Statement content, Label start, Label end) {
19
+		this.statementVisitor = statementVisitor;
20
+		this.javaWriter = statementVisitor.getJavaWriter();
21
+		this.variables = variables;
22
+		this.content = content;
23
+		this.startLabel = start;
24
+		this.endLabel = end;
25
+	}
26
+
27
+	@Override
28
+	public Void visitIntRange() {
29
+		javaWriter.dup();
30
+		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "to", "I");
31
+		javaWriter.swap();
32
+		javaWriter.getField("org/openzen/zenscript/implementations/IntRange", "from", "I");
33
+
34
+		final int z = variables[0].getTag(JavaLocalVariableInfo.class).local;
35
+		javaWriter.storeInt(z);
36
+		javaWriter.label(startLabel);
37
+		javaWriter.dup();
38
+		javaWriter.loadInt(z);
39
+		javaWriter.ifICmpLE(endLabel);
40
+
41
+		content.accept(statementVisitor);
42
+		javaWriter.iinc(z);
43
+
44
+
45
+		return null;
46
+	}
47
+
48
+	@Override
49
+	public Void visitArrayValueIterator() {
50
+		handleArray(javaWriter.local(int.class), variables[0].getTag(JavaLocalVariableInfo.class));
51
+		return null;
52
+	}
53
+
54
+	@Override
55
+	public Void visitArrayKeyValueIterator() {
56
+		handleArray(variables[0].getTag(JavaLocalVariableInfo.class).local, variables[1].getTag(JavaLocalVariableInfo.class));
57
+		return null;
58
+	}
59 59
 
60 60
 	@Override
61 61
 	public Void visitStringCharacterIterator() {
@@ -63,30 +63,30 @@ public class JavaForeachVisitor implements ForeachIteratorVisitor<Void> {
63 63
 		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
64 64
 	}
65 65
 
66
-    private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
67
-        javaWriter.iConst0();
68
-        javaWriter.storeInt(z);
66
+	private void handleArray(final int z, final JavaLocalVariableInfo arrayTypeInfo) {
67
+		javaWriter.iConst0();
68
+		javaWriter.storeInt(z);
69 69
 
70
-        javaWriter.label(startLabel);
71
-        javaWriter.dup();
72
-        javaWriter.dup();
73
-        javaWriter.arrayLength();
74
-        javaWriter.loadInt(z);
70
+		javaWriter.label(startLabel);
71
+		javaWriter.dup();
72
+		javaWriter.dup();
73
+		javaWriter.arrayLength();
74
+		javaWriter.loadInt(z);
75 75
 
76
-        javaWriter.ifICmpLE(endLabel);
77
-        javaWriter.loadInt(z);
76
+		javaWriter.ifICmpLE(endLabel);
77
+		javaWriter.loadInt(z);
78 78
 
79 79
 
80
-        javaWriter.arrayLoad(arrayTypeInfo.type);
81
-        javaWriter.store(arrayTypeInfo.type, arrayTypeInfo.local);
82
-        content.accept(statementVisitor);
83
-        javaWriter.iinc(z);
84
-    }
80
+		javaWriter.arrayLoad(arrayTypeInfo.type);
81
+		javaWriter.store(arrayTypeInfo.type, arrayTypeInfo.local);
82
+		content.accept(statementVisitor);
83
+		javaWriter.iinc(z);
84
+	}
85 85
 
86
-    @Override
87
-    public Void visitCustomIterator() {
88
-        return null;
89
-    }
86
+	@Override
87
+	public Void visitCustomIterator() {
88
+		return null;
89
+	}
90 90
 
91 91
 	@Override
92 92
 	public Void visitAssocKeyIterator() {

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

@@ -5,18 +5,18 @@
5 5
  */
6 6
 package org.openzen.zenscript.javabytecode.compiler;
7 7
 
8
+import org.openzen.zenscript.javabytecode.JavaMethodInfo;
9
+
8 10
 import java.util.ArrayList;
9 11
 import java.util.List;
10
-import org.openzen.zenscript.javabytecode.JavaMethodInfo;
11 12
 
12 13
 /**
13
- *
14 14
  * @author Hoofdgebruiker
15 15
  */
16 16
 public class JavaScriptFile {
17 17
 	public final JavaClassWriter classWriter;
18 18
 	public final List<JavaMethodInfo> scriptMethods;
19
-	
19
+
20 20
 	public JavaScriptFile(JavaClassWriter classWriter) {
21 21
 		this.classWriter = classWriter;
22 22
 		this.scriptMethods = new ArrayList<>();

+ 280
- 281
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaStatementVisitor.java View File

@@ -32,72 +32,72 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
32 32
         this.expressionVisitor = expressionVisitor;
33 33
     }
34 34
 
35
-    @Override
36
-    public Boolean visitBlock(BlockStatement statement) {
37
-        Boolean returns = false;
38
-        for (Statement statement1 : statement.statements) {
39
-            returns = statement1.accept(this);
40
-        }
41
-        return returns;
42
-    }
43
-
44
-    @Override
45
-    public Boolean visitBreak(BreakStatement statement) {
46
-        javaWriter.goTo(javaWriter.getNamedLabel(statement.target.label + "_end"));
47
-        return false;
48
-    }
49
-
50
-    @Override
51
-    public Boolean visitContinue(ContinueStatement statement) {
52
-        javaWriter.goTo(javaWriter.getNamedLabel(statement.target.label + "_start"));
53
-        return false;
54
-    }
55
-
56
-    @Override
57
-    public Boolean visitDoWhile(DoWhileStatement statement) {
58
-        Label start = new Label();
59
-        Label end = new Label();
60
-        if (statement.label == null)
61
-            statement.label = javaWriter.createLabelName() + "DoWhile";
62
-        javaWriter.putNamedLabel(start, statement.label + "_start");
63
-        javaWriter.putNamedLabel(end, statement.label + "_end");
64
-        javaWriter.label(start);
65
-        statement.content.accept(this);
66
-
67
-        statement.condition.accept(expressionVisitor);
68
-        javaWriter.ifNE(start);
69
-
70
-        //Only needed for break statements, should be nop if not used
71
-        javaWriter.label(end);
72
-        return false;
73
-    }
74
-
75
-    @Override
76
-    public Boolean visitEmpty(EmptyStatement statement) {
77
-        //No-Op
78
-        return false;
79
-    }
80
-
81
-    @Override
82
-    public Boolean visitExpression(ExpressionStatement statement) {
83
-        statement.expression.accept(expressionVisitor);
84
-        return false;
85
-    }
86
-
87
-    @Override
88
-    public Boolean visitForeach(ForeachStatement statement) {
89
-        //Create Labels
90
-        Label start = new Label();
91
-        Label end = new Label();
92
-        if (statement.label == null) {
93
-            statement.label = javaWriter.createLabelName() + "ForEach";
94
-        }
95
-        javaWriter.putNamedLabel(start, statement.label + "_start");
96
-        javaWriter.putNamedLabel(end, statement.label + "_end");
97
-
98
-
99
-        //Compile Array/Collection
100
-        statement.list.accept(expressionVisitor);
35
+	@Override
36
+	public Boolean visitBlock(BlockStatement statement) {
37
+		Boolean returns = false;
38
+		for (Statement statement1 : statement.statements) {
39
+			returns = statement1.accept(this);
40
+		}
41
+		return returns;
42
+	}
43
+
44
+	@Override
45
+	public Boolean visitBreak(BreakStatement statement) {
46
+		javaWriter.goTo(javaWriter.getNamedLabel(statement.target.label + "_end"));
47
+		return false;
48
+	}
49
+
50
+	@Override
51
+	public Boolean visitContinue(ContinueStatement statement) {
52
+		javaWriter.goTo(javaWriter.getNamedLabel(statement.target.label + "_start"));
53
+		return false;
54
+	}
55
+
56
+	@Override
57
+	public Boolean visitDoWhile(DoWhileStatement statement) {
58
+		Label start = new Label();
59
+		Label end = new Label();
60
+		if (statement.label == null)
61
+			statement.label = javaWriter.createLabelName() + "DoWhile";
62
+		javaWriter.putNamedLabel(start, statement.label + "_start");
63
+		javaWriter.putNamedLabel(end, statement.label + "_end");
64
+		javaWriter.label(start);
65
+		statement.content.accept(this);
66
+
67
+		statement.condition.accept(expressionVisitor);
68
+		javaWriter.ifNE(start);
69
+
70
+		//Only needed for break statements, should be nop if not used
71
+		javaWriter.label(end);
72
+		return false;
73
+	}
74
+
75
+	@Override
76
+	public Boolean visitEmpty(EmptyStatement statement) {
77
+		//No-Op
78
+		return false;
79
+	}
80
+
81
+	@Override
82
+	public Boolean visitExpression(ExpressionStatement statement) {
83
+		statement.expression.accept(expressionVisitor);
84
+		return false;
85
+	}
86
+
87
+	@Override
88
+	public Boolean visitForeach(ForeachStatement statement) {
89
+		//Create Labels
90
+		Label start = new Label();
91
+		Label end = new Label();
92
+		if (statement.label == null) {
93
+			statement.label = javaWriter.createLabelName() + "ForEach";
94
+		}
95
+		javaWriter.putNamedLabel(start, statement.label + "_start");
96
+		javaWriter.putNamedLabel(end, statement.label + "_end");
97
+
98
+
99
+		//Compile Array/Collection
100
+		statement.list.accept(expressionVisitor);
101 101
 
102 102
         //Create local variables
103 103
         for (VarStatement variable : statement.loopVariables) {
@@ -109,219 +109,218 @@ public class JavaStatementVisitor implements StatementVisitor<Boolean> {
109 109
             javaWriter.addVariableInfo(info);
110 110
         }
111 111
 
112
-        //javaWriter.label(min);
113
-        statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
114
-        javaWriter.goTo(start);
115
-        javaWriter.label(end);
116
-        return false;
117
-    }
118
-
119
-    @Override
120
-    public Boolean visitIf(IfStatement statement) {
121
-        statement.condition.accept(expressionVisitor);
122
-        Label onElse = null;
123
-        Label end = new Label();
124
-        final boolean hasElse = statement.onElse != null;
125
-        if (hasElse) {
126
-            onElse = new Label();
127
-            javaWriter.ifEQ(onElse);
128
-        } else {
129
-            javaWriter.ifEQ(end);
130
-        }
131
-        statement.onThen.accept(this);
132
-        if (hasElse) {
133
-            javaWriter.goTo(end);
134
-            javaWriter.label(onElse);
135
-            statement.onElse.accept(this);
136
-        }
137
-        javaWriter.label(end);
138
-        return false;
139
-    }
140
-
141
-    @Override
142
-    public Boolean visitLock(LockStatement statement) {
143
-        return false;
144
-    }
145
-
146
-    @Override
147
-    public Boolean visitReturn(ReturnStatement statement) {
148
-        statement.value.accept(expressionVisitor);
149
-        javaWriter.returnType(context.getType(statement.value.type));
150
-        return true;
151
-    }
152
-
153
-    @Override
154
-    public Boolean visitSwitch(SwitchStatement statement) {
155
-
156
-        final Label start = new Label();
157
-        final Label end = new Label();
158
-
159
-        if (statement.label == null)
160
-            statement.label = javaWriter.createLabelName() + "Switch";
161
-
162
-        javaWriter.putNamedLabel(start, statement.label + "_start");
163
-        javaWriter.putNamedLabel(end, statement.label + "_end");
164
-
165
-
166
-        javaWriter.label(start);
167
-        statement.value.accept(expressionVisitor);
168
-        if (statement.value.type == BasicTypeID.STRING)
169
-            javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
170
-        boolean out = false;
171
-
172
-        final boolean hasNoDefault = hasNoDefault(statement);
173
-
174
-        final List<SwitchCase> cases = statement.cases;
175
-        final JavaSwitchLabel[] switchLabels = new JavaSwitchLabel[hasNoDefault ? cases.size() : cases.size() - 1];
176
-        final Label defaultLabel = new Label();
177
-
178
-        int i = 0;
179
-        for (final SwitchCase switchCase : cases) {
180
-            if (switchCase.value != null) {
181
-                switchLabels[i++] = new JavaSwitchLabel(CompilerUtils.getKeyForSwitch(switchCase.value), new Label());
182
-            }
183
-        }
184
-
185
-        JavaSwitchLabel[] sortedSwitchLabels = Arrays.copyOf(switchLabels, switchLabels.length);
186
-        Arrays.sort(sortedSwitchLabels, (a, b) -> a.key - b.key);
187
-
188
-        javaWriter.lookupSwitch(defaultLabel, sortedSwitchLabels);
189
-
190
-        i = 0;
191
-        for (final SwitchCase switchCase : cases) {
192
-            if (hasNoDefault || switchCase.value != null) {
193
-                javaWriter.label(switchLabels[i++].label);
194
-            } else {
195
-                javaWriter.label(defaultLabel);
196
-            }
197
-            for (Statement statement1 : switchCase.statements) {
198
-                out |= statement1.accept(this);
199
-            }
200
-        }
201
-
202
-        if (hasNoDefault)
203
-            javaWriter.label(defaultLabel);
204
-
205
-        javaWriter.label(end);
206
-
207
-
208
-        //throw new UnsupportedOperationException("Not yet implemented!");
209
-        return out;
210
-    }
211
-
212
-    private boolean hasNoDefault(SwitchStatement switchStatement) {
213
-        for (SwitchCase switchCase : switchStatement.cases)
214
-            if (switchCase.value == null) return false;
215
-        return true;
216
-    }
217
-
218
-    @Override
219
-    public Boolean visitThrow(ThrowStatement statement) {
220
-        statement.value.accept(expressionVisitor);
221
-        javaWriter.aThrow();
222
-        return false;
223
-    }
224
-
225
-    @Override
226
-    public Boolean visitTryCatch(TryCatchStatement statement) {
227
-        final Label tryCatchStart = new Label();
228
-        final Label tryFinish = new Label();
229
-        final Label tryCatchFinish = new Label();
230
-        final Label finallyStart = new Label();
231
-
232
-        javaWriter.label(tryCatchStart);
233
-        //TODO Check for returns or breaks out of the try-catch and inject finally block before them
234
-        statement.content.accept(this);
235
-        javaWriter.label(tryFinish);
236
-        if (statement.finallyClause != null)
237
-            statement.finallyClause.accept(this);
238
-        javaWriter.goTo(tryCatchFinish);
239
-
240
-        for (CatchClause catchClause : statement.catchClauses) {
241
-            final Label catchStart = new Label();
242
-            javaWriter.label(catchStart);
243
-
244
-            //final Type exceptionType = Type.getType(RuntimeException.class);
245
-            final Type exceptionType = context.getType(catchClause.exceptionVariable.type);
246
-            final int local = javaWriter.local(exceptionType);
247
-            javaWriter.store(exceptionType, local);
248
-
249
-            catchClause.content.accept(this);
250
-            final Label catchFinish = new Label();
251
-            javaWriter.label(catchFinish);
252
-
253
-            if (statement.finallyClause != null) {
254
-                statement.finallyClause.accept(this);
255
-                javaWriter.tryCatch(catchStart, catchFinish, finallyStart, null);
256
-            }
257
-
258
-            javaWriter.tryCatch(tryCatchStart, tryFinish, catchStart, exceptionType.getInternalName());
259
-            javaWriter.goTo(tryCatchFinish);
260
-        }
261
-
262
-        if (statement.finallyClause != null) {
263
-            javaWriter.label(finallyStart);
264
-            final int local = javaWriter.local(Object.class);
265
-            javaWriter.storeObject(local);
266
-            statement.finallyClause.accept(this);
267
-            javaWriter.loadObject(local);
268
-            javaWriter.aThrow();
269
-            javaWriter.tryCatch(tryCatchStart, tryFinish, finallyStart, null);
270
-        }
271
-        javaWriter.label(tryCatchFinish);
272
-
273
-        return false;
274
-    }
275
-
276
-    @Override
277
-    public Boolean visitVar(VarStatement statement) {
278
-
279
-        if (statement.initializer != null) {
280
-            statement.initializer.accept(expressionVisitor);
281
-        }
282
-
283
-        Type type = context.getType(statement.type);
284
-        int local = javaWriter.local(type);
285
-        if (statement.initializer != null)
286
-            javaWriter.store(type, local);
287
-        final Label variableStart = new Label();
288
-        javaWriter.label(variableStart);
289
-        final JavaLocalVariableInfo info = new JavaLocalVariableInfo(type, local, variableStart, statement.name);
290
-        statement.setTag(JavaLocalVariableInfo.class, info);
291
-        javaWriter.addVariableInfo(info);
292
-        return false;
293
-    }
294
-
295
-    @Override
296
-    public Boolean visitWhile(WhileStatement statement) {
297
-        Label start = new Label();
298
-        Label end = new Label();
299
-
300
-        if (statement.label == null) {
301
-            statement.label = javaWriter.createLabelName() + "WhileDo";
302
-        }
303
-        javaWriter.putNamedLabel(start, statement.label + "_start");
304
-        javaWriter.putNamedLabel(end, statement.label + "_end");
305
-
306
-        javaWriter.label(start);
307
-        statement.condition.accept(expressionVisitor);
308
-        javaWriter.ifEQ(end);
309
-        statement.content.accept(this);
310
-        javaWriter.goTo(start);
311
-        javaWriter.label(end);
312
-        return false;
313
-    }
314
-
315
-    public void start() {
316
-        javaWriter.start();
317
-    }
318
-
319
-    public void end() {
320
-        javaWriter.ret();
321
-        javaWriter.end();
322
-    }
323
-
324
-    public JavaWriter getJavaWriter() {
325
-        return javaWriter;
326
-    }
112
+		//javaWriter.label(min);
113
+		statement.iterator.target.acceptForIterator(new JavaForeachVisitor(this, statement.loopVariables, statement.content, start, end));
114
+		javaWriter.goTo(start);
115
+		javaWriter.label(end);
116
+		return false;
117
+	}
118
+
119
+	@Override
120
+	public Boolean visitIf(IfStatement statement) {
121
+		statement.condition.accept(expressionVisitor);
122
+		Label onElse = null;
123
+		Label end = new Label();
124
+		final boolean hasElse = statement.onElse != null;
125
+		if (hasElse) {
126
+			onElse = new Label();
127
+			javaWriter.ifEQ(onElse);
128
+		} else {
129
+			javaWriter.ifEQ(end);
130
+		}
131
+		statement.onThen.accept(this);
132
+		if (hasElse) {
133
+			javaWriter.goTo(end);
134
+			javaWriter.label(onElse);
135
+			statement.onElse.accept(this);
136
+		}
137
+		javaWriter.label(end);
138
+		return false;
139
+	}
140
+
141
+	@Override
142
+	public Boolean visitLock(LockStatement statement) {
143
+		return false;
144
+	}
145
+
146
+	@Override
147
+	public Boolean visitReturn(ReturnStatement statement) {
148
+		statement.value.accept(expressionVisitor);
149
+		javaWriter.returnType(context.getType(statement.value.type));
150
+		return true;
151
+	}
152
+
153
+	@Override
154
+	public Boolean visitSwitch(SwitchStatement statement) {
155
+
156
+		final Label start = new Label();
157
+		final Label end = new Label();
158
+
159
+		if (statement.label == null)
160
+			statement.label = javaWriter.createLabelName() + "Switch";
161
+
162
+		javaWriter.putNamedLabel(start, statement.label + "_start");
163
+		javaWriter.putNamedLabel(end, statement.label + "_end");
164
+
165
+
166
+		javaWriter.label(start);
167
+		statement.value.accept(expressionVisitor);
168
+		if (statement.value.type == BasicTypeID.STRING)
169
+			javaWriter.invokeVirtual(new JavaMethodInfo(JavaClass.OBJECT, "hashCode", "()I", 0));
170
+		boolean out = false;
171
+
172
+		final boolean hasNoDefault = hasNoDefault(statement);
173
+
174
+		final List<SwitchCase> cases = statement.cases;
175
+		final JavaSwitchLabel[] switchLabels = new JavaSwitchLabel[hasNoDefault ? cases.size() : cases.size() - 1];
176
+		final Label defaultLabel = new Label();
177
+
178
+		int i = 0;
179
+		for (final SwitchCase switchCase : cases) {
180
+			if (switchCase.value != null) {
181
+				switchLabels[i++] = new JavaSwitchLabel(CompilerUtils.getKeyForSwitch(switchCase.value), new Label());
182
+			}
183
+		}
184
+
185
+		JavaSwitchLabel[] sortedSwitchLabels = Arrays.copyOf(switchLabels, switchLabels.length);
186
+		Arrays.sort(sortedSwitchLabels, (a, b) -> a.key - b.key);
187
+
188
+		javaWriter.lookupSwitch(defaultLabel, sortedSwitchLabels);
189
+
190
+		i = 0;
191
+		for (final SwitchCase switchCase : cases) {
192
+			if (hasNoDefault || switchCase.value != null) {
193
+				javaWriter.label(switchLabels[i++].label);
194
+			} else {
195
+				javaWriter.label(defaultLabel);
196
+			}
197
+			for (Statement statement1 : switchCase.statements) {
198
+				out |= statement1.accept(this);
199
+			}
200
+		}
201
+
202
+		if (hasNoDefault)
203
+			javaWriter.label(defaultLabel);
204
+
205
+		javaWriter.label(end);
206
+
207
+
208
+		//throw new UnsupportedOperationException("Not yet implemented!");
209
+		return out;
210
+	}
211
+
212
+	private boolean hasNoDefault(SwitchStatement switchStatement) {
213
+		for (SwitchCase switchCase : switchStatement.cases)
214
+			if (switchCase.value == null) return false;
215
+		return true;
216
+	}
217
+
218
+	@Override
219
+	public Boolean visitThrow(ThrowStatement statement) {
220
+		statement.value.accept(expressionVisitor);
221
+		javaWriter.aThrow();
222
+		return false;
223
+	}
224
+
225
+	@Override
226
+	public Boolean visitTryCatch(TryCatchStatement statement) {
227
+		final Label tryCatchStart = new Label();
228
+		final Label tryFinish = new Label();
229
+		final Label tryCatchFinish = new Label();
230
+		final Label finallyStart = new Label();
231
+
232
+		javaWriter.label(tryCatchStart);
233
+		//TODO Check for returns or breaks out of the try-catch and inject finally block before them
234
+		statement.content.accept(this);
235
+		javaWriter.label(tryFinish);
236
+		if (statement.finallyClause != null)
237
+			statement.finallyClause.accept(this);
238
+		javaWriter.goTo(tryCatchFinish);
239
+
240
+		for (CatchClause catchClause : statement.catchClauses) {
241
+			final Label catchStart = new Label();
242
+			javaWriter.label(catchStart);
243
+
244
+			//final Type exceptionType = Type.getType(RuntimeException.class);
245
+			final Type exceptionType = context.getType(catchClause.exceptionVariable.type);
246
+			final int local = javaWriter.local(exceptionType);
247
+			javaWriter.store(exceptionType, local);
248
+
249
+			catchClause.content.accept(this);
250
+			final Label catchFinish = new Label();
251
+			javaWriter.label(catchFinish);
252
+
253
+			if (statement.finallyClause != null) {
254
+				statement.finallyClause.accept(this);
255
+				javaWriter.tryCatch(catchStart, catchFinish, finallyStart, null);
256
+			}
257
+
258
+			javaWriter.tryCatch(tryCatchStart, tryFinish, catchStart, exceptionType.getInternalName());
259
+			javaWriter.goTo(tryCatchFinish);
260
+		}
261
+
262
+		if (statement.finallyClause != null) {
263
+			javaWriter.label(finallyStart);
264
+			final int local = javaWriter.local(Object.class);
265
+			javaWriter.storeObject(local);
266
+			statement.finallyClause.accept(this);
267
+			javaWriter.loadObject(local);
268
+			javaWriter.aThrow();
269
+			javaWriter.tryCatch(tryCatchStart, tryFinish, finallyStart, null);
270
+		}
271
+		javaWriter.label(tryCatchFinish);
272
+
273
+		return false;
274
+	}
275
+
276
+	@Override
277
+	public Boolean visitVar(VarStatement statement) {
278
+		if (statement.initializer != null) {
279
+			statement.initializer.accept(expressionVisitor);
280
+		}
281
+
282
+		Type type = context.getType(statement.type);
283
+		int local = javaWriter.local(type);
284
+		if (statement.initializer != null)
285
+			javaWriter.store(type, local);
286
+		final Label variableStart = new Label();
287
+		javaWriter.label(variableStart);
288
+		final JavaLocalVariableInfo info = new JavaLocalVariableInfo(type, local, variableStart, statement.name);
289
+		statement.setTag(JavaLocalVariableInfo.class, info);
290
+		javaWriter.addVariableInfo(info);
291
+		return false;
292
+	}
293
+
294
+	@Override
295
+	public Boolean visitWhile(WhileStatement statement) {
296
+		Label start = new Label();
297
+		Label end = new Label();
298
+
299
+		if (statement.label == null) {
300
+			statement.label = javaWriter.createLabelName() + "WhileDo";
301
+		}
302
+		javaWriter.putNamedLabel(start, statement.label + "_start");
303
+		javaWriter.putNamedLabel(end, statement.label + "_end");
304
+
305
+		javaWriter.label(start);
306
+		statement.condition.accept(expressionVisitor);
307
+		javaWriter.ifEQ(end);
308
+		statement.content.accept(this);
309
+		javaWriter.goTo(start);
310
+		javaWriter.label(end);
311
+		return false;
312
+	}
313
+
314
+	public void start() {
315
+		javaWriter.start();
316
+	}
317
+
318
+	public void end() {
319
+		javaWriter.ret();
320
+		javaWriter.end();
321
+	}
322
+
323
+	public JavaWriter getJavaWriter() {
324
+		return javaWriter;
325
+	}
327 326
 }

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

@@ -8,13 +8,12 @@ package org.openzen.zenscript.javabytecode.compiler;
8 8
 import org.objectweb.asm.Label;
9 9
 
10 10
 /**
11
- *
12 11
  * @author Hoofdgebruiker
13 12
  */
14 13
 public class JavaSwitchLabel {
15 14
 	public final int key;
16 15
 	public final Label label;
17
-	
16
+
18 17
 	public JavaSwitchLabel(int key, Label label) {
19 18
 		this.key = key;
20 19
 		this.label = label;

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

@@ -830,6 +830,10 @@ public class JavaWriter {
830 830
         invokeSpecial(Type.getInternalName(owner), name, descriptor);
831 831
     }
832 832
 
833
+	public void invokeSpecial (JavaMethodInfo method) {
834
+		invokeSpecial(method.javaClass.internalName, method.name, method.descriptor);
835
+	}
836
+
833 837
     public void invokeVirtual(JavaMethodInfo method) {
834 838
         if (debug)
835 839
             System.out.println("invokeVirtual " + method.javaClass.internalName + '.' + method.name + method.descriptor);

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

@@ -3,6 +3,7 @@ package org.openzen.zenscript.javabytecode.compiler.definitions;
3 3
 import org.objectweb.asm.ClassWriter;
4 4
 import org.objectweb.asm.Opcodes;
5 5
 import org.objectweb.asm.Type;
6
+import org.openzen.zenscript.codemodel.Modifiers;
6 7
 import org.openzen.zenscript.codemodel.definition.*;
7 8
 import org.openzen.zenscript.codemodel.member.IDefinitionMember;
8 9
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
@@ -13,30 +14,36 @@ import org.openzen.zenscript.javabytecode.JavaModule;
13 14
 import org.openzen.zenscript.javabytecode.compiler.*;
14 15
 import org.openzen.zenscript.javashared.JavaClass;
15 16
 
17
+import java.io.FileOutputStream;
18
+import java.io.IOException;
19
+import java.util.List;
20
+
21
+
16 22
 public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
17 23
 	private static final JavaMethodInfo CLASS_FORNAME = new JavaMethodInfo(
18 24
 			JavaClass.CLASS,
19 25
 			"forName",
20 26
 			"(Ljava/lang/String;)Ljava/lang/Class;",
21 27
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
22
-	
28
+
29
+
23 30
 	private static final JavaMethodInfo ENUM_VALUEOF = new JavaMethodInfo(
24 31
 			JavaClass.ENUM,
25 32
 			"valueOf",
26 33
 			"(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;",
27 34
 			Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
28 35
 
29
-    private final JavaClassWriter outerWriter;
36
+	private final JavaClassWriter outerWriter;
30 37
 	private final JavaContext context;
31 38
 
32 39
     public JavaDefinitionVisitor(JavaContext context, JavaClassWriter outerWriter) {
33 40
 		this.context = context;
34
-        this.outerWriter = outerWriter;
35
-    }
41
+		this.outerWriter = outerWriter;
42
+	}
36 43
 
37
-    @Override
38
-    public byte[] visitClass(ClassDefinition definition) {
39
-        //Classes will always be created in a new File/Class
44
+	@Override
45
+	public byte[] visitClass(ClassDefinition definition) {
46
+		//Classes will always be created in a new File/Class
40 47
 
41 48
         final Type superType;
42 49
         if (definition.getSuperType() == null)
@@ -45,7 +52,7 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
45 52
             superType = context.getType(definition.getSuperType());
46 53
 
47 54
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.CLASS);
48
-        JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
55
+		JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
49 56
 
50 57
         //TODO: Calculate signature from generic parameters
51 58
         //TODO: Interfaces?
@@ -57,30 +64,30 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
57 64
             member.accept(memberVisitor);
58 65
         }
59 66
 		memberVisitor.end();
60
-        writer.visitEnd();
61
-        return writer.toByteArray();
62
-    }
67
+		writer.visitEnd();
68
+		return writer.toByteArray();
69
+	}
63 70
 
64
-    @Override
65
-    public byte[] visitInterface(InterfaceDefinition definition) {
71
+	@Override
72
+	public byte[] visitInterface(InterfaceDefinition definition) {
66 73
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.INTERFACE);
67
-        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
74
+		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
68 75
 
69
-        //TODO: Calculate signature from generic parameters
70
-        //TODO: Extending Interfaces?
71
-        String signature = null;
72
-        writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, definition.name, signature, Type.getInternalName(Object.class), null);
76
+		//TODO: Calculate signature from generic parameters
77
+		//TODO: Extending Interfaces?
78
+		String signature = null;
79
+		writer.visit(Opcodes.V1_8, definition.modifiers | Opcodes.ACC_INTERFACE | Opcodes.ACC_ABSTRACT, definition.name, signature, Type.getInternalName(Object.class), null);
73 80
 		JavaMemberVisitor memberVisitor = new JavaMemberVisitor(context, writer, toClass, definition);
74
-        for (IDefinitionMember member : definition.members) {
75
-            member.accept(memberVisitor);
76
-        }
81
+		for (IDefinitionMember member : definition.members) {
82
+			member.accept(memberVisitor);
83
+		}
77 84
 		memberVisitor.end();
78
-        writer.visitEnd();
79
-        return writer.toByteArray();
80
-    }
85
+		writer.visitEnd();
86
+		return writer.toByteArray();
87
+	}
81 88
 
82
-    @Override
83
-    public byte[] visitEnum(EnumDefinition definition) {
89
+	@Override
90
+	public byte[] visitEnum(EnumDefinition definition) {
84 91
 		System.out.println("Compiling enum " + definition.name + " in " + definition.position.getFilename());
85 92
 		
86 93
         final Type superType;
@@ -89,14 +96,14 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
89 96
         else
90 97
             superType = context.getType(definition.getSuperType());
91 98
 
92
-        ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
99
+		ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
93 100
 
94
-        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);
101
+		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);
95 102
 
96 103
 		JavaClass toClass = new JavaClass(definition.pkg.fullName, definition.name, JavaClass.Kind.ENUM);
97 104
 
98
-        //Enum Stuff(required!)
99
-        writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + definition.name + ";", null, null).visitEnd();
105
+		//Enum Stuff(required!)
106
+		writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PRIVATE | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC, "$VALUES", "[L" + definition.name + ";", null, null).visitEnd();
100 107
 
101 108
         final JavaMemberVisitor visitor = new JavaMemberVisitor(context, writer, toClass, definition);
102 109
         for (IDefinitionMember member : definition.members) {
@@ -107,36 +114,36 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
107 114
 		JavaMethodInfo arrayClone = new JavaMethodInfo(arrayClass, "clone", "()Ljava/lang/Object;", Opcodes.ACC_PUBLIC);
108 115
 
109 116
 		JavaMethodInfo valuesMethodInfo = new JavaMethodInfo(toClass, "values", "()[L" + definition.name + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
110
-        JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethodInfo, definition, null, null);
111
-        valuesWriter.start();
112
-        valuesWriter.getStaticField(definition.name, "$VALUES", "[L" + definition.name + ";");
113
-        valuesWriter.invokeVirtual(arrayClone);
114
-        valuesWriter.checkCast("[L" + definition.name + ";");
115
-        valuesWriter.returnObject();
116
-        valuesWriter.end();
117
+		JavaWriter valuesWriter = new JavaWriter(writer, true, valuesMethodInfo, definition, null, null);
118
+		valuesWriter.start();
119
+		valuesWriter.getStaticField(definition.name, "$VALUES", "[L" + definition.name + ";");
120
+		valuesWriter.invokeVirtual(arrayClone);
121
+		valuesWriter.checkCast("[L" + definition.name + ";");
122
+		valuesWriter.returnObject();
123
+		valuesWriter.end();
117 124
 
118 125
 		JavaMethodInfo valueOfMethodInfo = new JavaMethodInfo(toClass, "valueOf", "(Ljava/lang/String;)L" + definition.name + ";", Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC);
119
-        JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethodInfo, definition, null, null);
120
-        valueOfWriter.start();
121
-        valueOfWriter.invokeStatic(CLASS_FORNAME);
122
-        valueOfWriter.loadObject(0);
123
-        valueOfWriter.invokeStatic(ENUM_VALUEOF);
124
-        valueOfWriter.checkCast("L" + definition.name + ";");
125
-        valueOfWriter.returnObject();
126
-        valueOfWriter.end();
127
-
128
-
129
-        writer.visitEnd();
130
-        return writer.toByteArray();
131
-    }
132
-
133
-    @Override
134
-    public byte[] visitStruct(StructDefinition definition) {
135
-        return null;
136
-    }
137
-
138
-    @Override
139
-    public byte[] visitFunction(FunctionDefinition definition) {
126
+		JavaWriter valueOfWriter = new JavaWriter(writer, true, valueOfMethodInfo, definition, null, null);
127
+		valueOfWriter.start();
128
+		valueOfWriter.invokeStatic(CLASS_FORNAME);
129
+		valueOfWriter.loadObject(0);
130
+		valueOfWriter.invokeStatic(ENUM_VALUEOF);
131
+		valueOfWriter.checkCast("L" + definition.name + ";");
132
+		valueOfWriter.returnObject();
133
+		valueOfWriter.end();
134
+
135
+
136
+		writer.visitEnd();
137
+		return writer.toByteArray();
138
+	}
139
+
140
+	@Override
141
+	public byte[] visitStruct(StructDefinition definition) {
142
+		return null;
143
+	}
144
+
145
+	@Override
146
+	public byte[] visitFunction(FunctionDefinition definition) {
140 147
 		CompilerUtils.tagMethodParameters(context, definition.header, true);
141 148
 		
142 149
         final String signature = context.getMethodSignature(definition.header);
@@ -155,28 +162,138 @@ public class JavaDefinitionVisitor implements DefinitionVisitor<byte[]> {
155 162
 			else if (type != BasicTypeID.VOID)
156 163
 				writer.aConstNull();
157 164
 			writer.returnType(context.getType(type));
158
-        }
165
+		}
159 166
 
160
-        statementVisitor.end();
161
-		
162
-        definition.setTag(JavaMethodInfo.class, methodInfo);
163
-        definition.caller.setTag(JavaMethodInfo.class, methodInfo);
164
-        return null;
165
-    }
166
-
167
-    @Override
168
-    public byte[] visitExpansion(ExpansionDefinition definition) {
169
-        return null;
170
-    }
171
-
172
-    @Override
173
-    public byte[] visitAlias(AliasDefinition definition) {
174
-        //TODO would that work?
175
-        return JavaModule.classes.get(definition.name);
176
-    }
167
+		statementVisitor.end();
168
+
169
+		definition.setTag(JavaMethodInfo.class, methodInfo);
170
+		definition.caller.setTag(JavaMethodInfo.class, methodInfo);
171
+		return null;
172
+	}
173
+
174
+	@Override
175
+	public byte[] visitExpansion(ExpansionDefinition definition) {
176
+		return null;
177
+	}
178
+
179
+	@Override
180
+	public byte[] visitAlias(AliasDefinition definition) {
181
+		throw new AssertionError("Aliases shouldn't exist here...");
182
+	}
177 183
 
178 184
 	@Override
179 185
 	public byte[] visitVariant(VariantDefinition variant) {
180
-		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
186
+
187
+		final String variantName = variant.name;
188
+		final JavaClass toClass = new JavaClass("", variantName, JavaClass.Kind.CLASS);
189
+		final JavaClassWriter writer = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
190
+
191
+		writer.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, variantName, null, "java/lang/Object", null);
192
+		writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_ABSTRACT, "getDenominator", "()I", null, null).visitEnd();
193
+
194
+
195
+		final JavaMemberVisitor visitor = new JavaMemberVisitor(writer, toClass, variant);
196
+
197
+		final List<VariantDefinition.Option> options = variant.options;
198
+		//Each option is one of the possible child classes
199
+		for (final VariantDefinition.Option option : options) {
200
+			final String optionClassName = variantName + "$" + option.name;
201
+			final JavaClass optionClass = new JavaClass("", optionClassName, JavaClass.Kind.CLASS);
202
+			final JavaClassWriter optionWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
203
+
204
+			writer.visitInnerClass(optionClassName, variantName, option.name, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL);
205
+
206
+
207
+			option.setTag(JavaClass.class, optionClass);
208
+
209
+
210
+			//Generic option signature
211
+			final String signature;
212
+			{
213
+				StringBuilder builder = new StringBuilder();
214
+				for (int i = 0; i < option.types.length; ++i) {
215
+					builder.append("<T").append(i).append(":");
216
+					builder.append(option.types[i].accept(JavaTypeVisitor.INSTANCE).getDescriptor());
217
+				}
218
+				builder.append(">");
219
+				builder.append("L").append(variantName).append(";");
220
+
221
+
222
+				signature = builder.toString();
223
+			}
224
+
225
+			optionWriter.visit(Opcodes.V1_8, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, optionClassName, signature, variantName, null);
226
+			final JavaMemberVisitor optionVisitor = new JavaMemberVisitor(optionWriter, optionClass, variant);
227
+
228
+
229
+			final StringBuilder optionInitDescBuilder = new StringBuilder("(");
230
+
231
+			ITypeID[] types = option.types;
232
+			for (int i = 0; i < types.length; ++i) {
233
+				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
234
+				final String internalName = type.getDescriptor();
235
+				optionInitDescBuilder.append(internalName);
236
+				optionWriter.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "Field" + i, internalName, "TT" + i + ";", null).visitEnd();
237
+			}
238
+			optionInitDescBuilder.append(")V");
239
+
240
+
241
+			final JavaWriter initWriter = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "<init>", optionInitDescBuilder.toString(), Opcodes.ACC_PUBLIC), variant, optionInitDescBuilder.toString(), null);
242
+			initWriter.start();
243
+			initWriter.loadObject(0);
244
+			initWriter.dup();
245
+			initWriter.invokeSpecial(variantName, "<init>", "()V");
246
+			for (int i = 0; i < types.length; ++i) {
247
+				initWriter.dup();
248
+				initWriter.loadObject(i + 1);
249
+
250
+				final Type type = types[i].accept(JavaTypeVisitor.INSTANCE);
251
+				final String internalName = type.getDescriptor();
252
+
253
+				initWriter.putField(optionClassName, "Field" + i, internalName);
254
+			}
255
+			initWriter.pop();
256
+			initWriter.ret();
257
+			initWriter.end();
258
+
259
+
260
+			//Denominator for switch-cases
261
+			final JavaWriter getDenominator = new JavaWriter(optionWriter, new JavaMethodInfo(optionClass, "getDenominator", "()I", Modifiers.PUBLIC), null, null, null, "java/lang/Override");
262
+			getDenominator.start();
263
+			getDenominator.constant(option.ordinal);
264
+			getDenominator.returnInt();
265
+			getDenominator.end();
266
+
267
+
268
+			optionVisitor.end();
269
+			optionWriter.visitEnd();
270
+			final byte[] byteArray = optionWriter.toByteArray();
271
+			JavaModule.classes.put(optionClassName, byteArray);
272
+
273
+			//Print the option files, won't be in production
274
+			try (FileOutputStream out = new FileOutputStream(optionClassName + ".class")) {
275
+				out.write(byteArray);
276
+			} catch (IOException e) {
277
+				e.printStackTrace();
278
+			}
279
+		}
280
+
281
+
282
+		for (final IDefinitionMember member : variant.members) {
283
+			member.accept(visitor);
284
+		}
285
+
286
+		final JavaWriter superInitWriter = new JavaWriter(writer, new JavaMethodInfo(toClass, "<init>", "()V", Opcodes.ACC_PUBLIC), variant, "()V", null);
287
+		superInitWriter.start();
288
+		superInitWriter.loadObject(0);
289
+		superInitWriter.invokeSpecial("java/lang/Object", "<init>", "()V");
290
+		superInitWriter.ret();
291
+		superInitWriter.end();
292
+
293
+		visitor.end();
294
+		writer.visitEnd();
295
+
296
+
297
+		return writer.toByteArray();
181 298
 	}
182 299
 }

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

@@ -6,16 +6,16 @@ import java.util.ArrayList;
6 6
 import java.util.List;
7 7
 
8 8
 public class JavaInitializedVariables {
9
-    public final List<FieldMember> fields;
10
-    public final String owner;
9
+	public final List<FieldMember> fields;
10
+	public final String owner;
11 11
 
12
-    public JavaInitializedVariables(String owner) {
13
-        this.owner = owner;
14
-        fields = new ArrayList<>();
15
-    }
12
+	public JavaInitializedVariables(String owner) {
13
+		this.owner = owner;
14
+		fields = new ArrayList<>();
15
+	}
16 16
 
17
-    public JavaInitializedVariables(List<FieldMember> fields, String owner) {
18
-        this.fields = fields;
19
-        this.owner = owner;
20
-    }
17
+	public JavaInitializedVariables(List<FieldMember> fields, String owner) {
18
+		this.fields = fields;
19
+		this.owner = owner;
20
+	}
21 21
 }

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

@@ -49,8 +49,8 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
49 49
         return null;
50 50
 	}
51 51
 
52
-    @Override
53
-    public Void visitField(FieldMember member) {
52
+	@Override
53
+	public Void visitField(FieldMember member) {
54 54
 
55 55
         //TODO calc signature
56 56
         String signature = null;
@@ -83,46 +83,45 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
83 83
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, constructorWriter);
84 84
         statementVisitor.start();
85 85
 
86
-        if (!member.isConstructorForwarded()) {
87
-            if (isEnum) {
88
-                System.out.println("Writing enum constructor");
89
-                constructorWriter.getVisitor().newLocal(Type.getType(String.class));
90
-                constructorWriter.getVisitor().newLocal(Type.getType(int.class));
91
-                constructorWriter.loadObject(0);
92
-                constructorWriter.loadObject(1);
93
-                constructorWriter.loadInt(2);
94
-                constructorWriter.invokeSpecial(Type.getInternalName(Enum.class), "<init>", "(Ljava/lang/String;I)V");
95
-            } else if (definition.getSuperType() == null) {
96
-                System.out.println("Writing regular constructor");
97
-                constructorWriter.load(Type.getType(Object.class), 0);
98
-                constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
99
-            }
100
-
101
-            CompilerUtils.writeDefaultFieldInitializers(context, constructorWriter, definition, false);
86
+		if (!member.isConstructorForwarded()) {
87
+			if (isEnum) {
88
+				System.out.println("Writing enum constructor");
89
+				constructorWriter.getVisitor().newLocal(Type.getType(String.class));
90
+				constructorWriter.getVisitor().newLocal(Type.getType(int.class));
91
+				constructorWriter.loadObject(0);
92
+				constructorWriter.loadObject(1);
93
+				constructorWriter.loadInt(2);
94
+				constructorWriter.invokeSpecial(Type.getInternalName(Enum.class), "<init>", "(Ljava/lang/String;I)V");
95
+			} else if (definition.getSuperType() == null) {
96
+				System.out.println("Writing regular constructor");
97
+				constructorWriter.load(Type.getType(Object.class), 0);
98
+				constructorWriter.invokeSpecial(Type.getInternalName(Object.class), "<init>", "()V");
99
+			}
100
+
102 101
         }
103 102
 
104
-        member.body.accept(statementVisitor);
105
-        constructorWriter.label(constructorEnd);
106
-        statementVisitor.end();
107
-        return null;
108
-    }
109
-	
103
+		member.body.accept(statementVisitor);
104
+		constructorWriter.label(constructorEnd);
105
+		statementVisitor.end();
106
+		return null;
107
+	}
108
+
110 109
 	@Override
111 110
 	public Void visitDestructor(DestructorMember member) {
112 111
 		final JavaMethodInfo method = new JavaMethodInfo(toClass, "close", "()V", Opcodes.ACC_PUBLIC);
113 112
 
114
-        final Label constructorStart = new Label();
115
-        final Label constructorEnd = new Label();
116
-        final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
117
-        destructorWriter.label(constructorStart);
113
+		final Label constructorStart = new Label();
114
+		final Label constructorEnd = new Label();
115
+		final JavaWriter destructorWriter = new JavaWriter(writer, method, definition, null, null);
116
+		destructorWriter.label(constructorStart);
118 117
 
119 118
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, destructorWriter);
120 119
         statementVisitor.start();
121 120
 		// TODO: destruction of members (to be done when memory tags are implemented)
122
-        member.body.accept(statementVisitor);
123
-        destructorWriter.label(constructorEnd);
124
-        statementVisitor.end();
125
-        return null;
121
+		member.body.accept(statementVisitor);
122
+		destructorWriter.label(constructorEnd);
123
+		statementVisitor.end();
124
+		return null;
126 125
 	}
127 126
 
128 127
     @Override
@@ -151,66 +150,66 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
151 150
 
152 151
         final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, methodWriter);
153 152
 
154
-        if (!isAbstract) {
155
-            statementVisitor.start();
156
-            member.body.accept(statementVisitor);
157
-            methodWriter.label(methodEnd);
158
-            statementVisitor.end();
159
-        }
153
+		if (!isAbstract) {
154
+			statementVisitor.start();
155
+			member.body.accept(statementVisitor);
156
+			methodWriter.label(methodEnd);
157
+			statementVisitor.end();
158
+		}
160 159
 
161
-        member.setTag(JavaMethodInfo.class, method);
162
-        return null;
163
-    }
160
+		member.setTag(JavaMethodInfo.class, method);
161
+		return null;
162
+	}
164 163
 
165
-    @Override
166
-    public Void visitGetter(GetterMember member) {
167
-        return null;
168
-    }
164
+	@Override
165
+	public Void visitGetter(GetterMember member) {
166
+		return null;
167
+	}
169 168
 
170
-    @Override
171
-    public Void visitSetter(SetterMember member) {
172
-        return null;
173
-    }
169
+	@Override
170
+	public Void visitSetter(SetterMember member) {
171
+		return null;
172
+	}
174 173
 
175
-    @Override
176
-    public Void visitOperator(OperatorMember member) {
177
-        return null;
178
-    }
174
+	@Override
175
+	public Void visitOperator(OperatorMember member) {
176
+		return null;
177
+	}
179 178
 
180
-    @Override
181
-    public Void visitCaster(CasterMember member) {
182
-        return null;
183
-    }
179
+	@Override
180
+	public Void visitCaster(CasterMember member) {
181
+		return null;
182
+	}
184 183
 
185
-    @Override
186
-    public Void visitCustomIterator(CustomIteratorMember member) {
187
-        return null;
188
-    }
184
+	@Override
185
+	public Void visitCustomIterator(CustomIteratorMember member) {
186
+		return null;
187
+	}
189 188
 
190
-    @Override
191
-    public Void visitCaller(CallerMember member) {
192
-        return null;
193
-    }
189
+	@Override
190
+	public Void visitCaller(CallerMember member) {
191
+		return null;
192
+	}
194 193
 
195
-    @Override
196
-    public Void visitImplementation(ImplementationMember member) {
197
-        return null;
198
-    }
194
+	@Override
195
+	public Void visitImplementation(ImplementationMember member) {
196
+		return null;
197
+	}
199 198
 
200
-    @Override
201
-    public Void visitInnerDefinition(InnerDefinitionMember member) {
202
-        return null;
203
-    }
199
+	@Override
200
+	public Void visitInnerDefinition(InnerDefinitionMember member) {
201
+		return null;
202
+	}
204 203
 
205
-    @Override
206
-    public Void visitStaticInitializer(StaticInitializerMember member) {
207
-        member.body.accept(clinitStatementVisitor);
208
-        return null;
209
-    }
204
+	@Override
205
+	public Void visitStaticInitializer(StaticInitializerMember member) {
206
+		member.body.accept(clinitStatementVisitor);
207
+		return null;
208
+	}
210 209
 
211
-    public void end() {
210
+	public void end() {
212 211
 
213
-        if (enumDefinition != null) {
212
+		if (enumDefinition != null) {
214 213
 			for (EnumConstantMember constant : enumDefinition.enumConstants) {
215 214
 				writer.visitField(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL | Opcodes.ACC_ENUM, constant.name, "L" + definition.name + ";", null, null).visitEnd();
216 215
 				final String internalName = context.getInternalName(constant.constructor.type);
@@ -225,25 +224,25 @@ public class JavaMemberVisitor implements MemberVisitor<Void> {
225 224
 
226 225
 				clinitWriter.invokeSpecial(internalName, "<init>", context.getEnumConstructorDescriptor(constant.constructor.constructor.getHeader()));
227 226
 				clinitWriter.putStaticField(internalName, constant.name, "L" + internalName + ";");
228
-				
227
+
229 228
 				enumDefinition = (EnumDefinition) constant.definition;
230 229
 			}
231
-			
232
-            final JavaWriter clinitWriter = clinitStatementVisitor.getJavaWriter();
233
-            final List<EnumConstantMember> enumConstants = enumDefinition.enumConstants;
234
-            clinitWriter.constant(enumConstants.size());
235
-            clinitWriter.newArray(Type.getType("L" + definition.name + ";"));
236
-
237
-            for (EnumConstantMember enumConstant : enumConstants) {
238
-                clinitWriter.dup();
239
-                clinitWriter.constant(enumConstant.ordinal);
240
-                clinitWriter.getStaticField(definition.name, enumConstant.name, "L" + definition.name + ";");
241
-                clinitWriter.arrayStore(Type.getType("L" + definition.name + ";"));
242
-            }
243
-            clinitWriter.putStaticField(definition.name, "$VALUES", "[L" + definition.name + ";");
244
-        }
245 230
 
231
+			final JavaWriter clinitWriter = clinitStatementVisitor.getJavaWriter();
232
+			final List<EnumConstantMember> enumConstants = enumDefinition.enumConstants;
233
+			clinitWriter.constant(enumConstants.size());
234
+			clinitWriter.newArray(Type.getType("L" + definition.name + ";"));
246 235
 
247
-        clinitStatementVisitor.end();
248
-    }
236
+			for (EnumConstantMember enumConstant : enumConstants) {
237
+				clinitWriter.dup();
238
+				clinitWriter.constant(enumConstant.ordinal);
239
+				clinitWriter.getStaticField(definition.name, enumConstant.name, "L" + definition.name + ";");
240
+				clinitWriter.arrayStore(Type.getType("L" + definition.name + ";"));
241
+			}
242
+			clinitWriter.putStaticField(definition.name, "$VALUES", "[L" + definition.name + ";");
243
+		}
244
+
245
+
246
+		clinitStatementVisitor.end();
247
+	}
249 248
 }

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

@@ -0,0 +1,9 @@
1
+package org.openzen.zenscript.javabytecode.compiler.definitions;
2
+
3
+public class JavaOptionInfoTag {
4
+	public final int number;
5
+
6
+	public JavaOptionInfoTag(int number) {
7
+		this.number = number;
8
+	}
9
+}

ScriptingExample/scripts/classes.zs → ScriptingExample/scripts/ttt/classes.zs View File


ScriptingExample/scripts/conditionals.zs → ScriptingExample/scripts/ttt/conditionals.zs View File


ScriptingExample/scripts/functions.zs → ScriptingExample/scripts/ttt/functions.zs View File


+ 22
- 0
ScriptingExample/scripts/ttt/functions_lambdas.zs View File

@@ -0,0 +1,22 @@
1
+val outOfScope = 10;
2
+val fun1 = (a as int, b as int) as int => a + b * outOfScope;
3
+val fun2 = (a as int, c as int) as int => 13;
4
+
5
+
6
+
7
+function apply(fn as function(value as int) as int, scale as int) as int {
8
+    return fn(scale);
9
+}
10
+
11
+
12
+println(fun1(30, 20));
13
+println(fun2(30, 20));
14
+
15
+
16
+
17
+
18
+function scale(value as int, scale as int) as int {
19
+    return apply(v => v * scale, value);
20
+}
21
+
22
+println("Value: " + scale(10, 5));

ScriptingExample/scripts/helloworld.zs → ScriptingExample/scripts/ttt/helloworld.zs View File


ScriptingExample/scripts/match.zs → ScriptingExample/scripts/ttt/match.zs View File

@@ -23,4 +23,29 @@ println(tt1);
23 23
 //println(match test {
24 24
 //	case 1 : "tt",
25 25
 //	default : "kk"
26
-//});
26
+//});
27
+
28
+
29
+
30
+function myFunc (par1 as int) as void {
31
+
32
+    val v0 = par1 - 1;
33
+	println(match par1 {
34
+		10 => v0,
35
+		default => match(v0) {
36
+			10 => 99,
37
+			default => v0
38
+		}
39
+	});
40
+}
41
+
42
+
43
+myFunc(10);
44
+myFunc(11);
45
+myFunc(12);
46
+
47
+
48
+val t = (a as int) as int => a;
49
+
50
+
51
+println(t(10));

ScriptingExample/scripts/moreHellos.zs → ScriptingExample/scripts/ttt/moreHellos.zs View File


ScriptingExample/scripts/statements.zs → ScriptingExample/scripts/ttt/statements.zs View File


ScriptingExample/scripts/switch.zs → ScriptingExample/scripts/ttt/switch.zs View File


Loading…
Cancel
Save