Skip to content

Commit f63b255

Browse files
authored
Fix JavaMethod#genericResult not being set (#136)
1 parent 461d4db commit f63b255

File tree

5 files changed

+27
-15
lines changed

5 files changed

+27
-15
lines changed

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaExpressionVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ public class JavaExpressionVisitor implements ExpressionVisitor<Void>, JavaNativ
116116
private static final JavaMethod ENUM_NAME = JavaMethod.getNativeVirtual(JavaClass.ENUM, "name", "()Ljava/lang/String;");
117117
public static final JavaMethod ENUM_ORDINAL = JavaMethod.getNativeVirtual(JavaClass.ENUM, "ordinal", "()I");
118118
private static final JavaMethod HASHMAP_INIT = JavaMethod.getNativeConstructor(JavaClass.HASHMAP, "()V");
119-
private static final JavaMethod MAP_GET = JavaMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;");
120-
private static final JavaMethod MAP_PUT = JavaMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
119+
private static final JavaMethod MAP_GET = JavaMethod.getInterface(JavaClass.MAP, "get", "(Ljava/lang/Object;)Ljava/lang/Object;", true);
120+
private static final JavaMethod MAP_PUT = JavaMethod.getInterface(JavaClass.MAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", true);
121121
private static final JavaMethod MAP_PUT_ALL = JavaMethod.getInterface(JavaClass.MAP, "putAll", "(Ljava/util/Map;)V");
122122
private static final JavaMethod MAP_CONTAINS_KEY = JavaMethod.getInterface(JavaClass.MAP, "containsKey", "(Ljava/lang/Object;)Z");
123123
private static final JavaMethod MAP_SIZE = JavaMethod.getInterface(JavaClass.MAP, "size", "()I");

JavaBytecodeCompiler/src/main/java/org/openzen/zenscript/javabytecode/compiler/JavaForeachWriter.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void visitIteratorIterator(Type targetType) {
7171
javaWriter.dup();
7272
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0));
7373
javaWriter.ifEQ(endLabel);
74-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0));
74+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true));
7575
javaWriter.checkCast(targetType);
7676
final JavaLocalVariableInfo variable = javaWriter.getLocalVariable(statement.loopVariables[0].variable);
7777
javaWriter.store(variable.type, variable.local);
@@ -117,7 +117,7 @@ public void visitCustomIterator() {
117117
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0));
118118
javaWriter.ifEQ(endLabel);
119119
javaWriter.dup();
120-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0));
120+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true));
121121

122122
final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable);
123123
this.downCast(0, keyVariable.type);
@@ -135,7 +135,7 @@ public void visitAssocKeyIterator() {
135135
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0));
136136
javaWriter.ifEQ(endLabel);
137137
javaWriter.dup();
138-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0));
138+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true));
139139

140140
final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable);
141141
this.downCast(0, keyVariable.type);
@@ -153,19 +153,19 @@ public void visitAssocKeyValueIterator() {
153153
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "hasNext", "()Z", 0));
154154
javaWriter.ifEQ(endLabel);
155155
javaWriter.dup();
156-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0));
156+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.ITERATOR, "next", "()Ljava/lang/Object;", 0, true));
157157
javaWriter.checkCast(Type.getType(Map.Entry.class));
158158
javaWriter.dup(false);
159159

160160

161161
final JavaLocalVariableInfo keyVariable = javaWriter.getLocalVariable(statement.loopVariables[0].variable);
162162
final JavaLocalVariableInfo valueVariable = javaWriter.getLocalVariable(statement.loopVariables[1].variable);
163163

164-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getKey", "()Ljava/lang/Object;", 0));
164+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getKey", "()Ljava/lang/Object;", 0, true));
165165
this.downCast(0, keyVariable.type);
166166
javaWriter.store(keyVariable.type, keyVariable.local);
167167

168-
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getValue", "()Ljava/lang/Object;", 0));
168+
javaWriter.invokeInterface(JavaMethod.getVirtual(JavaClass.fromInternalName("java/util/Map$Entry", JavaClass.Kind.INTERFACE), "getValue", "()Ljava/lang/Object;", 0, true));
169169
this.downCast(1, valueVariable.type);
170170
javaWriter.store(valueVariable.type, valueVariable.local);
171171

JavaIntegration/src/main/java/org/openzen/zencode/java/module/converters/JavaNativeExpansionConverter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ private void fillMethod(ExpansionDefinition expansion, JavaClass javaClass, Meth
165165
final MethodMember member = new MethodMember(CodePosition.NATIVE, expansion, headerConverter.getMethodModifiers(method) ^ Modifiers.STATIC, name, header, null);
166166

167167
expansion.addMember(member);
168-
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method)));
168+
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method), member.getHeader().getReturnType().isGeneric()));
169169
}
170170

171171
private void fillStaticMethod(ExpansionDefinition expansion, JavaClass javaClass, Method method, ZenCodeType.StaticExpansionMethod annotation) {
@@ -176,7 +176,7 @@ private void fillStaticMethod(ExpansionDefinition expansion, JavaClass javaClass
176176
final MethodMember member = new MethodMember(CodePosition.NATIVE, expansion, headerConverter.getMethodModifiers(method), name, header, null);
177177

178178
expansion.addMember(member);
179-
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method)));
179+
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method), header.getReturnType().isGeneric()));
180180
}
181181

182182
private void fillOperator(ExpansionDefinition expansion, JavaClass javaClass, Method method, Class<?> classFromType, ZenCodeType.Operator operator) {
@@ -189,7 +189,7 @@ private void fillOperator(ExpansionDefinition expansion, JavaClass javaClass, Me
189189
final OperatorMember member = new OperatorMember(CodePosition.NATIVE, expansion, headerConverter.getMethodModifiers(method) ^ Modifiers.STATIC, operatorType, header, null);
190190

191191
expansion.addMember(member);
192-
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method)));
192+
typeConversionContext.compiled.setMethodInfo(member, JavaMethod.getStatic(javaClass, method.getName(), org.objectweb.asm.Type.getMethodDescriptor(method), headerConverter.getMethodModifiers(method), header.getReturnType().isGeneric()));
193193
}
194194

195195
private OperatorType getOperatorTypeFrom(ZenCodeType.Operator operator) {

JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaMethod.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,23 +66,35 @@ public static JavaMethod getDestructor(JavaClass cls, int modifiers) {
6666
}
6767

6868
public static JavaMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers) {
69-
return new JavaMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, false);
69+
return getStatic(cls, name, descriptor, modifiers, false);
70+
}
71+
72+
public static JavaMethod getStatic(JavaClass cls, String name, String descriptor, int modifiers, boolean genericResult) {
73+
return new JavaMethod(cls, Kind.STATIC, name, true, descriptor, modifiers | JavaModifiers.STATIC, genericResult);
7074
}
7175

7276
public static JavaMethod getNativeStatic(JavaClass cls, String name, String descriptor) {
7377
return new JavaMethod(cls, Kind.STATIC, name, false, descriptor, JavaModifiers.STATIC | JavaModifiers.PUBLIC, false);
7478
}
7579

7680
public static JavaMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers) {
77-
return new JavaMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, false);
81+
return getVirtual(cls, name, descriptor, modifiers, false);
82+
}
83+
84+
public static JavaMethod getVirtual(JavaClass cls, String name, String descriptor, int modifiers, boolean genericResult) {
85+
return new JavaMethod(cls, Kind.INSTANCE, name, true, descriptor, modifiers, genericResult);
7886
}
7987

8088
public static JavaMethod getNativeVirtual(JavaClass cls, String name, String descriptor) {
8189
return new JavaMethod(cls, Kind.INSTANCE, name, false, descriptor, JavaModifiers.PUBLIC, false);
8290
}
8391

8492
public static JavaMethod getInterface(JavaClass cls, String name, String descriptor) {
85-
return new JavaMethod(cls, Kind.INTERFACE, name, false, descriptor, JavaModifiers.PUBLIC, false);
93+
return getInterface(cls, name, descriptor, false);
94+
}
95+
96+
public static JavaMethod getInterface(JavaClass cls, String name, String descriptor, boolean genericResult) {
97+
return new JavaMethod(cls, Kind.INTERFACE, name, false, descriptor, JavaModifiers.PUBLIC, genericResult);
8698
}
8799

88100
public static JavaMethod getNativeExpansion(JavaClass cls, String name, String descriptor) {

JavaShared/src/main/java/org/openzen/zenscript/javashared/prepare/JavaPrepareDefinitionMemberVisitor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public JavaClass visitFunction(FunctionDefinition definition) {
8888
return context.getJavaClass(definition);
8989

9090
JavaClass cls = context.getJavaClass(definition);
91-
JavaMethod method = JavaMethod.getStatic(cls, definition.name, context.getMethodDescriptor(definition.header), JavaModifiers.getJavaModifiers(definition.modifiers));
91+
JavaMethod method = JavaMethod.getStatic(cls, definition.name, context.getMethodDescriptor(definition.header), JavaModifiers.getJavaModifiers(definition.modifiers), definition.header.getReturnType().isGeneric());
9292
module.setMethodInfo(definition.caller, method);
9393
return cls;
9494
}

0 commit comments

Comments
 (0)