[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