[armedbear-ticket] [armedbear] #259: JAVA:JSTATIC cannot always be invoked properly (was: jss:jarray-to-list fails)

armedbear armedbear-devel at common-lisp.net
Tue Oct 30 17:11:59 UTC 2012


#259: JAVA:JSTATIC cannot always be invoked properly
--------------------------------------------+-------------------------------
 Reporter:  https://openid.fau.de/eg74yneg  |       Owner:  mevenson 
     Type:  defect                          |      Status:  accepted 
 Priority:  major                           |   Milestone:  1.1.0    
Component:  abcl-contrib                    |     Version:  1.1.0-dev
 Keywords:                                  |  
--------------------------------------------+-------------------------------

Old description:

> CL-USER> *
> #<jarray [B at 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 at 5719d1 {15F987F}>)
>   9: (SYSTEM::%EVAL (JSS:JARRAY-TO-LIST *))
>  10: (EVAL (JSS:JARRAY-TO-LIST *))
>  11: (SWANK::EVAL-REGION "(jss:jarray-to-list *)
>      ")

New description:

 The following doesn't work

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

 The question is: should it?

 CL-USER> *
 #<jarray [B at 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 at 5719d1 {15F987F}>)
   9: (SYSTEM::%EVAL (JSS:JARRAY-TO-LIST *))
  10: (EVAL (JSS:JARRAY-TO-LIST *))
  11: (SWANK::EVAL-REGION "(jss:jarray-to-list *)
      ")

--

Comment(by mevenson):

 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.

-- 
Ticket URL: <http://trac.common-lisp.net/armedbear/ticket/259#comment:4>
armedbear <http://common-lisp.net/project/armedbear>
armedbear


More information about the armedbear-ticket mailing list