trufflesqueak icon indicating copy to clipboard operation
trufflesqueak copied to clipboard

Can not call overloaded array methods

Open marschall opened this issue 4 years ago • 5 comments

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

marschall avatar Oct 17 '19 18:10 marschall

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 ...

fniephaus avatar Oct 17 '19 19:10 fniephaus

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.

marschall avatar Oct 17 '19 20:10 marschall

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.

fniephaus avatar Oct 17 '19 21:10 fniephaus

I've opened https://github.com/oracle/graal/issues/1759.

fniephaus avatar Oct 18 '19 08:10 fniephaus

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.

fniephaus avatar Jan 19 '21 11:01 fniephaus