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 89999668b..6fc5d4557 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 @@ -90,8 +90,8 @@ public class JavaMethodBytecodeCompiler implements JavaMethodCompiler { 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"); private static final JavaNativeMethod MAP_ISEMPTY = JavaNativeMethod.getInterface(JavaClass.MAP, "isEmpty", "()Z"); - private static final JavaNativeMethod MAP_KEYS = JavaNativeMethod.getInterface(JavaClass.MAP, "keys", "()Ljava/lang/Object;"); - private static final JavaNativeMethod MAP_VALUES = JavaNativeMethod.getInterface(JavaClass.MAP, "values", "()Ljava/lang/Object;"); + private static final JavaNativeMethod MAP_KEYS = JavaNativeMethod.getInterface(JavaClass.MAP, "keySet", "()Ljava/util/Set;"); + private static final JavaNativeMethod MAP_VALUES = JavaNativeMethod.getInterface(JavaClass.MAP, "values", "()Ljava/util/Collection;"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_OBJECTS = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_BOOLS = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([ZII)[Z"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_BYTES = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([BII)[B"); @@ -1263,21 +1263,21 @@ public Void builtinStaticMethod(BuiltinMethodSymbol method, TypeID returnType, C javaWriter.invokeVirtual(STRING_CHAR_AT); break; case ASSOC_KEYS: { - Type resultType = context.getType(arguments[0].type); + Type resultType = arguments[0].type.asAssoc().map(m -> m.keyType).map(ArrayTypeID::new).map(context::getType).orElseThrow(() -> new IllegalStateException("Must be an assoc array!")); javaWriter.invokeVirtual(MAP_KEYS); javaWriter.dup(); javaWriter.invokeVirtual(COLLECTION_SIZE); - javaWriter.newArray(resultType); + javaWriter.newArray(resultType.getElementType()); javaWriter.invokeVirtual(COLLECTION_TOARRAY); javaWriter.checkCast(resultType); return null; } case ASSOC_VALUES: { - Type resultType = context.getType(arguments[0].type); + Type resultType = arguments[0].type.asAssoc().map(m -> m.keyType).map(ArrayTypeID::new).map(context::getType).orElseThrow(() -> new IllegalStateException("Must be an assoc array!")); javaWriter.invokeVirtual(MAP_VALUES); javaWriter.dup(); javaWriter.invokeVirtual(COLLECTION_SIZE); - javaWriter.newArray(resultType); + javaWriter.newArray(resultType.getElementType()); javaWriter.invokeVirtual(COLLECTION_TOARRAY); javaWriter.checkCast(resultType); return null; 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 e7766e643..8dd68871d 100644 --- a/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java +++ b/JavaShared/src/main/java/org/openzen/zenscript/javashared/JavaBuiltinModule.java @@ -91,8 +91,6 @@ public class JavaBuiltinModule { 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"); private static final JavaNativeMethod MAP_ISEMPTY = JavaNativeMethod.getInterface(JavaClass.MAP, "isEmpty", "()Z"); - private static final JavaNativeMethod MAP_KEYS = JavaNativeMethod.getInterface(JavaClass.MAP, "keys", "()Ljava/lang/Object;"); - private static final JavaNativeMethod MAP_VALUES = JavaNativeMethod.getInterface(JavaClass.MAP, "values", "()Ljava/lang/Object;"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_OBJECTS = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([Ljava/lang/Object;II)[Ljava/lang/Object;"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_BOOLS = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([ZII)[Z"); private static final JavaNativeMethod ARRAYS_COPY_OF_RANGE_BYTES = JavaNativeMethod.getNativeStatic(JavaClass.ARRAYS, "copyOfRange", "([BII)[B"); diff --git a/ScriptingEngineTester/src/main/resources/zencode_tests/maps/keys_0.zc b/ScriptingEngineTester/src/main/resources/zencode_tests/maps/keys_0.zc new file mode 100644 index 000000000..fcf8f99b4 --- /dev/null +++ b/ScriptingEngineTester/src/main/resources/zencode_tests/maps/keys_0.zc @@ -0,0 +1,7 @@ +#output: 1 +#output: Hello + +var map = {"Hello": "World"}; + +println(map.keys.length); +println(map.keys[$-1]); diff --git a/ScriptingEngineTester/src/main/resources/zencode_tests/maps/values_0.zc b/ScriptingEngineTester/src/main/resources/zencode_tests/maps/values_0.zc new file mode 100644 index 000000000..780042fe9 --- /dev/null +++ b/ScriptingEngineTester/src/main/resources/zencode_tests/maps/values_0.zc @@ -0,0 +1,7 @@ +#output: 1 +#output: World + +var map = {"Hello": "World"}; + +println(map.values.length); +println(map.values[$-1]);