Opened 12 years ago
Closed 5 years ago
#259 closed defect (fixed)
JAVA:JSTATIC cannot always be invoked properly
Reported by: | Christoph Egger | Owned by: | Mark Evenson |
---|---|---|---|
Priority: | critical | Milestone: | 1.6.1 |
Component: | java | Version: | 1.1.0-dev |
Keywords: | java-interop needs-audit has-test | Cc: | siccegge@… |
Parent Tickets: |
Description (last modified by )
The following doesn't work
(jstatic "asList" "java.util.Arrays" (java:jnew-array (jclass "int") 1))
Change History (16)
comment:1 follow-up: 5 Changed 12 years ago by
comment:2 Changed 12 years ago by
Milestone: | → 1.1.0 |
---|---|
Status: | new → accepted |
Version: | → 1.1.0-dev |
Maybe something screwed up in our type mapping for JAVA-OBJECT. (java:jnew-array (jclass "int") 40) creates a JAVA-OBJECT whose intendedType is int[]. The code in java.isApplicableMethod() signals that java.lang.Arrays.asList(Object[]) is not an applicable method although the following code outputs "true" indicating that it should be matched, as it is successfully applicable.
int i[] = {new Integer(40)}; Object[] type = {1}; Class clazz = type.getClass(); System.out.println(clazz.getComponentType().isInstance(i));
I tried fixing Java.isApplicableMethod() but it didn't work out in the time I had.
I have a simpler fix for JSS:JARRAY-TO-LIST which doesn't involve resolving this problem which I will commit shortly, but am noting the possibly deeper problem for followup.
comment:3 Changed 12 years ago by
(In [14226]) Re #259: fix JSS:JLIST-TO-LIST.
This fixes the immediate problem, but leave the ticket open as far as
I can tell the following code fails in ABCL, but succeeds in the
equivalent Java code indicating we need to fix
Java.isApplicableMethod():
(jstatic "asList" "java.util.Arrays" (java:jnew-array (jclass "int") 1))
comment:4 Changed 12 years ago by
Description: | modified (diff) |
---|---|
Summary: | jss:jarray-to-list fails → JAVA:JSTATIC cannot always be invoked properly |
Things seem rather complicated with Java the language generics.
A method that takes an Object[] as an argument
public static void objectArgs(Object[] args)
cannot be invoked on an array of primitive types
int i[] = {42}; objectArgs(i); // Doesn't compile
But the signature of the method originally in question declares the type of array to extend java.lang.Object:
public static <T extends Object> List<T> asList(T[] ts)
and *can* be invoked on an array of primitive types
int i[] = {42}; java.util.Arrays.asList(i);
Need to check exactly what kind of code is generated by javac here, but presumably the compiler somehow transforms the primitive array to wrapped type here?
So, JAVA:JSTATIC cannot make currently make a call that can be made in Java the language. Presumably JAVA:JCALL has the same sort of problem
From experimenting a bit, it would not be enough to fix Java.isApplicableMethod(). We would also at least have to extend Java.javaInstance(Class<?>) to return arrays of primitive types.
comment:5 Changed 12 years ago by
Description: | modified (diff) |
---|
Replying to https://openid.fau.de/eg74yneg:
Simplest test-case:
(jss:jarray-to-list (java:jnew-array (jclass "int") 40))
Text of the original report:
CL-USER> *
#<jarray [B@5719d1 {15F987F}>
CL-USER> (jss:jarray-to-list *)
==========
no such method
[Condition of type ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [ABORT] Return to sldb level 1.
2: [RETRY] Retry SLIME REPL evaluation request.
3: [*ABORT] Return to SLIME's top level.
4: [ABORT] Abort thread.
Backtrace:
0: (#<FUNCTION {149EEF3}> #<ERROR {E6942E}> #<FUNCTION {149EEF3}>)
1: (APPLY #<FUNCTION {149EEF3}> (#<ERROR {E6942E}> #<FUNCTION {149EEF3}>))
2: (SYSTEM::RUN-HOOK SYSTEM::*INVOKE-DEBUGGER-HOOK* #<ERROR {E6942E}> #<FUNCTION {149EEF3}>)
3: (INVOKE-DEBUGGER #<ERROR {E6942E}>)
4: org.armedbear.lisp.Lisp.error(Lisp.java:382)
5: org.armedbear.lisp.Java.jstatic(Java.java:462)
6: org.armedbear.lisp.Java$pf_jstatic.execute(Java.java:512)
7: org.armedbear.lisp.Primitive.execute(Primitive.java:135)
8: (JSS:JARRAY-TO-LIST #<jarray [B@5719d1 {15F987F}>)
9: (SYSTEM::%EVAL (JSS:JARRAY-TO-LIST *))
10: (EVAL (JSS:JARRAY-TO-LIST *))
11: (SWANK::EVAL-REGION "(jss:jarray-to-list *)
")
comment:6 Changed 12 years ago by
Component: | abcl-contrib → java |
---|---|
Keywords: | java-interop needs-audit added |
Milestone: | 1.1.0 → 1.1.1 |
comment:7 Changed 12 years ago by
Milestone: | 1.1.1 → 1.2.0 |
---|---|
Priority: | major → critical |
comment:8 Changed 11 years ago by
Milestone: | 1.2.0 → 1.3.0 |
---|
comment:11 Changed 11 years ago by
Milestone: | 2.0.0 → 1.4.0 |
---|
comment:12 Changed 11 years ago by
Keywords: | has-test added |
---|
comment:16 Changed 5 years ago by
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
Fixed with <https://abcl.org/trac/changeset/15234>
Simplest test-case: