trufflesqueak
trufflesqueak copied to clipboard
Can not call overloaded array methods
java.util.Arrays#oString
is overloaded for every array type, I would like to call java.util.Arrays#oString(byte[])
but this fails with
'com.oracle.truffle.api.interop.UnsupportedTypeException: Multiple applicable overloads found for method name toString (candidates: [Method[public static java.lang.String java.util.Arrays.toString(boolean[])], Method[public static java.lang.String java.util.Arrays.toString(byte[])], Method[public static java.lang.String java.util.Arrays.toString(float[])], Method[public static java.lang.String java.util.Arrays.toString(double[])], Method[public static java.lang.String java.util.Arrays.toString(long[])], Method[public static java.lang.String java.util.Arrays.toString(int[])], Method[public static java.lang.String java.util.Arrays.toString(short[])], Method[public static java.lang.String java.util.Arrays.toString(char[])], Method[public static java.lang.String java.util.Arrays.toString(java.lang.Object[])]], arguments: [byte[4] (NativeObject)])'
reproducer
self assert: ((Java type: 'java.util.Arrays') toString: #[127 0 0 1]) = '[127, 0, 0, 1]'
That is with 1.0.0-rc2, I did not check with 1.0.0-rc3
Same error occurs in Graal.js:
$ polyglot --jvm --shell
GraalVM MultiLanguage Shell 19.2.1
JavaScript version 19.2.1
js> Java.type('java.util.Arrays').toString([1,2,3,4])
TypeError: invokeMember (toString) on JavaClass[java.util.Arrays] failed due to: Multiple applicable overloads found for method name toString (candidates: [Method[public static java.lang.String java.util.Arrays.toString(boolean[])], Method[public static java.lang.String java.util.Arrays.toString(byte[])], Method[public static java.lang.String java.util.Arrays.toString(float[])], Method[public static java.lang.String java.util.Arrays.toString(double[])], Method[public static java.lang.String java.util.Arrays.toString(long[])], Method[public static java.lang.String java.util.Arrays.toString(int[])], Method[public static java.lang.String java.util.Arrays.toString(short[])], Method[public static java.lang.String java.util.Arrays.toString(char[])], Method[public static java.lang.String java.util.Arrays.toString(java.lang.Object[])]], arguments: [DynamicObject<JSArray>@29215f06 (DynamicObjectBasic)])
Still investigating ...
Same error occurs in Graal.js:
...
Still investigating ...
I'm not sure that can be compared. JavaScript doesn't really have arrays let alone byte arrays. So I can understand that no method can be selected. Squeak on the other hand has ByteArray
, DoubleByteArray
, FloatArray
, IntegerArray
and ShortIntegerArray
classes.
Javascript does support typed arrays (e.g. Uint8Array
). However, it looks like interop only checks if an array has elements and does not consider it's type at all. I'll file a bug against Truffle.
I've opened https://github.com/oracle/graal/issues/1759.
Maybe this could be helpful:
Added support for explicitly selecting a host method overload using the signature in the form of comma-separated fully qualified parameter type names enclosed by parentheses (e.g. methodName(f.q.TypeName,java.lang.String,int,int[])).
See 21.0.0 release notes.