Spread problem with > 10 arguments

Fredrik Öhrström fredrik.ohrstrom at oracle.com
Tue Jul 14 13:38:35 PDT 2009


Rémi Forax skrev:
> Your implementation doesn't follow the spec :
> http://cr.openjdk.java.net/~jrose/pres/indy-javadoc-mlvm/java/dyn/MethodHandles.html#collectArguments(java.dyn.MethodHandle,%20java.dyn.MethodType)
>
> Only trailing arguments for a given position are collected :
> http://code.google.com/p/jvm-language-runtime/source/browse/trunk/invokedynamic-backport/src/jsr292/java/dyn/MHCollecter.java
>
> So it grows quadratically or you have to create on class by collect 
> position.
>   
You are right that it does not follow the spec. However you can easily 
implement adapters that
grow linearly and follow the spec. :-) How about this: (target and 
position are declared final of course)

public Object adapt3(Object a, Object b, Object c)
{
    int i = 0;
    Object[] spread = new Object[3-position];
    switch (position) {
          case 0: spread[i++] = a;
          case 1: spread[i++] = b;
          case 2: spread[i++] = c;
    }
    switch(position) {
        case 0:  return target.invoke<Object>(spread);
        case 1:  return target.invoke<Object>(a, spread);
    }
    return target.invoke<Object>(a, b, spread);
}

It should be alright to use 256 internal classes as well. It is still
a small and finite number that will never grow. :-)
> It's not a simple change because  between the call site  and the target
> method you have a bunch of adapters.
> generic invocation means two different paths between the call site and
> the target method because when the target method is reached
> the former will just call the target method and the later will have to
> do some checkcasts before calling the method.
>
> Maintaining these two paths is practicable but not simple.
>   
I do not understand why you should have to maintain two paths.
Please explain a bit more!
> you mean WrongMethodTypeException :)
>   
Yes! Thanks!

//Fredrik



More information about the mlvm-dev mailing list