Bladeren bron

Added script parameter system. Also refactored SourceFile info, it's no longer a tag but available as field in ScriptBlock.

Stan Hebben 6 jaren geleden
bovenliggende
commit
0d31f0cd9a
22 gewijzigde bestanden met toevoegingen van 207 en 50 verwijderingen
  1. 8
    3
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java
  2. 4
    0
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/SemanticModule.java
  3. 1
    1
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java
  4. 14
    2
      CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GlobalScriptScope.java
  5. 2
    1
      Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java
  6. 6
    5
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeModule.java
  7. 84
    6
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunUnit.java
  8. 20
    6
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java
  9. 1
    1
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaNonPushingExpressionVisitor.java
  10. 2
    2
      JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java
  11. 2
    1
      JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java
  12. 17
    4
      JavaIntegration/src/main/java/org/openzen/zencode/java/ScriptingEngine.java
  13. 3
    1
      JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompiledModule.java
  14. 4
    0
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java
  15. 4
    3
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java
  16. 3
    2
      JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceModule.java
  17. 11
    6
      Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java
  18. 5
    3
      Parser/src/main/java/org/openzen/zenscript/parser/ZippedPackage.java
  19. 3
    0
      ScriptingExample/scripts/scriptparameters.zs
  20. 11
    2
      ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java
  21. 1
    1
      Shared/src/main/java/org/openzen/zencode/shared/SourceFile.java
  22. 1
    0
      Validator/src/main/java/org/openzen/zenscript/validator/Validator.java

+ 8
- 3
CodeModel/src/main/java/org/openzen/zenscript/codemodel/ScriptBlock.java Bestand weergeven

8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
 import org.openzen.zencode.shared.ConcatMap;
10
 import org.openzen.zencode.shared.ConcatMap;
11
+import org.openzen.zencode.shared.SourceFile;
11
 import org.openzen.zencode.shared.Taggable;
12
 import org.openzen.zencode.shared.Taggable;
12
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
13
 import org.openzen.zenscript.codemodel.scope.TypeScope;
14
 import org.openzen.zenscript.codemodel.scope.TypeScope;
19
  * @author Hoofdgebruiker
20
  * @author Hoofdgebruiker
20
  */
21
  */
21
 public class ScriptBlock extends Taggable {
22
 public class ScriptBlock extends Taggable {
23
+	public final SourceFile file;
22
 	public final Module module;
24
 	public final Module module;
23
 	public final ZSPackage pkg;
25
 	public final ZSPackage pkg;
26
+	public final FunctionHeader scriptHeader;
24
 	public final List<Statement> statements;
27
 	public final List<Statement> statements;
25
 	
28
 	
26
-	public ScriptBlock(Module module, ZSPackage pkg, List<Statement> statements) {
29
+	public ScriptBlock(SourceFile file, Module module, ZSPackage pkg, FunctionHeader scriptHeader, List<Statement> statements) {
30
+		this.file = file;
27
 		this.module = module;
31
 		this.module = module;
28
 		this.pkg = pkg;
32
 		this.pkg = pkg;
33
+		this.scriptHeader = scriptHeader;
29
 		this.statements = statements;
34
 		this.statements = statements;
30
 	}
35
 	}
31
 	
36
 	
32
 	public ScriptBlock withStatements(List<Statement> newStatements) {
37
 	public ScriptBlock withStatements(List<Statement> newStatements) {
33
-		ScriptBlock result = new ScriptBlock(module, pkg, newStatements);
38
+		ScriptBlock result = new ScriptBlock(file, module, pkg, scriptHeader, newStatements);
34
 		result.addAllTagsFrom(this);
39
 		result.addAllTagsFrom(this);
35
 		return result;
40
 		return result;
36
 	}
41
 	}
40
 		for (Statement statement : statements) {
45
 		for (Statement statement : statements) {
41
 			normalized.add(statement.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
46
 			normalized.add(statement.normalize(scope, ConcatMap.empty(LoopStatement.class, LoopStatement.class)));
42
 		}
47
 		}
43
-		ScriptBlock result = new ScriptBlock(module, pkg, normalized);
48
+		ScriptBlock result = new ScriptBlock(file, module, pkg, scriptHeader, normalized);
44
 		result.addAllTagsFrom(this);
49
 		result.addAllTagsFrom(this);
45
 		return result;
50
 		return result;
46
 	}
51
 	}

+ 4
- 0
CodeModel/src/main/java/org/openzen/zenscript/codemodel/SemanticModule.java Bestand weergeven

29
 	
29
 	
30
 	public final String name;
30
 	public final String name;
31
 	public final SemanticModule[] dependencies;
31
 	public final SemanticModule[] dependencies;
32
+	public final FunctionParameter[] parameters;
32
 	
33
 	
33
 	public final State state;
34
 	public final State state;
34
 	public final Module module;
35
 	public final Module module;
46
 	public SemanticModule(
47
 	public SemanticModule(
47
 			Module module,
48
 			Module module,
48
 			SemanticModule[] dependencies,
49
 			SemanticModule[] dependencies,
50
+			FunctionParameter[] parameters,
49
 			State state,
51
 			State state,
50
 			ZSPackage rootPackage,
52
 			ZSPackage rootPackage,
51
 			ZSPackage modulePackage,
53
 			ZSPackage modulePackage,
59
 		this.name = module.name;
61
 		this.name = module.name;
60
 		this.module = module;
62
 		this.module = module;
61
 		this.dependencies = dependencies;
63
 		this.dependencies = dependencies;
64
+		this.parameters = parameters;
62
 		
65
 		
63
 		this.state = state;
66
 		this.state = state;
64
 		this.rootPackage = rootPackage;
67
 		this.rootPackage = rootPackage;
96
 		return new SemanticModule(
99
 		return new SemanticModule(
97
 				module,
100
 				module,
98
 				dependencies,
101
 				dependencies,
102
+				parameters,
99
 				State.NORMALIZED,
103
 				State.NORMALIZED,
100
 				rootPackage,
104
 				rootPackage,
101
 				modulePackage,
105
 				modulePackage,

+ 1
- 1
CodeModel/src/main/java/org/openzen/zenscript/codemodel/annotations/AnnotationProcessor.java Bestand weergeven

58
 	@Override
58
 	@Override
59
 	public ScriptBlock process(ScriptBlock block) {
59
 	public ScriptBlock process(ScriptBlock block) {
60
 		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
60
 		FileScope fileScope = new FileScope(context, expansions, new HashMap<>(), member -> {});
61
-		StatementScope scope = new GlobalScriptScope(fileScope);
61
+		StatementScope scope = new GlobalScriptScope(fileScope, block.scriptHeader);
62
 		List<Statement> transformed = new ArrayList<>();
62
 		List<Statement> transformed = new ArrayList<>();
63
 		boolean unchanged = true;
63
 		boolean unchanged = true;
64
 		for (Statement statement : block.statements) {
64
 		for (Statement statement : block.statements) {

+ 14
- 2
CodeModel/src/main/java/org/openzen/zenscript/codemodel/scope/GlobalScriptScope.java Bestand weergeven

10
 import org.openzen.zencode.shared.CompileException;
10
 import org.openzen.zencode.shared.CompileException;
11
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
11
 import org.openzen.zenscript.codemodel.annotations.AnnotationDefinition;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
12
 import org.openzen.zenscript.codemodel.FunctionHeader;
13
+import org.openzen.zenscript.codemodel.FunctionParameter;
13
 import org.openzen.zenscript.codemodel.GenericMapper;
14
 import org.openzen.zenscript.codemodel.GenericMapper;
14
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
15
 import org.openzen.zenscript.codemodel.partial.IPartialExpression;
15
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.statement.LoopStatement;
16
 import org.openzen.zenscript.codemodel.GenericName;
17
 import org.openzen.zenscript.codemodel.GenericName;
17
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
18
 import org.openzen.zenscript.codemodel.definition.ZSPackage;
19
+import org.openzen.zenscript.codemodel.expression.GetFunctionParameterExpression;
18
 import org.openzen.zenscript.codemodel.type.StoredType;
20
 import org.openzen.zenscript.codemodel.type.StoredType;
19
 import org.openzen.zenscript.codemodel.type.TypeID;
21
 import org.openzen.zenscript.codemodel.type.TypeID;
20
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
22
 import org.openzen.zenscript.codemodel.type.member.LocalMemberCache;
27
  */
29
  */
28
 public class GlobalScriptScope extends StatementScope {
30
 public class GlobalScriptScope extends StatementScope {
29
 	private final BaseScope file;
31
 	private final BaseScope file;
32
+	private final FunctionHeader header;
30
 	
33
 	
31
-	public GlobalScriptScope(BaseScope file) {
34
+	public GlobalScriptScope(BaseScope file, FunctionHeader scriptHeader) {
32
 		this.file = file;
35
 		this.file = file;
36
+		header = scriptHeader;
33
 	}
37
 	}
34
 	
38
 	
35
 	@Override
39
 	@Override
48
 		if (result != null)
52
 		if (result != null)
49
 			return result;
53
 			return result;
50
 		
54
 		
55
+		if (name.hasNoArguments()) {
56
+			for (FunctionParameter parameter : header.parameters) {
57
+				if (parameter.name.equals(name.name)) {
58
+					return new GetFunctionParameterExpression(position, parameter);
59
+				}
60
+			}
61
+		}
62
+		
51
 		return file.get(position, name);
63
 		return file.get(position, name);
52
 	}
64
 	}
53
 
65
 
68
 
80
 
69
 	@Override
81
 	@Override
70
 	public FunctionHeader getFunctionHeader() {
82
 	public FunctionHeader getFunctionHeader() {
71
-		return null;
83
+		return header;
72
 	}
84
 	}
73
 
85
 
74
 	@Override
86
 	@Override

+ 2
- 1
Constructor/src/main/java/org/openzen/zenscript/constructor/module/DirectoryModuleReference.java Bestand weergeven

14
 import org.json.JSONObject;
14
 import org.json.JSONObject;
15
 import org.openzen.zencode.shared.CompileException;
15
 import org.openzen.zencode.shared.CompileException;
16
 import org.openzen.zencode.shared.FileSourceFile;
16
 import org.openzen.zencode.shared.FileSourceFile;
17
+import org.openzen.zenscript.codemodel.FunctionParameter;
17
 import org.openzen.zenscript.codemodel.Module;
18
 import org.openzen.zenscript.codemodel.Module;
18
 import org.openzen.zenscript.codemodel.ModuleSpace;
19
 import org.openzen.zenscript.codemodel.ModuleSpace;
19
 import org.openzen.zenscript.codemodel.SemanticModule;
20
 import org.openzen.zenscript.codemodel.SemanticModule;
94
 			CompilingPackage compilingPackage = new CompilingPackage(pkg, module);
95
 			CompilingPackage compilingPackage = new CompilingPackage(pkg, module);
95
 			
96
 			
96
 			ParsedFile[] parsedFiles = parsedModule.parse(compilingPackage);
97
 			ParsedFile[] parsedFiles = parsedModule.parse(compilingPackage);
97
-			SemanticModule result = ParsedFile.compileSyntaxToSemantic(dependencies, compilingPackage, parsedFiles, space, exceptionLogger);
98
+			SemanticModule result = ParsedFile.compileSyntaxToSemantic(dependencies, compilingPackage, parsedFiles, space, FunctionParameter.NONE, exceptionLogger);
98
 			
99
 			
99
 			JSONObject globals = json.optJSONObject("globals");
100
 			JSONObject globals = json.optJSONObject("globals");
100
 			if (globals != null) {
101
 			if (globals != null) {

+ 6
- 5
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeModule.java Bestand weergeven

9
 import java.util.HashMap;
9
 import java.util.HashMap;
10
 import java.util.List;
10
 import java.util.List;
11
 import java.util.Map;
11
 import java.util.Map;
12
+import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.javashared.JavaCompiledModule;
14
 import org.openzen.zenscript.javashared.JavaCompiledModule;
14
 import org.openzen.zenscript.javashared.JavaMethod;
15
 import org.openzen.zenscript.javashared.JavaMethod;
19
  */
20
  */
20
 public class JavaBytecodeModule extends JavaCompiledModule {
21
 public class JavaBytecodeModule extends JavaCompiledModule {
21
 	private final Map<String, byte[]> classes = new HashMap<>();
22
 	private final Map<String, byte[]> classes = new HashMap<>();
22
-	private final List<JavaMethod> scripts = new ArrayList<>();
23
+	private final List<JavaScriptMethod> scripts = new ArrayList<>();
23
 	
24
 	
24
-	public JavaBytecodeModule(Module module) {
25
-		super(module);
25
+	public JavaBytecodeModule(Module module, FunctionParameter[] parameters) {
26
+		super(module, parameters);
26
 	}
27
 	}
27
 	
28
 	
28
 	public void addClass(String name, byte[] bytecode) {
29
 	public void addClass(String name, byte[] bytecode) {
32
 		classes.put(name, bytecode);
33
 		classes.put(name, bytecode);
33
 	}
34
 	}
34
 	
35
 	
35
-	public void addScript(JavaMethod method) {
36
+	public void addScript(JavaScriptMethod method) {
36
 		scripts.add(method);
37
 		scripts.add(method);
37
 	}
38
 	}
38
 	
39
 	
40
 		return classes;
41
 		return classes;
41
 	}
42
 	}
42
 	
43
 	
43
-	public List<JavaMethod> getScripts() {
44
+	public List<JavaScriptMethod> getScripts() {
44
 		return scripts;
45
 		return scripts;
45
 	}
46
 	}
46
 }
47
 }

+ 84
- 6
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaBytecodeRunUnit.java Bestand weergeven

10
 import java.io.IOException;
10
 import java.io.IOException;
11
 import java.lang.reflect.InvocationTargetException;
11
 import java.lang.reflect.InvocationTargetException;
12
 import java.util.ArrayList;
12
 import java.util.ArrayList;
13
+import java.util.Collections;
13
 import java.util.HashMap;
14
 import java.util.HashMap;
14
 import java.util.List;
15
 import java.util.List;
15
 import java.util.Map;
16
 import java.util.Map;
17
 import java.util.logging.Logger;
18
 import java.util.logging.Logger;
18
 import org.objectweb.asm.ClassWriter;
19
 import org.objectweb.asm.ClassWriter;
19
 import org.objectweb.asm.Opcodes;
20
 import org.objectweb.asm.Opcodes;
21
+import org.objectweb.asm.Type;
20
 import org.openzen.zencode.shared.CodePosition;
22
 import org.openzen.zencode.shared.CodePosition;
23
+import org.openzen.zenscript.codemodel.FunctionHeader;
24
+import org.openzen.zenscript.codemodel.FunctionParameter;
25
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
21
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
26
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
22
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
27
 import org.openzen.zenscript.javabytecode.compiler.JavaWriter;
23
 import org.openzen.zenscript.javashared.JavaClass;
28
 import org.openzen.zenscript.javashared.JavaClass;
24
 import org.openzen.zenscript.javashared.JavaMethod;
29
 import org.openzen.zenscript.javashared.JavaMethod;
30
+import org.openzen.zenscript.javashared.JavaParameterInfo;
25
 
31
 
26
 /**
32
 /**
27
  *
33
  *
29
  */
35
  */
30
 public class JavaBytecodeRunUnit {
36
 public class JavaBytecodeRunUnit {
31
 	private final Map<String, byte[]> classes = new HashMap<>();
37
 	private final Map<String, byte[]> classes = new HashMap<>();
32
-	private final List<JavaMethod> scripts = new ArrayList<>();
38
+	private final List<JavaScriptMethod> scripts = new ArrayList<>();
39
+	private final List<FunctionParameter> scriptParameters = new ArrayList<>();
40
+	private final List<JavaParameterInfo> scriptParameterInfo = new ArrayList<>();
33
 	
41
 	
34
 	private boolean scriptsWritten = false;
42
 	private boolean scriptsWritten = false;
35
 	
43
 	
39
 		for (Map.Entry<String, byte[]> classEntry : module.getClasses().entrySet())
47
 		for (Map.Entry<String, byte[]> classEntry : module.getClasses().entrySet())
40
 			classes.put(classEntry.getKey().replace('/', '.'), classEntry.getValue());
48
 			classes.put(classEntry.getKey().replace('/', '.'), classEntry.getValue());
41
 		
49
 		
42
-		scripts.addAll(module.getScripts());
50
+		for (JavaScriptMethod script : module.getScripts()) {
51
+			scripts.add(script);
52
+			
53
+			for (int i = 0; i < script.parameters.length; i++) {
54
+				FunctionParameter parameter = script.parameters[i];
55
+				if (!scriptParameters.contains(parameter)) {
56
+					scriptParameters.add(parameter);
57
+					scriptParameterInfo.add(script.parametersInfo[i]);
58
+				}
59
+			}
60
+		}
43
 	}
61
 	}
44
 	
62
 	
45
 	public void run() {
63
 	public void run() {
64
+		run(Collections.emptyMap());
65
+	}
66
+	
67
+	public void run(Map<FunctionParameter, Object> arguments) {
46
 		writeScripts();
68
 		writeScripts();
47
 		
69
 		
48
 		ScriptClassLoader classLoader = new ScriptClassLoader();
70
 		ScriptClassLoader classLoader = new ScriptClassLoader();
49
 
71
 
72
+		Object[] argumentsArray = new Object[scriptParameters.size()];
73
+		for (int i = 0; i < scriptParameters.size(); i++) {
74
+			FunctionParameter parameter = scriptParameters.get(i);
75
+			if (!arguments.containsKey(parameter))
76
+				throw new IllegalArgumentException("Missing script argument for parameter " + parameter.name);
77
+			
78
+			argumentsArray[i] = arguments.get(parameter);
79
+		}
50
 		try {
80
 		try {
51
-			classLoader.loadClass("Scripts").getMethod("run").invoke(null);
81
+			Class[] classes = new Class[scriptParameters.size()];
82
+			for (int i = 0; i < classes.length; i++)
83
+				classes[i] = loadClass(classLoader, scriptParameterInfo.get(i).typeDescriptor);
84
+			classLoader.loadClass("Scripts").getMethod("run", classes).invoke(null, argumentsArray);
52
 		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
85
 		} catch (ClassNotFoundException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | SecurityException | IllegalArgumentException ex) {
53
 			Logger.getLogger(JavaBytecodeRunUnit.class.getName()).log(Level.SEVERE, null, ex);
86
 			Logger.getLogger(JavaBytecodeRunUnit.class.getName()).log(Level.SEVERE, null, ex);
54
 		}
87
 		}
70
 		}
103
 		}
71
 	}
104
 	}
72
 	
105
 	
106
+	private int getParameterIndex(FunctionParameter parameter) {
107
+		return scriptParameters.indexOf(parameter);
108
+	}
109
+	
73
 	private void writeScripts() {
110
 	private void writeScripts() {
74
 		if (scriptsWritten)
111
 		if (scriptsWritten)
75
 			return;
112
 			return;
77
 		JavaClassWriter scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
114
 		JavaClassWriter scriptsClassWriter = new JavaClassWriter(ClassWriter.COMPUTE_FRAMES);
78
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
115
 		scriptsClassWriter.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "Scripts", null, "java/lang/Object", null);
79
 		
116
 		
80
-		JavaMethod runMethod = JavaMethod.getStatic(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
117
+		FunctionHeader header = new FunctionHeader(BasicTypeID.VOID, scriptParameters.toArray(new FunctionParameter[scriptParameters.size()]));
118
+		StringBuilder headerBuilder = new StringBuilder();
119
+		headerBuilder.append('(');
120
+		for (int i = 0; i < scriptParameters.size(); i++) {
121
+			headerBuilder.append(scriptParameterInfo.get(i).typeDescriptor);
122
+		}
123
+		headerBuilder.append(")V");
124
+		
125
+		JavaMethod runMethod = JavaMethod.getStatic(new JavaClass("script", "Scripts", JavaClass.Kind.CLASS), "run", headerBuilder.toString(), Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
81
 		final JavaWriter runWriter = new JavaWriter(CodePosition.GENERATED, scriptsClassWriter, runMethod, null, null, null);
126
 		final JavaWriter runWriter = new JavaWriter(CodePosition.GENERATED, scriptsClassWriter, runMethod, null, null, null);
82
 		runWriter.start();
127
 		runWriter.start();
83
-		for (JavaMethod method : scripts)
84
-			runWriter.invokeStatic(method);
128
+		for (JavaScriptMethod method : scripts) {
129
+			for (int i = 0; i < method.parameters.length; i++) {
130
+				runWriter.load(Type.getType(method.parametersInfo[i].typeDescriptor), getParameterIndex(method.parameters[i]));
131
+			}
132
+			runWriter.invokeStatic(method.method);
133
+		}
85
 		
134
 		
86
 		runWriter.ret();
135
 		runWriter.ret();
87
 		runWriter.end();
136
 		runWriter.end();
107
 			return super.loadClass(name);
156
 			return super.loadClass(name);
108
 		}
157
 		}
109
 	}
158
 	}
159
+	
160
+	private static Class<?> loadClass(ClassLoader classLoader, String descriptor) throws ClassNotFoundException {
161
+		switch (descriptor) {
162
+			case "Z": return boolean.class;
163
+			case "B": return byte.class;
164
+			case "S": return short.class;
165
+			case "I": return int.class;
166
+			case "J": return long.class;
167
+			case "F": return float.class;
168
+			case "D": return double.class;
169
+			case "C": return char.class;
170
+			case "Ljava/lang/Object;": return Object.class;
171
+			case "Ljava/lang/String;": return String.class;
172
+			case "[Ljava/lang/Object;": return Object[].class;
173
+			case "[Ljava/lang/String;": return String[].class;
174
+		}
175
+		
176
+		return classLoader.loadClass(getClassName(descriptor));
177
+	}
178
+	
179
+	private static String getClassName(String descriptor) {
180
+		if (descriptor.startsWith("[")) {
181
+			return "[" + getClassName(descriptor.substring(1));
182
+		} else if (descriptor.startsWith("L")) {
183
+			return descriptor.substring(1, descriptor.length() - 1);
184
+		} else {
185
+			throw new IllegalArgumentException("Invalid descriptor: " + descriptor);
186
+		}
187
+	}
110
 }
188
 }

+ 20
- 6
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/JavaCompiler.java Bestand weergeven

11
 import org.objectweb.asm.Opcodes;
11
 import org.objectweb.asm.Opcodes;
12
 import org.openzen.zencode.shared.CodePosition;
12
 import org.openzen.zencode.shared.CodePosition;
13
 import org.openzen.zencode.shared.SourceFile;
13
 import org.openzen.zencode.shared.SourceFile;
14
+import org.openzen.zenscript.codemodel.FunctionHeader;
15
+import org.openzen.zenscript.codemodel.FunctionParameter;
14
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
16
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
15
 import org.openzen.zenscript.codemodel.ScriptBlock;
17
 import org.openzen.zenscript.codemodel.ScriptBlock;
16
 import org.openzen.zenscript.codemodel.SemanticModule;
18
 import org.openzen.zenscript.codemodel.SemanticModule;
17
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
19
 import org.openzen.zenscript.codemodel.definition.ExpansionDefinition;
18
 import org.openzen.zenscript.codemodel.statement.Statement;
20
 import org.openzen.zenscript.codemodel.statement.Statement;
21
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
19
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
22
 import org.openzen.zenscript.javabytecode.compiler.JavaClassWriter;
20
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
23
 import org.openzen.zenscript.javabytecode.compiler.JavaScriptFile;
21
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
24
 import org.openzen.zenscript.javabytecode.compiler.JavaStatementVisitor;
24
 import org.openzen.zenscript.javashared.JavaClass;
27
 import org.openzen.zenscript.javashared.JavaClass;
25
 import org.openzen.zenscript.javashared.JavaCompileSpace;
28
 import org.openzen.zenscript.javashared.JavaCompileSpace;
26
 import org.openzen.zenscript.javashared.JavaMethod;
29
 import org.openzen.zenscript.javashared.JavaMethod;
30
+import org.openzen.zenscript.javashared.JavaParameterInfo;
27
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
31
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionMemberVisitor;
28
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
32
 import org.openzen.zenscript.javashared.prepare.JavaPrepareDefinitionVisitor;
29
 
33
 
38
 	public JavaBytecodeModule compile(String packageName, SemanticModule module, JavaCompileSpace space) {
42
 	public JavaBytecodeModule compile(String packageName, SemanticModule module, JavaCompileSpace space) {
39
 		Map<String, JavaScriptFile> scriptBlocks = new HashMap<>();
43
 		Map<String, JavaScriptFile> scriptBlocks = new HashMap<>();
40
 		
44
 		
41
-		JavaBytecodeModule target = new JavaBytecodeModule(module.module);
45
+		JavaBytecodeModule target = new JavaBytecodeModule(module.module, module.parameters);
42
 		JavaBytecodeContext context = new JavaBytecodeContext(target, space, module.modulePackage, packageName);
46
 		JavaBytecodeContext context = new JavaBytecodeContext(target, space, module.modulePackage, packageName);
43
 		context.addModule(module.module, target);
47
 		context.addModule(module.module, target);
44
 		
48
 		
61
 			target.addClass(cls.internalName, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
65
 			target.addClass(cls.internalName, definition.accept(new JavaDefinitionVisitor(context, scriptFile.classWriter)));
62
 		}
66
 		}
63
 		
67
 		
68
+		FunctionHeader scriptHeader = new FunctionHeader(BasicTypeID.VOID, module.parameters);
69
+		String scriptDescriptor = context.getMethodDescriptor(scriptHeader);
70
+		JavaParameterInfo[] javaScriptParameters = new JavaParameterInfo[module.parameters.length];
71
+		for (int i = 0; i < module.parameters.length; i++) {
72
+			FunctionParameter parameter = module.parameters[i];
73
+			JavaParameterInfo javaParameter = new JavaParameterInfo(i, context.getDescriptor(parameter.type));
74
+			target.setParameterInfo(parameter, javaParameter);
75
+			javaScriptParameters[i] = javaParameter;
76
+		}
77
+		
64
 		for (ScriptBlock script : module.scripts) {
78
 		for (ScriptBlock script : module.scripts) {
65
-			final SourceFile sourceFile = script.getTag(SourceFile.class);
79
+			final SourceFile sourceFile = script.file;
66
 			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
80
 			final String className = getClassName(sourceFile == null ? null : sourceFile.getFilename());
67
 			JavaScriptFile scriptFile = getScriptFile(scriptBlocks, script.pkg.fullName + "/" + className);
81
 			JavaScriptFile scriptFile = getScriptFile(scriptBlocks, script.pkg.fullName + "/" + className);
68
 
82
 
71
 			// convert scripts into methods (add them to a Scripts class?)
85
 			// convert scripts into methods (add them to a Scripts class?)
72
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
86
 			// (TODO: can we break very long scripts into smaller methods? for the extreme scripts)
73
 			final JavaClassWriter visitor = scriptFile.classWriter;
87
 			final JavaClassWriter visitor = scriptFile.classWriter;
74
-			JavaMethod method = JavaMethod.getStatic(new JavaClass(context.getPackageName(script.pkg), className, JavaClass.Kind.CLASS), methodName, "()V", Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
75
-			scriptFile.scriptMethods.add(method);
88
+			JavaMethod method = JavaMethod.getStatic(new JavaClass(context.getPackageName(script.pkg), className, JavaClass.Kind.CLASS), methodName, scriptDescriptor, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
89
+			scriptFile.scriptMethods.add(new JavaScriptMethod(method, module.parameters, javaScriptParameters));
76
 
90
 
77
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(CodePosition.UNKNOWN, visitor, method, null, null, null));
91
 			final JavaStatementVisitor statementVisitor = new JavaStatementVisitor(context, context.getJavaModule(script.module), new JavaWriter(CodePosition.UNKNOWN, visitor, method, null, null, null));
78
 			statementVisitor.start();
92
 			statementVisitor.start();
83
 		}
97
 		}
84
 		
98
 		
85
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
99
 		for (Map.Entry<String, JavaScriptFile> entry : scriptBlocks.entrySet()) {
86
-			for (JavaMethod method : entry.getValue().scriptMethods)
100
+			for (JavaScriptMethod method : entry.getValue().scriptMethods)
87
 				target.addScript(method);
101
 				target.addScript(method);
88
 
102
 
89
 			entry.getValue().classWriter.visitEnd();
103
 			entry.getValue().classWriter.visitEnd();
94
 	}
108
 	}
95
 	
109
 	
96
 	private String getFilename(HighLevelDefinition definition) {
110
 	private String getFilename(HighLevelDefinition definition) {
97
-		SourceFile source = definition.getTag(SourceFile.class);
111
+		SourceFile source = definition.position.file;
98
 		if (source != null) {
112
 		if (source != null) {
99
 			int slash = Math.max(source.getFilename().lastIndexOf('/'), source.getFilename().lastIndexOf('\\'));
113
 			int slash = Math.max(source.getFilename().lastIndexOf('/'), source.getFilename().lastIndexOf('\\'));
100
 			String filename = source.getFilename().substring(slash < 0 ? 0 : slash + 1);
114
 			String filename = source.getFilename().substring(slash < 0 ? 0 : slash + 1);

+ 1
- 1
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaNonPushingExpressionVisitor.java Bestand weergeven

429
 		}
429
 		}
430
 
430
 
431
 		for (Expression argument : expression.arguments.arguments) {
431
 		for (Expression argument : expression.arguments.arguments) {
432
-			argument.accept(this);
432
+			argument.accept(original);
433
 		}
433
 		}
434
 		String internalName = context.getInternalName(expression.objectType);
434
 		String internalName = context.getInternalName(expression.objectType);
435
 		javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.cls.isEnum()
435
 		javaWriter.invokeSpecial(internalName, "<init>", javaWriter.method.cls.isEnum()

+ 2
- 2
JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaScriptFile.java Bestand weergeven

7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
-import org.openzen.zenscript.javashared.JavaMethod;
10
+import org.openzen.zenscript.javabytecode.JavaScriptMethod;
11
 
11
 
12
 /**
12
 /**
13
  * @author Hoofdgebruiker
13
  * @author Hoofdgebruiker
14
  */
14
  */
15
 public class JavaScriptFile {
15
 public class JavaScriptFile {
16
 	public final JavaClassWriter classWriter;
16
 	public final JavaClassWriter classWriter;
17
-	public final List<JavaMethod> scriptMethods;
17
+	public final List<JavaScriptMethod> scriptMethods;
18
 
18
 
19
 	public JavaScriptFile(JavaClassWriter classWriter) {
19
 	public JavaScriptFile(JavaClassWriter classWriter) {
20
 		this.classWriter = classWriter;
20
 		this.classWriter = classWriter;

+ 2
- 1
JavaIntegration/src/main/java/org/openzen/zencode/java/JavaNativeModule.java Bestand weergeven

95
 		}
95
 		}
96
 		
96
 		
97
 		this.allowNonAnnonated = allowNonAnnotated;
97
 		this.allowNonAnnonated = allowNonAnnotated;
98
-		compiled = new JavaCompiledModule(module);
98
+		compiled = new JavaCompiledModule(module, FunctionParameter.NONE);
99
 		
99
 		
100
 		typeByClass.put(void.class, BasicTypeID.VOID);
100
 		typeByClass.put(void.class, BasicTypeID.VOID);
101
 		typeByClass.put(boolean.class, BasicTypeID.BOOL);
101
 		typeByClass.put(boolean.class, BasicTypeID.BOOL);
128
 		return new SemanticModule(
128
 		return new SemanticModule(
129
 				module,
129
 				module,
130
 				SemanticModule.NONE,
130
 				SemanticModule.NONE,
131
+				FunctionParameter.NONE,
131
 				SemanticModule.State.NORMALIZED,
132
 				SemanticModule.State.NORMALIZED,
132
 				space.rootPackage,
133
 				space.rootPackage,
133
 				pkg,
134
 				pkg,

+ 17
- 4
JavaIntegration/src/main/java/org/openzen/zencode/java/ScriptingEngine.java Bestand weergeven

8
 import java.io.File;
8
 import java.io.File;
9
 import java.io.IOException;
9
 import java.io.IOException;
10
 import java.util.ArrayList;
10
 import java.util.ArrayList;
11
+import java.util.Collections;
11
 import java.util.List;
12
 import java.util.List;
12
 import java.util.Map;
13
 import java.util.Map;
13
 import org.openzen.zencode.shared.CompileException;
14
 import org.openzen.zencode.shared.CompileException;
14
 import org.openzen.zencode.shared.SourceFile;
15
 import org.openzen.zencode.shared.SourceFile;
16
+import org.openzen.zenscript.codemodel.FunctionParameter;
15
 import org.openzen.zenscript.codemodel.Module;
17
 import org.openzen.zenscript.codemodel.Module;
16
 import org.openzen.zenscript.codemodel.ModuleSpace;
18
 import org.openzen.zenscript.codemodel.ModuleSpace;
17
 import org.openzen.zenscript.codemodel.SemanticModule;
19
 import org.openzen.zenscript.codemodel.SemanticModule;
49
 		
51
 		
50
 		try {
52
 		try {
51
 			ZippedPackage stdlibs = new ZippedPackage(ScriptingEngine.class.getResourceAsStream("/StdLibs.zip"));
53
 			ZippedPackage stdlibs = new ZippedPackage(ScriptingEngine.class.getResourceAsStream("/StdLibs.zip"));
52
-			SemanticModule stdlibModule = stdlibs.loadModule(space, "stdlib", null, new SemanticModule[0], stdlib);
54
+			SemanticModule stdlibModule = stdlibs.loadModule(space, "stdlib", null, new SemanticModule[0], FunctionParameter.NONE, stdlib);
53
 			stdlibModule = Validator.validate(stdlibModule, error -> System.out.println(error.toString()));
55
 			stdlibModule = Validator.validate(stdlibModule, error -> System.out.println(error.toString()));
54
 			space.addModule("stdlib", stdlibModule);
56
 			space.addModule("stdlib", stdlibModule);
55
 		} catch (IOException ex) {
57
 		} catch (IOException ex) {
81
 	}
83
 	}
82
 	
84
 	
83
 	public SemanticModule createScriptedModule(String name, SourceFile[] sources, String... dependencies) throws ParseException {
85
 	public SemanticModule createScriptedModule(String name, SourceFile[] sources, String... dependencies) throws ParseException {
84
-		return createScriptedModule(name, sources, null, dependencies);
86
+		return createScriptedModule(name, sources, null, FunctionParameter.NONE, dependencies);
85
 	}
87
 	}
86
 	
88
 	
87
-	public SemanticModule createScriptedModule(String name, SourceFile[] sources, BracketExpressionParser bracketParser, String... dependencies) throws ParseException {
89
+	public SemanticModule createScriptedModule(
90
+			String name,
91
+			SourceFile[] sources,
92
+			BracketExpressionParser bracketParser,
93
+			FunctionParameter[] scriptParameters,
94
+			String... dependencies) throws ParseException
95
+	{
88
 		Module scriptModule = new Module(name);
96
 		Module scriptModule = new Module(name);
89
 		CompilingPackage scriptPackage = new CompilingPackage(new ZSPackage(space.rootPackage, name), scriptModule);
97
 		CompilingPackage scriptPackage = new CompilingPackage(new ZSPackage(space.rootPackage, name), scriptModule);
90
 		
98
 		
103
 				scriptPackage,
111
 				scriptPackage,
104
 				files,
112
 				files,
105
 				space,
113
 				space,
114
+				scriptParameters,
106
 				ex -> ex.printStackTrace());
115
 				ex -> ex.printStackTrace());
107
 		if (!scripts.isValid())
116
 		if (!scripts.isValid())
108
 			return scripts;
117
 			return scripts;
117
 	}
126
 	}
118
 	
127
 	
119
 	public void run() {
128
 	public void run() {
129
+		run(Collections.emptyMap());
130
+	}
131
+	
132
+	public void run(Map<FunctionParameter, Object> arguments) {
120
 		SimpleJavaCompileSpace javaSpace = new SimpleJavaCompileSpace(registry);
133
 		SimpleJavaCompileSpace javaSpace = new SimpleJavaCompileSpace(registry);
121
 		for (JavaNativeModule nativeModule : nativeModules)
134
 		for (JavaNativeModule nativeModule : nativeModules)
122
 			javaSpace.register(nativeModule.getCompiled());
135
 			javaSpace.register(nativeModule.getCompiled());
128
 			runUnit.add(compiler.compile(compiled.name, compiled, javaSpace));
141
 			runUnit.add(compiler.compile(compiled.name, compiled, javaSpace));
129
 		if (debug)
142
 		if (debug)
130
 			runUnit.dump(new File("classes"));
143
 			runUnit.dump(new File("classes"));
131
-		runUnit.run();
144
+		runUnit.run(arguments);
132
 	}
145
 	}
133
 }
146
 }

+ 3
- 1
JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaCompiledModule.java Bestand weergeven

24
  */
24
  */
25
 public class JavaCompiledModule {
25
 public class JavaCompiledModule {
26
 	public final Module module;
26
 	public final Module module;
27
+	public final FunctionParameter[] scriptParameters;
27
 	
28
 	
28
 	private final Map<HighLevelDefinition, JavaClass> classes = new HashMap<>();
29
 	private final Map<HighLevelDefinition, JavaClass> classes = new HashMap<>();
29
 	private final Map<HighLevelDefinition, JavaClass> expansionClasses = new HashMap<>();
30
 	private final Map<HighLevelDefinition, JavaClass> expansionClasses = new HashMap<>();
34
 	private final Map<FunctionParameter, JavaParameterInfo> parameters = new HashMap<>();
35
 	private final Map<FunctionParameter, JavaParameterInfo> parameters = new HashMap<>();
35
 	private final Map<VariantDefinition.Option, JavaVariantOption> variantOptions = new HashMap<>();
36
 	private final Map<VariantDefinition.Option, JavaVariantOption> variantOptions = new HashMap<>();
36
 	
37
 	
37
-	public JavaCompiledModule(Module module) {
38
+	public JavaCompiledModule(Module module, FunctionParameter[] scriptParameters) {
38
 		this.module = module;
39
 		this.module = module;
40
+		this.scriptParameters = scriptParameters;
39
 	}
41
 	}
40
 	
42
 	
41
 	public void loadMappings(String mappings) {
43
 	public void loadMappings(String mappings) {

+ 4
- 0
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaMemberCompiler.java Bestand weergeven

35
 import org.openzen.zenscript.codemodel.statement.EmptyStatement;
35
 import org.openzen.zenscript.codemodel.statement.EmptyStatement;
36
 import org.openzen.zenscript.codemodel.statement.Statement;
36
 import org.openzen.zenscript.codemodel.statement.Statement;
37
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
37
 import org.openzen.zenscript.codemodel.type.BasicTypeID;
38
+import org.openzen.zenscript.codemodel.type.member.BuiltinID;
38
 import org.openzen.zenscript.codemodel.type.storage.UniqueStorageTag;
39
 import org.openzen.zenscript.codemodel.type.storage.UniqueStorageTag;
39
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
40
 import org.openzen.zenscript.javasource.scope.JavaSourceFileScope;
40
 import org.openzen.zenscript.javashared.JavaClass;
41
 import org.openzen.zenscript.javashared.JavaClass;
155
 
156
 
156
 	@Override
157
 	@Override
157
 	public Void visitConstructor(ConstructorMember member) {
158
 	public Void visitConstructor(ConstructorMember member) {
159
+		if (member.body == null)
160
+			return null; // happens with default constructors
161
+		
158
 		begin(ElementType.CONSTRUCTOR);
162
 		begin(ElementType.CONSTRUCTOR);
159
 		
163
 		
160
 		output.append(indent);
164
 		output.append(indent);

+ 4
- 3
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceCompiler.java Bestand weergeven

8
 import java.util.HashMap;
8
 import java.util.HashMap;
9
 import java.util.Map;
9
 import java.util.Map;
10
 import org.openzen.zencode.shared.SourceFile;
10
 import org.openzen.zencode.shared.SourceFile;
11
+import org.openzen.zenscript.codemodel.FunctionParameter;
11
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
12
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.codemodel.Module;
13
 import org.openzen.zenscript.codemodel.ScriptBlock;
14
 import org.openzen.zenscript.codemodel.ScriptBlock;
26
 	public final JavaSourceModule helpers;
27
 	public final JavaSourceModule helpers;
27
 	
28
 	
28
 	public JavaSourceCompiler(GlobalTypeRegistry registry) {
29
 	public JavaSourceCompiler(GlobalTypeRegistry registry) {
29
-		helpers = new JavaSourceModule(new Module("helpers"));
30
+		helpers = new JavaSourceModule(new Module("helpers"), FunctionParameter.NONE);
30
 		settings = new JavaSourceFormattingSettings.Builder().build();
31
 		settings = new JavaSourceFormattingSettings.Builder().build();
31
 	}
32
 	}
32
 	
33
 	
33
 	public JavaSourceModule compile(SemanticModule module, JavaCompileSpace space, String basePackage) {
34
 	public JavaSourceModule compile(SemanticModule module, JavaCompileSpace space, String basePackage) {
34
 		JavaSourceContext context = new JavaSourceContext(helpers, settings, space, module.modulePackage, basePackage);
35
 		JavaSourceContext context = new JavaSourceContext(helpers, settings, space, module.modulePackage, basePackage);
35
 		
36
 		
36
-		JavaSourceModule result = new JavaSourceModule(module.module);
37
+		JavaSourceModule result = new JavaSourceModule(module.module, module.parameters);
37
 		context.addModule(module.module, result);
38
 		context.addModule(module.module, result);
38
 		
39
 		
39
 		Map<String, JavaSourceFile> sourceFiles = new HashMap<>();
40
 		Map<String, JavaSourceFile> sourceFiles = new HashMap<>();
72
 	}
73
 	}
73
 	
74
 	
74
 	private String getFilename(HighLevelDefinition definition) {
75
 	private String getFilename(HighLevelDefinition definition) {
75
-		SourceFile source = definition.getTag(SourceFile.class);
76
+		SourceFile source = definition.position.file;
76
 		if (source != null) {
77
 		if (source != null) {
77
 			int slash = Math.max(source.getFilename().lastIndexOf('/'), source.getFilename().lastIndexOf('\\'));
78
 			int slash = Math.max(source.getFilename().lastIndexOf('/'), source.getFilename().lastIndexOf('\\'));
78
 			String filename = source.getFilename().substring(slash < 0 ? 0 : slash + 1);
79
 			String filename = source.getFilename().substring(slash < 0 ? 0 : slash + 1);

+ 3
- 2
JavaSourceCompiler/src/main/java/org/openzen/zenscript/javasource/JavaSourceModule.java Bestand weergeven

7
 
7
 
8
 import java.util.ArrayList;
8
 import java.util.ArrayList;
9
 import java.util.List;
9
 import java.util.List;
10
+import org.openzen.zenscript.codemodel.FunctionParameter;
10
 import org.openzen.zenscript.codemodel.Module;
11
 import org.openzen.zenscript.codemodel.Module;
11
 import org.openzen.zenscript.javashared.JavaCompiledModule;
12
 import org.openzen.zenscript.javashared.JavaCompiledModule;
12
 
13
 
17
 public class JavaSourceModule extends JavaCompiledModule {
18
 public class JavaSourceModule extends JavaCompiledModule {
18
 	public final List<SourceFile> sourceFiles = new ArrayList<>();
19
 	public final List<SourceFile> sourceFiles = new ArrayList<>();
19
 	
20
 	
20
-	public JavaSourceModule(Module module) {
21
-		super(module);
21
+	public JavaSourceModule(Module module, FunctionParameter[] parameters) {
22
+		super(module, parameters);
22
 	}
23
 	}
23
 	
24
 	
24
 	public void addFile(String filename, String content) {
25
 	public void addFile(String filename, String content) {

+ 11
- 6
Parser/src/main/java/org/openzen/zenscript/parser/ParsedFile.java Bestand weergeven

17
 import org.openzen.zencode.shared.FileSourceFile;
17
 import org.openzen.zencode.shared.FileSourceFile;
18
 import org.openzen.zencode.shared.LiteralSourceFile;
18
 import org.openzen.zencode.shared.LiteralSourceFile;
19
 import org.openzen.zencode.shared.SourceFile;
19
 import org.openzen.zencode.shared.SourceFile;
20
+import org.openzen.zenscript.codemodel.FunctionHeader;
21
+import org.openzen.zenscript.codemodel.FunctionParameter;
20
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
22
 import org.openzen.zenscript.codemodel.HighLevelDefinition;
21
 import org.openzen.zenscript.codemodel.Modifiers;
23
 import org.openzen.zenscript.codemodel.Modifiers;
22
 import org.openzen.zenscript.codemodel.ModuleSpace;
24
 import org.openzen.zenscript.codemodel.ModuleSpace;
36
 import org.openzen.zenscript.codemodel.scope.GlobalScriptScope;
38
 import org.openzen.zenscript.codemodel.scope.GlobalScriptScope;
37
 import org.openzen.zenscript.codemodel.type.ISymbol;
39
 import org.openzen.zenscript.codemodel.type.ISymbol;
38
 import org.openzen.zenscript.codemodel.scope.StatementScope;
40
 import org.openzen.zenscript.codemodel.scope.StatementScope;
41
+import org.openzen.zenscript.codemodel.type.BasicTypeID;
39
 import org.openzen.zenscript.lexer.ParseException;
42
 import org.openzen.zenscript.lexer.ParseException;
40
 import org.openzen.zenscript.parser.statements.ParsedStatement;
43
 import org.openzen.zenscript.parser.statements.ParsedStatement;
41
 
44
 
49
 			CompilingPackage pkg,
52
 			CompilingPackage pkg,
50
 			ParsedFile[] files,
53
 			ParsedFile[] files,
51
 			ModuleSpace registry,
54
 			ModuleSpace registry,
55
+			FunctionParameter[] parameters,
52
 			Consumer<CompileException> exceptionLogger) {
56
 			Consumer<CompileException> exceptionLogger) {
53
 		// We are considering all these files to be in the same package, so make
57
 		// We are considering all these files to be in the same package, so make
54
 		// a single PackageDefinition instance. If these files were in multiple
58
 		// a single PackageDefinition instance. If these files were in multiple
88
 		}
92
 		}
89
 		
93
 		
90
 		if (failed)
94
 		if (failed)
91
-			return new SemanticModule(pkg.module, dependencies, SemanticModule.State.INVALID, rootPackage, pkg.getPackage(), definitions, Collections.emptyList(), registry.registry, expansions, registry.getAnnotations(), registry.getStorageTypes());
95
+			return new SemanticModule(pkg.module, dependencies, parameters, SemanticModule.State.INVALID, rootPackage, pkg.getPackage(), definitions, Collections.emptyList(), registry.registry, expansions, registry.getAnnotations(), registry.getStorageTypes());
92
 		
96
 		
93
 		// scripts will store all the script blocks encountered in the files
97
 		// scripts will store all the script blocks encountered in the files
94
 		PrecompilationState precompiler = new PrecompilationState();
98
 		PrecompilationState precompiler = new PrecompilationState();
97
 		}
101
 		}
98
 		
102
 		
99
 		List<ScriptBlock> scripts = new ArrayList<>();
103
 		List<ScriptBlock> scripts = new ArrayList<>();
104
+		FunctionHeader scriptHeader = new FunctionHeader(BasicTypeID.VOID, parameters);
100
 		for (ParsedFile file : files) {
105
 		for (ParsedFile file : files) {
101
 			// compileCode will convert the parsed statements and expressions
106
 			// compileCode will convert the parsed statements and expressions
102
 			// into semantic code. This semantic code can then be compiled
107
 			// into semantic code. This semantic code can then be compiled
103
 			// to various targets.
108
 			// to various targets.
104
-			file.compileCode(moduleContext, precompiler, rootPackage, pkg, expansions, scripts, globals, exceptionLogger);
109
+			file.compileCode(moduleContext, precompiler, rootPackage, pkg, expansions, scripts, globals, scriptHeader, exceptionLogger);
105
 		}
110
 		}
106
 		
111
 		
107
 		return new SemanticModule(
112
 		return new SemanticModule(
108
 				pkg.module,
113
 				pkg.module,
109
 				dependencies,
114
 				dependencies,
115
+				parameters,
110
 				SemanticModule.State.ASSEMBLED,
116
 				SemanticModule.State.ASSEMBLED,
111
 				rootPackage,
117
 				rootPackage,
112
 				pkg.getPackage(),
118
 				pkg.getPackage(),
187
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
193
 					result.statements.add(ParsedStatement.parse(tokens, annotations));
188
 				} else {
194
 				} else {
189
 					result.definitions.add(definition);
195
 					result.definitions.add(definition);
190
-					definition.getCompiled().setTag(SourceFile.class, tokens.getFile());
191
 				}
196
 				}
192
 			}
197
 			}
193
 		}
198
 		}
277
 			List<ExpansionDefinition> expansions,
282
 			List<ExpansionDefinition> expansions,
278
 			List<ScriptBlock> scripts,
283
 			List<ScriptBlock> scripts,
279
 			Map<String, ISymbol> globals,
284
 			Map<String, ISymbol> globals,
285
+			FunctionHeader scriptHeader,
280
 			Consumer<CompileException> exceptionLogger) {
286
 			Consumer<CompileException> exceptionLogger) {
281
 		FileResolutionContext context = new FileResolutionContext(moduleContext, rootPackage, modulePackage);
287
 		FileResolutionContext context = new FileResolutionContext(moduleContext, rootPackage, modulePackage);
282
 		loadImports(context, rootPackage, modulePackage);
288
 		loadImports(context, rootPackage, modulePackage);
291
 		}
297
 		}
292
 		
298
 		
293
 		if (!statements.isEmpty() || postComment != null) {
299
 		if (!statements.isEmpty() || postComment != null) {
294
-			StatementScope statementScope = new GlobalScriptScope(scope);
300
+			StatementScope statementScope = new GlobalScriptScope(scope, scriptHeader);
295
 			List<Statement> statements = new ArrayList<>();
301
 			List<Statement> statements = new ArrayList<>();
296
 			for (ParsedStatement statement : this.statements) {
302
 			for (ParsedStatement statement : this.statements) {
297
 				statements.add(statement.compile(statementScope));
303
 				statements.add(statement.compile(statementScope));
298
 			}
304
 			}
299
 			
305
 			
300
-			ScriptBlock block = new ScriptBlock(modulePackage.module, modulePackage.getPackage(), statements);
301
-			block.setTag(SourceFile.class, file);
306
+			ScriptBlock block = new ScriptBlock(file, modulePackage.module, modulePackage.getPackage(), scriptHeader, statements);
302
 			block.setTag(WhitespacePostComment.class, postComment);
307
 			block.setTag(WhitespacePostComment.class, postComment);
303
 			scripts.add(block);
308
 			scripts.add(block);
304
 		}
309
 		}

+ 5
- 3
Parser/src/main/java/org/openzen/zenscript/parser/ZippedPackage.java Bestand weergeven

17
 import java.util.zip.ZipInputStream;
17
 import java.util.zip.ZipInputStream;
18
 import org.openzen.zencode.shared.LiteralSourceFile;
18
 import org.openzen.zencode.shared.LiteralSourceFile;
19
 import org.openzen.zencode.shared.SourceFile;
19
 import org.openzen.zencode.shared.SourceFile;
20
+import org.openzen.zenscript.codemodel.FunctionParameter;
20
 import org.openzen.zenscript.codemodel.Module;
21
 import org.openzen.zenscript.codemodel.Module;
21
 import org.openzen.zenscript.codemodel.ModuleSpace;
22
 import org.openzen.zenscript.codemodel.ModuleSpace;
22
 import org.openzen.zenscript.codemodel.SemanticModule;
23
 import org.openzen.zenscript.codemodel.SemanticModule;
56
 		}
57
 		}
57
 	}
58
 	}
58
 	
59
 	
59
-	public SemanticModule loadModule(ModuleSpace space, String name, BracketExpressionParser bracketParser, SemanticModule[] dependencies) throws ParseException {
60
-		return loadModule(space, name, bracketParser, dependencies, new ZSPackage(space.rootPackage, name));
60
+	public SemanticModule loadModule(ModuleSpace space, String name, BracketExpressionParser bracketParser, SemanticModule[] dependencies, FunctionParameter[] scriptParameters) throws ParseException {
61
+		return loadModule(space, name, bracketParser, dependencies, scriptParameters, new ZSPackage(space.rootPackage, name));
61
 	}
62
 	}
62
 	
63
 	
63
-	public SemanticModule loadModule(ModuleSpace space, String name, BracketExpressionParser bracketParser, SemanticModule[] dependencies, ZSPackage pkg) throws ParseException {
64
+	public SemanticModule loadModule(ModuleSpace space, String name, BracketExpressionParser bracketParser, SemanticModule[] dependencies, FunctionParameter[] scriptParameters, ZSPackage pkg) throws ParseException {
64
 		List<SourceFile> sourceFiles = files.get(name);
65
 		List<SourceFile> sourceFiles = files.get(name);
65
 		if (sourceFiles == null)
66
 		if (sourceFiles == null)
66
 			return null; // no such module
67
 			return null; // no such module
76
 				scriptPackage,
77
 				scriptPackage,
77
 				files,
78
 				files,
78
 				space,
79
 				space,
80
+				scriptParameters,
79
 				ex -> ex.printStackTrace());
81
 				ex -> ex.printStackTrace());
80
 		return scripts.normalize();
82
 		return scripts.normalize();
81
 	}
83
 	}

+ 3
- 0
ScriptingExample/scripts/scriptparameters.zs Bestand weergeven

1
+println("Arguments:");
2
+for i, arg in args
3
+	println("- " + i + ": " + arg);

+ 11
- 2
ScriptingExample/src/main/java/org/openzen/zenscript/scriptingexample/Main.java Bestand weergeven

2
 
2
 
3
 import java.io.File;
3
 import java.io.File;
4
 import java.io.IOException;
4
 import java.io.IOException;
5
+import java.util.Collections;
6
+import java.util.HashMap;
7
+import java.util.Map;
5
 import java.util.Optional;
8
 import java.util.Optional;
6
 import org.openzen.zencode.java.JavaNativeModule;
9
 import org.openzen.zencode.java.JavaNativeModule;
7
 import org.openzen.zencode.java.ScriptingEngine;
10
 import org.openzen.zencode.java.ScriptingEngine;
9
 import org.openzen.zencode.shared.CompileException;
12
 import org.openzen.zencode.shared.CompileException;
10
 import org.openzen.zencode.shared.FileSourceFile;
13
 import org.openzen.zencode.shared.FileSourceFile;
11
 import org.openzen.zencode.shared.SourceFile;
14
 import org.openzen.zencode.shared.SourceFile;
15
+import org.openzen.zenscript.codemodel.FunctionParameter;
12
 import org.openzen.zenscript.codemodel.SemanticModule;
16
 import org.openzen.zenscript.codemodel.SemanticModule;
17
+import org.openzen.zenscript.codemodel.type.StringTypeID;
13
 import org.openzen.zenscript.lexer.ParseException;
18
 import org.openzen.zenscript.lexer.ParseException;
14
 import org.openzen.zenscript.lexer.ZSToken;
19
 import org.openzen.zenscript.lexer.ZSToken;
15
 import org.openzen.zenscript.lexer.ZSTokenParser;
20
 import org.openzen.zenscript.lexer.ZSTokenParser;
34
 		for (int i = 0; i < inputFiles.length; i++)
39
 		for (int i = 0; i < inputFiles.length; i++)
35
 			sourceFiles[i] = new FileSourceFile(inputFiles[i].getName(), inputFiles[i]);
40
 			sourceFiles[i] = new FileSourceFile(inputFiles[i].getName(), inputFiles[i]);
36
 		
41
 		
37
-		SemanticModule scripts = scriptingEngine.createScriptedModule("script", sourceFiles, new TestBracketParser());
42
+		FunctionParameter parameter = new FunctionParameter(scriptingEngine.registry.getArray(StringTypeID.AUTO, 1).stored(), "args");
43
+		SemanticModule scripts = scriptingEngine.createScriptedModule("script", sourceFiles, new TestBracketParser(), new FunctionParameter[] { parameter });
38
 		if (!scripts.isValid())
44
 		if (!scripts.isValid())
39
 			return;
45
 			return;
40
 		
46
 		
41
 		scriptingEngine.registerCompiled(scripts);
47
 		scriptingEngine.registerCompiled(scripts);
42
-		scriptingEngine.run();
48
+		
49
+		Map<FunctionParameter, Object> scriptArgs = new HashMap<>();
50
+		scriptArgs.put(parameter, new String[] { "hello", "world", "example" });
51
+		scriptingEngine.run(scriptArgs);
43
 	}
52
 	}
44
 	
53
 	
45
 	private static class TestBracketParser implements BracketExpressionParser {
54
 	private static class TestBracketParser implements BracketExpressionParser {

+ 1
- 1
Shared/src/main/java/org/openzen/zencode/shared/SourceFile.java Bestand weergeven

3
 import java.io.IOException;
3
 import java.io.IOException;
4
 import java.io.Reader;
4
 import java.io.Reader;
5
 
5
 
6
-public interface SourceFile extends Tag {
6
+public interface SourceFile {
7
     String getFilename();
7
     String getFilename();
8
     
8
     
9
     Reader open() throws IOException;
9
     Reader open() throws IOException;

+ 1
- 0
Validator/src/main/java/org/openzen/zenscript/validator/Validator.java Bestand weergeven

48
 		return new SemanticModule(
48
 		return new SemanticModule(
49
 				module.module,
49
 				module.module,
50
 				module.dependencies,
50
 				module.dependencies,
51
+				module.parameters,
51
 				state,
52
 				state,
52
 				module.rootPackage,
53
 				module.rootPackage,
53
 				module.modulePackage,
54
 				module.modulePackage,

Laden…
Annuleren
Opslaan