Validity of error on asSpreader, or, seeking alternative

Rémi Forax forax at univ-mlv.fr
Tue May 10 05:55:51 PDT 2011


On 05/10/2011 02:27 PM, Jim Laskey wrote:
> Currently we get an "java.lang.IllegalArgumentException: Array is not 
> of length n" error if the array being passed in does not match the 
> array length supplied on the asSpreader call.  But wouldn't a dynamic 
> language want some flexibility there.
>
> ex.
>
> Suppose a language implementation chose 8 as the maximum number of 
> args to be passed directly and any call over 8 arguments is passed as 
> an array.  (All in the name of dispatch implementation simplicity.)

The main point of JSR 292 is that your implementation should not have to 
do this kind of restriction.
This kind of trick can be done by the JSR 292 implementation,
from the language runtime point of view, you can pass 255 arguments or less.

>
> def f(x, y) { ...}
>
> f(1);                             // one short but can be padded with 
> null or undef.

You can use insertArguments here.

> f(1, 2);                          // correct number of args.
> f(1, 2, 3);                       // one too many, just truncate.

You can use dropArguments here.

> f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // passed as an fixed size array, 
> need to spread over two args.

You can use asCollector() here.

> f(1, 2 | x);                      // passed as a variable sized array, 
> need to spread over two args.

I ave no idea what '|' means.

>
> In the last two cases we really don't know what size may be fired at 
> us based on call site info.  All we really care about is the first two 
> value and then discard the rest.
>
> a) Is the asSpread runtime check too restrictive?
> OR
> b) Is anyone aware of a clever little trick to spread and truncate on 
> the fly?

Again, why do you want to restrict your runtime to manage 8 parameters ?
Otherwise, if you want to collect array at runtime, there is a way:
   f should be a method handle with asVarargsCollector() called on it and
   the target of invokedynamic should be a generic invoker.

Basically, if you invoke a method handle using invokeGeneric on a method 
handle
created with  asVarargsCollector() the array will be created at runtime.

>
> Cheers,
>
> -- Jim

cheers,
Rémi

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20110510/961de313/attachment-0001.html 


More information about the mlvm-dev mailing list