diff --git a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java index 14a6c507d..09a7bfe49 100644 --- a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java +++ b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java @@ -32,7 +32,7 @@ import static org.openzen.zenscript.javabytecode.compiler.JavaMethodBytecodeCompiler.OBJECT_HASHCODE; public class JavaExpressionVisitor implements ExpressionVisitor { - private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true); private static final JavaNativeMethod ARRAY_NEWINSTANCE = JavaNativeMethod.getNativeStatic(JavaClass.ARRAY, "newInstance", "(Ljava/lang/Class;I)Ljava/lang/Object;"); private static final MethodID CONSTRUCTOR = MethodID.staticOperator(OperatorType.CONSTRUCTOR); diff --git a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java index d87b1bcd2..a65d920b2 100644 --- a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java +++ b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java @@ -69,7 +69,7 @@ public void visitIteratorIterator(Type targetType) { javaWriter.dup(); javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0)); javaWriter.ifEQ(endLabel); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true)); javaWriter.checkCast(targetType); final JavaLocalVariableInfo variable = javaWriter.getLocalVariable(statement.loopVariables[0].variable); javaWriter.store(variable.type, variable.local); @@ -120,7 +120,7 @@ public void visitCustomIterator() { javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0)); javaWriter.ifEQ(endLabel); javaWriter.dup(); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true)); final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable); this.downCast(0, keyVariable.type); @@ -138,7 +138,7 @@ public void visitAssocKeyIterator() { javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0)); javaWriter.ifEQ(endLabel); javaWriter.dup(); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true)); final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable); this.downCast(0, keyVariable.type); @@ -156,7 +156,7 @@ public void visitAssocKeyValueIterator() { javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0)); javaWriter.ifEQ(endLabel); javaWriter.dup(); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true)); javaWriter.checkCast(Type.getType(Map.Entry.class)); javaWriter.dup(false); @@ -164,11 +164,11 @@ public void visitAssocKeyValueIterator() { final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable); final JavaLocalVariableInfo valueVariable = javaWriter.getLocalVariable(statement.loopVariables[1].variable); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getKey", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getKey", "()Ljava/lang/Object;", 0, true)); this.downCast(0, keyVariable.type); javaWriter.store(keyVariable.type, keyVariable.local); - javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getValue", "()Ljava/lang/Object;", 0)); + javaWriter.invokeInterface(JavaNativeMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getValue", "()Ljava/lang/Object;", 0, true)); this.downCast(1, valueVariable.type); javaWriter.store(valueVariable.type, valueVariable.local); diff --git a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java index 6fa6087be..5a3a60b9f 100644 --- a/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java +++ b/JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaMethodBytecodeCompiler.java @@ -86,8 +86,8 @@ public class JavaMethodBytecodeCompiler implements JavaMethodCompiler { private static final JavaNativeMethod STRING_CONTAINS = JavaNativeMethod.getNativeVirtual(JavaClass.STRING, "contains", "(Ljava/lang/CharSequence;)Z"); private static final JavaNativeMethod ENUM_COMPARETO = JavaNativeMethod.getNativeVirtual(JavaClass.ENUM, "compareTo", "(Ljava/lang/Enum;)I"); private static final JavaNativeMethod HASHMAP_INIT = JavaNativeMethod.getNativeConstructor(JavaClass.HASHMAP, "()V"); - private static final JavaNativeMethod MAP_GET = JavaNativeMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); - private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + private static final JavaNativeMethod MAP_GET = JavaNativeMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); + private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true); private static final JavaNativeMethod MAP_PUT_ALL = JavaNativeMethod.getInterface(JavaClass.MAP, "putAll", "(Ljava/util/Map;)V"); private static final JavaNativeMethod MAP_CONTAINS_KEY = JavaNativeMethod.getInterface(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z"); private static final JavaNativeMethod MAP_SIZE = JavaNativeMethod.getInterface(JavaClass.MAP, "size", "()I"); diff --git a/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java b/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java index 3ab49cdeb..0a705b94b 100644 --- a/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java +++ b/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java @@ -85,8 +85,8 @@ public class JavaBuiltinModule { private static final JavaNativeMethod ENUM_NAME = JavaNativeMethod.getNativeVirtual(JavaClass.ENUM, "name", "()Ljava/lang/String;"); private static final JavaNativeMethod ENUM_ORDINAL = JavaNativeMethod.getNativeVirtual(JavaClass.ENUM, "ordinal", "()I"); private static final JavaNativeMethod HASHMAP_INIT = JavaNativeMethod.getNativeConstructor(JavaClass.HASHMAP, "()V"); - private static final JavaNativeMethod MAP_GET = JavaNativeMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); - private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); + private static final JavaNativeMethod MAP_GET = JavaNativeMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true); + private static final JavaNativeMethod MAP_PUT = JavaNativeMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true); private static final JavaNativeMethod MAP_PUT_ALL = JavaNativeMethod.getInterface(JavaClass.MAP, "putAll", "(Ljava/util/Map;)V"); private static final JavaNativeMethod MAP_CONTAINS_KEY = JavaNativeMethod.getInterface(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z"); private static final JavaNativeMethod MAP_SIZE = JavaNativeMethod.getInterface(JavaClass.MAP, "size", "()I"); diff --git a/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeMethod.java b/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeMethod.java index 1343e6b77..ba0570d51 100644 --- a/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeMethod.java +++ b/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaNativeMethod.java @@ -60,7 +60,11 @@ public static JavaNativeMethod getDestructor(JavaClass cls, int modifiers) { } public static JavaNativeMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers) { - return new JavaNativeMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, false); + return getStatic(cls, name, descriptor, modifiers, false); + } + + public static JavaNativeMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers, boolean genericResult) { + return new JavaNativeMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, genericResult); } public static JavaNativeMethod getNativeStatic(JavaClass cls, String name, String descriptor) { @@ -68,7 +72,11 @@ public static JavaNativeMethod getNativeStatic(JavaClass cls, String name, Strin } public static JavaNativeMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers) { - return new JavaNativeMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, false); + return getVirtual(cls, name, descriptor, modifiers, false); + } + + public static JavaNativeMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers, boolean genericResult) { + return new JavaNativeMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, genericResult); } public static JavaNativeMethod getNativeVirtual(JavaClass cls, String name, String descriptor) { @@ -76,7 +84,11 @@ public static JavaNativeMethod getNativeVirtual(JavaClass cls, String name, Stri } public static JavaNativeMethod getInterface(JavaClass cls, String name, String descriptor) { - return new JavaNativeMethod(cls, Kind.INTERFACE, name, false, descriptor, JavaModifiers.PUBLIC, false); + return getInterface(cls, name, descriptor, false); + } + + public static JavaNativeMethod getInterface(JavaClass cls, String name, String descriptor, boolean genericResult) { + return new JavaNativeMethod(cls, Kind.INTERFACE, name, false, descriptor, JavaModifiers.PUBLIC, genericResult); } public static JavaNativeMethod getNativeExpansion(JavaClass cls, String name, String descriptor) { diff --git a/JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java b/JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java index 9f13dd633..183c8cf09 100644 --- a/JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java +++ b/JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java @@ -64,7 +64,8 @@ public Void visitFunction(FunctionDefinition definition) { class_.compiled, definition.name, descriptor, - JavaModifiers.getJavaModifiers(definition.modifiers)); + JavaModifiers.getJavaModifiers(definition.modifiers), + definition.header.getReturnType().isGeneric()); class_.addMethod(definition.caller, new JavaCompilingMethod(class_.compiled, method, signature)); return null; }