Opened 5 years ago

Last modified 6 months ago

#259 accepted defect

JAVA:JSTATIC cannot always be invoked properly

Reported by: https://openid.fau.de/eg74yneg Owned by: mevenson
Priority: critical Milestone: 1.6.0
Component: java Version: 1.1.0-dev
Keywords: java-interop needs-audit has-test Cc: siccegge@…
Parent Tickets:

Description (last modified by mevenson)

The following doesn't work

(jstatic "asList" "java.util.Arrays" (java:jnew-array (jclass "int") 1))

Subtickets (add)

Change History (14)

comment:1 follow-up: Changed 5 years ago by https://openid.fau.de/eg74yneg

Simplest test-case:

(jss:jarray-to-list (java:jnew-array (jclass "int") 40))

comment:2 Changed 5 years ago by mevenson

  • Milestone set to 1.1.0
  • Status changed from new to accepted
  • Version set to 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 5 years ago by mevenson

(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 5 years ago by mevenson

  • Description modified (diff)
  • Summary changed from jss:jarray-to-list fails to 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 in reply to: ↑ 1 Changed 5 years ago by mevenson

  • 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 5 years ago by mevenson

  • Component changed from abcl-contrib to java
  • Keywords java-interop needs-audit added
  • Milestone changed from 1.1.0 to 1.1.1

comment:7 Changed 5 years ago by mevenson

  • Milestone changed from 1.1.1 to 1.2.0
  • Priority changed from major to critical

comment:8 Changed 4 years ago by https://www.google.com/accounts/o8/id?id=AItOawkYnNNEAO_K40Gp0xROhyjOPgjvIskQ48M

  • Milestone changed from 1.2.0 to 1.3.0

comment:9 Changed 4 years ago by mevenson

  • Milestone changed from 1.3.0 to 2.0

Ticket retargeted after milestone closed

comment:10 Changed 4 years ago by mevenson

  • Milestone changed from 2.0 to 2.0.0

Milestone renamed

comment:11 Changed 4 years ago by mevenson

  • Milestone changed from 2.0.0 to 1.4.0

comment:12 Changed 4 years ago by mevenson

  • Keywords has-test added

comment:13 Changed 15 months ago by mevenson

  • Milestone changed from 1.4.0 to 1.5.0

Ticket retargeted after milestone closed

comment:14 Changed 6 months ago by mevenson

  • Milestone changed from 1.5.0 to 1.6.0

Ticket retargeted after milestone closed

Note: See TracTickets for help on using tickets.