diff options
author | Rich Hickey <richhickey@gmail.com> | 2010-10-20 21:28:30 -0400 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2010-10-20 21:28:30 -0400 |
commit | 52adb74f5335c8256f6468581028f44220547dca (patch) | |
tree | 6f6c2a24a555384583ab233589a5f85ed5aa256b | |
parent | c643a37953964eb15a2f39fa31fc317079467bf0 (diff) |
Support primitives args/return without :static (:static currently nop). IFns taking/returning primitives derive from IFn + new IFn$LOD... interfaces. Arities up to 4 supported.
No more conveyance of metadata to fn in defn - put metadata on fns explicitly.
-rw-r--r-- | src/clj/clojure/core.clj | 2 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 170 | ||||
-rw-r--r-- | src/jvm/clojure/lang/IFn.java | 359 |
3 files changed, 514 insertions, 17 deletions
diff --git a/src/clj/clojure/core.clj b/src/clj/clojure/core.clj index f2993af8..2e91937e 100644 --- a/src/clj/clojure/core.clj +++ b/src/clj/clojure/core.clj @@ -303,7 +303,7 @@ m)) m (conj (if (meta name) (meta name) {}) m)] (list 'def (with-meta name m) - (list '.withMeta (cons `fn (cons (with-meta name m) fdecl)) (list '.meta (list 'var name))))))) + (cons `fn fdecl) )))) (. (var defn) (setMacro)) diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index f98eab47..d87bab91 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -457,10 +457,10 @@ static class DefExpr implements Expr{ isDynamic = true; mm = (IPersistentMap) RT.assoc(mm,dynamicKey, RT.T); } - if(RT.booleanCast(RT.get(mm, staticKey))) + if(RT.booleanCast(RT.get(mm, arglistsKey))) { IPersistentMap vm = v.meta(); - vm = (IPersistentMap) RT.assoc(vm,staticKey,RT.T); + //vm = (IPersistentMap) RT.assoc(vm,staticKey,RT.T); //drop quote vm = (IPersistentMap) RT.assoc(vm,arglistsKey,RT.second(mm.valAt(arglistsKey))); v.setMeta(vm); @@ -3345,7 +3345,28 @@ static class InvokeExpr implements Expr{ // return StaticInvokeExpr.parse(v, RT.next(form), tagOf(form)); // } // } - + + if(fexpr instanceof VarExpr && context != C.EVAL) + { + Var v = ((VarExpr)fexpr).var; + Object arglists = RT.get(RT.meta(v), arglistsKey); + int arity = RT.count(form.next()); + for(ISeq s = RT.seq(arglists); s != null; s = s.next()) + { + IPersistentVector args = (IPersistentVector) s.first(); + if(args.count() == arity) + { + String primc = FnMethod.primInterface(args); + if(primc != null) + return analyze(context, + RT.listStar(Symbol.intern(".invokePrim"), + ((Symbol) form.first()).withMeta(RT.map(RT.TAG_KEY, Symbol.intern(primc))), + form.next())); + break; + } + } + } + if(fexpr instanceof KeywordExpr && RT.count(form) == 2 && KEYWORD_CALLSITES.isBound()) { // fexpr = new ConstantExpr(new KeywordCallSite(((KeywordExpr)fexpr).k)); @@ -3444,6 +3465,7 @@ static public class FnExpr extends ObjExpr{ fn.name = basename + simpleName; fn.internalName = fn.name.replace('.', '/'); fn.objtype = Type.getObjectType(fn.internalName); + ArrayList<String> prims = new ArrayList(); try { Var.pushThreadBindings( @@ -3486,6 +3508,8 @@ static public class FnExpr extends ObjExpr{ methodArray[f.reqParms.count()] = f; else throw new Exception("Can't have 2 overloads with same arity"); + if(f.prim != null) + prims.add(f.prim); } if(variadicMethod != null) { @@ -3521,7 +3545,11 @@ static public class FnExpr extends ObjExpr{ { Var.popThreadBindings(); } - fn.compile(fn.isVariadic() ? "clojure/lang/RestFn" : "clojure/lang/AFunction",null,fn.onceOnly); + fn.compile(fn.isVariadic() ? "clojure/lang/RestFn" : "clojure/lang/AFunction", + (prims.size() == 0)? + null + :prims.toArray(new String[prims.size()]), + fn.onceOnly); fn.getCompiledClass(); if(origForm instanceof IObj && ((IObj) origForm).meta() != null) @@ -4645,11 +4673,41 @@ public static class FnMethod extends ObjMethod{ Type[] argtypes; Class[] argclasses; Class retClass; + String prim ; public FnMethod(ObjExpr objx, ObjMethod parent){ super(objx, parent); } + static public char classChar(Object x){ + Class c = null; + if(x instanceof Class) + c = (Class) x; + else if(x instanceof Symbol) + c = primClass((Symbol) x); + if(c == null || !c.isPrimitive()) + return 'O'; + if(c == long.class) + return 'L'; + if(c == double.class) + return 'D'; + throw new IllegalArgumentException("Only long and double primitives are supported"); + } + + static public String primInterface(IPersistentVector arglist) throws Exception{ + StringBuilder sb = new StringBuilder(); + for(int i=0;i<arglist.count();i++) + sb.append(classChar(tagOf(arglist.nth(i)))); + sb.append(classChar(tagOf(arglist))); + String ret = sb.toString(); + boolean prim = ret.contains("L") || ret.contains("D"); + if(prim && arglist.count() > 4) + throw new IllegalArgumentException("fns taking primitives support only 4 or fewer args"); + if(prim) + return "clojure.lang.IFn$" + ret; + return null; + } + static FnMethod parse(ObjExpr objx, ISeq form, boolean isStatic) throws Exception{ //([args] body...) IPersistentVector parms = (IPersistentVector) RT.first(form); @@ -4673,6 +4731,10 @@ public static class FnMethod extends ObjMethod{ ,CLEAR_SITES, PersistentHashMap.EMPTY )); + method.prim = primInterface(parms); + if(method.prim != null) + method.prim = method.prim.replace('.', '/'); + method.retClass = tagClass(tagOf(parms)); if(method.retClass.isPrimitive() && !(method.retClass == double.class || method.retClass == long.class)) throw new IllegalArgumentException("Only long and double primitives are supported"); @@ -4709,25 +4771,28 @@ public static class FnMethod extends ObjMethod{ else { - Class pc = tagClass(tagOf(p)); - if(pc.isPrimitive() && !isStatic) - { - pc = Object.class; - p = (Symbol) ((IObj) p).withMeta((IPersistentMap) RT.assoc(RT.meta(p), RT.TAG_KEY, null)); - } + Class pc = primClass(tagClass(tagOf(p))); +// if(pc.isPrimitive() && !isStatic) +// { +// pc = Object.class; +// p = (Symbol) ((IObj) p).withMeta((IPersistentMap) RT.assoc(RT.meta(p), RT.TAG_KEY, null)); +// } // throw new Exception("Non-static fn can't have primitive parameter: " + p); if(pc.isPrimitive() && !(pc == double.class || pc == long.class)) throw new IllegalArgumentException("Only long and double primitives are supported: " + p); if(state == PSTATE.REST && tagOf(p) != null) throw new Exception("& arg cannot have type hint"); + if(state == PSTATE.REST && method.prim != null) + throw new Exception("fns taking primitives cannot be variadic"); + if(state == PSTATE.REST) pc = ISeq.class; argtypes.add(Type.getType(pc)); argclasses.add(pc); - LocalBinding lb = isStatic? - registerLocal(p,null, new MethodParamExpr(pc), true) - :registerLocal(p, state == PSTATE.REST ? ISEQ : tagOf(p), null, true); + LocalBinding lb = pc.isPrimitive() ? + registerLocal(p, null, new MethodParamExpr(pc), true) + : registerLocal(p, state == PSTATE.REST ? ISEQ : tagOf(p), null, true); argLocals = argLocals.cons(lb); switch(state) { @@ -4748,7 +4813,8 @@ public static class FnMethod extends ObjMethod{ throw new Exception("Can't specify more than " + MAX_POSITIONAL_ARITY + " params"); LOOP_LOCALS.set(argLocals); method.argLocals = argLocals; - if(isStatic) +// if(isStatic) + if(method.prim != null) { method.argtypes = argtypes.toArray(new Type[argtypes.size()]); method.argclasses = argclasses.toArray(new Class[argtypes.size()]); @@ -4768,7 +4834,9 @@ public static class FnMethod extends ObjMethod{ } public void emit(ObjExpr fn, ClassVisitor cv){ - if(fn.isStatic) + if(prim != null) + doEmitPrim(fn, cv); + else if(fn.isStatic) doEmitStatic(fn,cv); else doEmit(fn,cv); @@ -4836,6 +4904,72 @@ public static class FnMethod extends ObjMethod{ } + public void doEmitPrim(ObjExpr fn, ClassVisitor cv){ + Method ms = new Method("invokePrim", getReturnType(), argtypes); + + GeneratorAdapter gen = new GeneratorAdapter(ACC_PUBLIC + ACC_FINAL, + ms, + null, + //todo don't hardwire this + EXCEPTION_TYPES, + cv); + gen.visitCode(); + + emitVarReloadPreamble(fn, gen); + + Label loopLabel = gen.mark(); + gen.visitLineNumber(line, loopLabel); + try + { + Var.pushThreadBindings(RT.map(LOOP_LABEL, loopLabel, METHOD, this)); + emitBody(objx, gen, retClass, body); + + Label end = gen.mark(); + gen.visitLocalVariable("this", "Ljava/lang/Object;", null, loopLabel, end, 0); + for(ISeq lbs = argLocals.seq(); lbs != null; lbs = lbs.next()) + { + LocalBinding lb = (LocalBinding) lbs.first(); + gen.visitLocalVariable(lb.name, argtypes[lb.idx-1].getDescriptor(), null, loopLabel, end, lb.idx); + } + } + catch(Exception e) + { + throw new RuntimeException(e); + } + finally + { + Var.popThreadBindings(); + } + + gen.returnValue(); + //gen.visitMaxs(1, 1); + gen.endMethod(); + + //generate the regular invoke, calling the prim method + Method m = new Method(getMethodName(), OBJECT_TYPE, getArgTypes()); + + gen = new GeneratorAdapter(ACC_PUBLIC, + m, + null, + //todo don't hardwire this + EXCEPTION_TYPES, + cv); + gen.visitCode(); + gen.loadThis(); + for(int i = 0; i < argtypes.length; i++) + { + gen.loadArg(i); + HostExpr.emitUnboxArg(fn, gen, argclasses[i]); + } + gen.invokeInterface(Type.getType("L"+prim+";"), ms); + gen.box(getReturnType()); + + + gen.returnValue(); + //gen.visitMaxs(1, 1); + gen.endMethod(); + + } public void doEmit(ObjExpr fn, ClassVisitor cv){ Method m = new Method(getMethodName(), getReturnType(), getArgTypes()); @@ -4897,7 +5031,7 @@ public static class FnMethod extends ObjMethod{ } Type getReturnType(){ - if(objx.isStatic) + if(prim != null) //objx.isStatic) return Type.getType(retClass); return OBJECT_TYPE; } @@ -7455,6 +7589,10 @@ public static class NewInstanceMethod extends ObjMethod{ return c; } + static Class primClass(Class c){ + return c.isPrimitive()?c:Object.class; + } + static public class MethodParamExpr implements Expr, MaybePrimitiveExpr{ final Class c; diff --git a/src/jvm/clojure/lang/IFn.java b/src/jvm/clojure/lang/IFn.java index 386a9423..72d90ebb 100644 --- a/src/jvm/clojure/lang/IFn.java +++ b/src/jvm/clojure/lang/IFn.java @@ -87,4 +87,363 @@ public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object throws Exception; public Object applyTo(ISeq arglist) throws Exception; + +static public interface L{long invokePrim();} +static public interface D{double invokePrim();} +static public interface OL{long invokePrim(Object arg0);} +static public interface OD{double invokePrim(Object arg0);} +static public interface LO{Object invokePrim(long arg0);} +static public interface LL{long invokePrim(long arg0);} +static public interface LD{double invokePrim(long arg0);} +static public interface DO{Object invokePrim(double arg0);} +static public interface DL{long invokePrim(double arg0);} +static public interface DD{double invokePrim(double arg0);} +static public interface OOL{long invokePrim(Object arg0, Object arg1);} +static public interface OOD{double invokePrim(Object arg0, Object arg1);} +static public interface OLO{Object invokePrim(Object arg0, long arg1);} +static public interface OLL{long invokePrim(Object arg0, long arg1);} +static public interface OLD{double invokePrim(Object arg0, long arg1);} +static public interface ODO{Object invokePrim(Object arg0, double arg1);} +static public interface ODL{long invokePrim(Object arg0, double arg1);} +static public interface ODD{double invokePrim(Object arg0, double arg1);} +static public interface LOO{Object invokePrim(long arg0, Object arg1);} +static public interface LOL{long invokePrim(long arg0, Object arg1);} +static public interface LOD{double invokePrim(long arg0, Object arg1);} +static public interface LLO{Object invokePrim(long arg0, long arg1);} +static public interface LLL{long invokePrim(long arg0, long arg1);} +static public interface LLD{double invokePrim(long arg0, long arg1);} +static public interface LDO{Object invokePrim(long arg0, double arg1);} +static public interface LDL{long invokePrim(long arg0, double arg1);} +static public interface LDD{double invokePrim(long arg0, double arg1);} +static public interface DOO{Object invokePrim(double arg0, Object arg1);} +static public interface DOL{long invokePrim(double arg0, Object arg1);} +static public interface DOD{double invokePrim(double arg0, Object arg1);} +static public interface DLO{Object invokePrim(double arg0, long arg1);} +static public interface DLL{long invokePrim(double arg0, long arg1);} +static public interface DLD{double invokePrim(double arg0, long arg1);} +static public interface DDO{Object invokePrim(double arg0, double arg1);} +static public interface DDL{long invokePrim(double arg0, double arg1);} +static public interface DDD{double invokePrim(double arg0, double arg1);} +static public interface OOOL{long invokePrim(Object arg0, Object arg1, Object arg2);} +static public interface OOOD{double invokePrim(Object arg0, Object arg1, Object arg2);} +static public interface OOLO{Object invokePrim(Object arg0, Object arg1, long arg2);} +static public interface OOLL{long invokePrim(Object arg0, Object arg1, long arg2);} +static public interface OOLD{double invokePrim(Object arg0, Object arg1, long arg2);} +static public interface OODO{Object invokePrim(Object arg0, Object arg1, double arg2);} +static public interface OODL{long invokePrim(Object arg0, Object arg1, double arg2);} +static public interface OODD{double invokePrim(Object arg0, Object arg1, double arg2);} +static public interface OLOO{Object invokePrim(Object arg0, long arg1, Object arg2);} +static public interface OLOL{long invokePrim(Object arg0, long arg1, Object arg2);} +static public interface OLOD{double invokePrim(Object arg0, long arg1, Object arg2);} +static public interface OLLO{Object invokePrim(Object arg0, long arg1, long arg2);} +static public interface OLLL{long invokePrim(Object arg0, long arg1, long arg2);} +static public interface OLLD{double invokePrim(Object arg0, long arg1, long arg2);} +static public interface OLDO{Object invokePrim(Object arg0, long arg1, double arg2);} +static public interface OLDL{long invokePrim(Object arg0, long arg1, double arg2);} +static public interface OLDD{double invokePrim(Object arg0, long arg1, double arg2);} +static public interface ODOO{Object invokePrim(Object arg0, double arg1, Object arg2);} +static public interface ODOL{long invokePrim(Object arg0, double arg1, Object arg2);} +static public interface ODOD{double invokePrim(Object arg0, double arg1, Object arg2);} +static public interface ODLO{Object invokePrim(Object arg0, double arg1, long arg2);} +static public interface ODLL{long invokePrim(Object arg0, double arg1, long arg2);} +static public interface ODLD{double invokePrim(Object arg0, double arg1, long arg2);} +static public interface ODDO{Object invokePrim(Object arg0, double arg1, double arg2);} +static public interface ODDL{long invokePrim(Object arg0, double arg1, double arg2);} +static public interface ODDD{double invokePrim(Object arg0, double arg1, double arg2);} +static public interface LOOO{Object invokePrim(long arg0, Object arg1, Object arg2);} +static public interface LOOL{long invokePrim(long arg0, Object arg1, Object arg2);} +static public interface LOOD{double invokePrim(long arg0, Object arg1, Object arg2);} +static public interface LOLO{Object invokePrim(long arg0, Object arg1, long arg2);} +static public interface LOLL{long invokePrim(long arg0, Object arg1, long arg2);} +static public interface LOLD{double invokePrim(long arg0, Object arg1, long arg2);} +static public interface LODO{Object invokePrim(long arg0, Object arg1, double arg2);} +static public interface LODL{long invokePrim(long arg0, Object arg1, double arg2);} +static public interface LODD{double invokePrim(long arg0, Object arg1, double arg2);} +static public interface LLOO{Object invokePrim(long arg0, long arg1, Object arg2);} +static public interface LLOL{long invokePrim(long arg0, long arg1, Object arg2);} +static public interface LLOD{double invokePrim(long arg0, long arg1, Object arg2);} +static public interface LLLO{Object invokePrim(long arg0, long arg1, long arg2);} +static public interface LLLL{long invokePrim(long arg0, long arg1, long arg2);} +static public interface LLLD{double invokePrim(long arg0, long arg1, long arg2);} +static public interface LLDO{Object invokePrim(long arg0, long arg1, double arg2);} +static public interface LLDL{long invokePrim(long arg0, long arg1, double arg2);} +static public interface LLDD{double invokePrim(long arg0, long arg1, double arg2);} +static public interface LDOO{Object invokePrim(long arg0, double arg1, Object arg2);} +static public interface LDOL{long invokePrim(long arg0, double arg1, Object arg2);} +static public interface LDOD{double invokePrim(long arg0, double arg1, Object arg2);} +static public interface LDLO{Object invokePrim(long arg0, double arg1, long arg2);} +static public interface LDLL{long invokePrim(long arg0, double arg1, long arg2);} +static public interface LDLD{double invokePrim(long arg0, double arg1, long arg2);} +static public interface LDDO{Object invokePrim(long arg0, double arg1, double arg2);} +static public interface LDDL{long invokePrim(long arg0, double arg1, double arg2);} +static public interface LDDD{double invokePrim(long arg0, double arg1, double arg2);} +static public interface DOOO{Object invokePrim(double arg0, Object arg1, Object arg2);} +static public interface DOOL{long invokePrim(double arg0, Object arg1, Object arg2);} +static public interface DOOD{double invokePrim(double arg0, Object arg1, Object arg2);} +static public interface DOLO{Object invokePrim(double arg0, Object arg1, long arg2);} +static public interface DOLL{long invokePrim(double arg0, Object arg1, long arg2);} +static public interface DOLD{double invokePrim(double arg0, Object arg1, long arg2);} +static public interface DODO{Object invokePrim(double arg0, Object arg1, double arg2);} +static public interface DODL{long invokePrim(double arg0, Object arg1, double arg2);} +static public interface DODD{double invokePrim(double arg0, Object arg1, double arg2);} +static public interface DLOO{Object invokePrim(double arg0, long arg1, Object arg2);} +static public interface DLOL{long invokePrim(double arg0, long arg1, Object arg2);} +static public interface DLOD{double invokePrim(double arg0, long arg1, Object arg2);} +static public interface DLLO{Object invokePrim(double arg0, long arg1, long arg2);} +static public interface DLLL{long invokePrim(double arg0, long arg1, long arg2);} +static public interface DLLD{double invokePrim(double arg0, long arg1, long arg2);} +static public interface DLDO{Object invokePrim(double arg0, long arg1, double arg2);} +static public interface DLDL{long invokePrim(double arg0, long arg1, double arg2);} +static public interface DLDD{double invokePrim(double arg0, long arg1, double arg2);} +static public interface DDOO{Object invokePrim(double arg0, double arg1, Object arg2);} +static public interface DDOL{long invokePrim(double arg0, double arg1, Object arg2);} +static public interface DDOD{double invokePrim(double arg0, double arg1, Object arg2);} +static public interface DDLO{Object invokePrim(double arg0, double arg1, long arg2);} +static public interface DDLL{long invokePrim(double arg0, double arg1, long arg2);} +static public interface DDLD{double invokePrim(double arg0, double arg1, long arg2);} +static public interface DDDO{Object invokePrim(double arg0, double arg1, double arg2);} +static public interface DDDL{long invokePrim(double arg0, double arg1, double arg2);} +static public interface DDDD{double invokePrim(double arg0, double arg1, double arg2);} +static public interface OOOOL{long invokePrim(Object arg0, Object arg1, Object arg2, Object arg3);} +static public interface OOOOD{double invokePrim(Object arg0, Object arg1, Object arg2, Object arg3);} +static public interface OOOLO{Object invokePrim(Object arg0, Object arg1, Object arg2, long arg3);} +static public interface OOOLL{long invokePrim(Object arg0, Object arg1, Object arg2, long arg3);} +static public interface OOOLD{double invokePrim(Object arg0, Object arg1, Object arg2, long arg3);} +static public interface OOODO{Object invokePrim(Object arg0, Object arg1, Object arg2, double arg3);} +static public interface OOODL{long invokePrim(Object arg0, Object arg1, Object arg2, double arg3);} +static public interface OOODD{double invokePrim(Object arg0, Object arg1, Object arg2, double arg3);} +static public interface OOLOO{Object invokePrim(Object arg0, Object arg1, long arg2, Object arg3);} +static public interface OOLOL{long invokePrim(Object arg0, Object arg1, long arg2, Object arg3);} +static public interface OOLOD{double invokePrim(Object arg0, Object arg1, long arg2, Object arg3);} +static public interface OOLLO{Object invokePrim(Object arg0, Object arg1, long arg2, long arg3);} +static public interface OOLLL{long invokePrim(Object arg0, Object arg1, long arg2, long arg3);} +static public interface OOLLD{double invokePrim(Object arg0, Object arg1, long arg2, long arg3);} +static public interface OOLDO{Object invokePrim(Object arg0, Object arg1, long arg2, double arg3);} +static public interface OOLDL{long invokePrim(Object arg0, Object arg1, long arg2, double arg3);} +static public interface OOLDD{double invokePrim(Object arg0, Object arg1, long arg2, double arg3);} +static public interface OODOO{Object invokePrim(Object arg0, Object arg1, double arg2, Object arg3);} +static public interface OODOL{long invokePrim(Object arg0, Object arg1, double arg2, Object arg3);} +static public interface OODOD{double invokePrim(Object arg0, Object arg1, double arg2, Object arg3);} +static public interface OODLO{Object invokePrim(Object arg0, Object arg1, double arg2, long arg3);} +static public interface OODLL{long invokePrim(Object arg0, Object arg1, double arg2, long arg3);} +static public interface OODLD{double invokePrim(Object arg0, Object arg1, double arg2, long arg3);} +static public interface OODDO{Object invokePrim(Object arg0, Object arg1, double arg2, double arg3);} +static public interface OODDL{long invokePrim(Object arg0, Object arg1, double arg2, double arg3);} +static public interface OODDD{double invokePrim(Object arg0, Object arg1, double arg2, double arg3);} +static public interface OLOOO{Object invokePrim(Object arg0, long arg1, Object arg2, Object arg3);} +static public interface OLOOL{long invokePrim(Object arg0, long arg1, Object arg2, Object arg3);} +static public interface OLOOD{double invokePrim(Object arg0, long arg1, Object arg2, Object arg3);} +static public interface OLOLO{Object invokePrim(Object arg0, long arg1, Object arg2, long arg3);} +static public interface OLOLL{long invokePrim(Object arg0, long arg1, Object arg2, long arg3);} +static public interface OLOLD{double invokePrim(Object arg0, long arg1, Object arg2, long arg3);} +static public interface OLODO{Object invokePrim(Object arg0, long arg1, Object arg2, double arg3);} +static public interface OLODL{long invokePrim(Object arg0, long arg1, Object arg2, double arg3);} +static public interface OLODD{double invokePrim(Object arg0, long arg1, Object arg2, double arg3);} +static public interface OLLOO{Object invokePrim(Object arg0, long arg1, long arg2, Object arg3);} +static public interface OLLOL{long invokePrim(Object arg0, long arg1, long arg2, Object arg3);} +static public interface OLLOD{double invokePrim(Object arg0, long arg1, long arg2, Object arg3);} +static public interface OLLLO{Object invokePrim(Object arg0, long arg1, long arg2, long arg3);} +static public interface OLLLL{long invokePrim(Object arg0, long arg1, long arg2, long arg3);} +static public interface OLLLD{double invokePrim(Object arg0, long arg1, long arg2, long arg3);} +static public interface OLLDO{Object invokePrim(Object arg0, long arg1, long arg2, double arg3);} +static public interface OLLDL{long invokePrim(Object arg0, long arg1, long arg2, double arg3);} +static public interface OLLDD{double invokePrim(Object arg0, long arg1, long arg2, double arg3);} +static public interface OLDOO{Object invokePrim(Object arg0, long arg1, double arg2, Object arg3);} +static public interface OLDOL{long invokePrim(Object arg0, long arg1, double arg2, Object arg3);} +static public interface OLDOD{double invokePrim(Object arg0, long arg1, double arg2, Object arg3);} +static public interface OLDLO{Object invokePrim(Object arg0, long arg1, double arg2, long arg3);} +static public interface OLDLL{long invokePrim(Object arg0, long arg1, double arg2, long arg3);} +static public interface OLDLD{double invokePrim(Object arg0, long arg1, double arg2, long arg3);} +static public interface OLDDO{Object invokePrim(Object arg0, long arg1, double arg2, double arg3);} +static public interface OLDDL{long invokePrim(Object arg0, long arg1, double arg2, double arg3);} +static public interface OLDDD{double invokePrim(Object arg0, long arg1, double arg2, double arg3);} +static public interface ODOOO{Object invokePrim(Object arg0, double arg1, Object arg2, Object arg3);} +static public interface ODOOL{long invokePrim(Object arg0, double arg1, Object arg2, Object arg3);} +static public interface ODOOD{double invokePrim(Object arg0, double arg1, Object arg2, Object arg3);} +static public interface ODOLO{Object invokePrim(Object arg0, double arg1, Object arg2, long arg3);} +static public interface ODOLL{long invokePrim(Object arg0, double arg1, Object arg2, long arg3);} +static public interface ODOLD{double invokePrim(Object arg0, double arg1, Object arg2, long arg3);} +static public interface ODODO{Object invokePrim(Object arg0, double arg1, Object arg2, double arg3);} +static public interface ODODL{long invokePrim(Object arg0, double arg1, Object arg2, double arg3);} +static public interface ODODD{double invokePrim(Object arg0, double arg1, Object arg2, double arg3);} +static public interface ODLOO{Object invokePrim(Object arg0, double arg1, long arg2, Object arg3);} +static public interface ODLOL{long invokePrim(Object arg0, double arg1, long arg2, Object arg3);} +static public interface ODLOD{double invokePrim(Object arg0, double arg1, long arg2, Object arg3);} +static public interface ODLLO{Object invokePrim(Object arg0, double arg1, long arg2, long arg3);} +static public interface ODLLL{long invokePrim(Object arg0, double arg1, long arg2, long arg3);} +static public interface ODLLD{double invokePrim(Object arg0, double arg1, long arg2, long arg3);} +static public interface ODLDO{Object invokePrim(Object arg0, double arg1, long arg2, double arg3);} +static public interface ODLDL{long invokePrim(Object arg0, double arg1, long arg2, double arg3);} +static public interface ODLDD{double invokePrim(Object arg0, double arg1, long arg2, double arg3);} +static public interface ODDOO{Object invokePrim(Object arg0, double arg1, double arg2, Object arg3);} +static public interface ODDOL{long invokePrim(Object arg0, double arg1, double arg2, Object arg3);} +static public interface ODDOD{double invokePrim(Object arg0, double arg1, double arg2, Object arg3);} +static public interface ODDLO{Object invokePrim(Object arg0, double arg1, double arg2, long arg3);} +static public interface ODDLL{long invokePrim(Object arg0, double arg1, double arg2, long arg3);} +static public interface ODDLD{double invokePrim(Object arg0, double arg1, double arg2, long arg3);} +static public interface ODDDO{Object invokePrim(Object arg0, double arg1, double arg2, double arg3);} +static public interface ODDDL{long invokePrim(Object arg0, double arg1, double arg2, double arg3);} +static public interface ODDDD{double invokePrim(Object arg0, double arg1, double arg2, double arg3);} +static public interface LOOOO{Object invokePrim(long arg0, Object arg1, Object arg2, Object arg3);} +static public interface LOOOL{long invokePrim(long arg0, Object arg1, Object arg2, Object arg3);} +static public interface LOOOD{double invokePrim(long arg0, Object arg1, Object arg2, Object arg3);} +static public interface LOOLO{Object invokePrim(long arg0, Object arg1, Object arg2, long arg3);} +static public interface LOOLL{long invokePrim(long arg0, Object arg1, Object arg2, long arg3);} +static public interface LOOLD{double invokePrim(long arg0, Object arg1, Object arg2, long arg3);} +static public interface LOODO{Object invokePrim(long arg0, Object arg1, Object arg2, double arg3);} +static public interface LOODL{long invokePrim(long arg0, Object arg1, Object arg2, double arg3);} +static public interface LOODD{double invokePrim(long arg0, Object arg1, Object arg2, double arg3);} +static public interface LOLOO{Object invokePrim(long arg0, Object arg1, long arg2, Object arg3);} +static public interface LOLOL{long invokePrim(long arg0, Object arg1, long arg2, Object arg3);} +static public interface LOLOD{double invokePrim(long arg0, Object arg1, long arg2, Object arg3);} +static public interface LOLLO{Object invokePrim(long arg0, Object arg1, long arg2, long arg3);} +static public interface LOLLL{long invokePrim(long arg0, Object arg1, long arg2, long arg3);} +static public interface LOLLD{double invokePrim(long arg0, Object arg1, long arg2, long arg3);} +static public interface LOLDO{Object invokePrim(long arg0, Object arg1, long arg2, double arg3);} +static public interface LOLDL{long invokePrim(long arg0, Object arg1, long arg2, double arg3);} +static public interface LOLDD{double invokePrim(long arg0, Object arg1, long arg2, double arg3);} +static public interface LODOO{Object invokePrim(long arg0, Object arg1, double arg2, Object arg3);} +static public interface LODOL{long invokePrim(long arg0, Object arg1, double arg2, Object arg3);} +static public interface LODOD{double invokePrim(long arg0, Object arg1, double arg2, Object arg3);} +static public interface LODLO{Object invokePrim(long arg0, Object arg1, double arg2, long arg3);} +static public interface LODLL{long invokePrim(long arg0, Object arg1, double arg2, long arg3);} +static public interface LODLD{double invokePrim(long arg0, Object arg1, double arg2, long arg3);} +static public interface LODDO{Object invokePrim(long arg0, Object arg1, double arg2, double arg3);} +static public interface LODDL{long invokePrim(long arg0, Object arg1, double arg2, double arg3);} +static public interface LODDD{double invokePrim(long arg0, Object arg1, double arg2, double arg3);} +static public interface LLOOO{Object invokePrim(long arg0, long arg1, Object arg2, Object arg3);} +static public interface LLOOL{long invokePrim(long arg0, long arg1, Object arg2, Object arg3);} +static public interface LLOOD{double invokePrim(long arg0, long arg1, Object arg2, Object arg3);} +static public interface LLOLO{Object invokePrim(long arg0, long arg1, Object arg2, long arg3);} +static public interface LLOLL{long invokePrim(long arg0, long arg1, Object arg2, long arg3);} +static public interface LLOLD{double invokePrim(long arg0, long arg1, Object arg2, long arg3);} +static public interface LLODO{Object invokePrim(long arg0, long arg1, Object arg2, double arg3);} +static public interface LLODL{long invokePrim(long arg0, long arg1, Object arg2, double arg3);} +static public interface LLODD{double invokePrim(long arg0, long arg1, Object arg2, double arg3);} +static public interface LLLOO{Object invokePrim(long arg0, long arg1, long arg2, Object arg3);} +static public interface LLLOL{long invokePrim(long arg0, long arg1, long arg2, Object arg3);} +static public interface LLLOD{double invokePrim(long arg0, long arg1, long arg2, Object arg3);} +static public interface LLLLO{Object invokePrim(long arg0, long arg1, long arg2, long arg3);} +static public interface LLLLL{long invokePrim(long arg0, long arg1, long arg2, long arg3);} +static public interface LLLLD{double invokePrim(long arg0, long arg1, long arg2, long arg3);} +static public interface LLLDO{Object invokePrim(long arg0, long arg1, long arg2, double arg3);} +static public interface LLLDL{long invokePrim(long arg0, long arg1, long arg2, double arg3);} +static public interface LLLDD{double invokePrim(long arg0, long arg1, long arg2, double arg3);} +static public interface LLDOO{Object invokePrim(long arg0, long arg1, double arg2, Object arg3);} +static public interface LLDOL{long invokePrim(long arg0, long arg1, double arg2, Object arg3);} +static public interface LLDOD{double invokePrim(long arg0, long arg1, double arg2, Object arg3);} +static public interface LLDLO{Object invokePrim(long arg0, long arg1, double arg2, long arg3);} +static public interface LLDLL{long invokePrim(long arg0, long arg1, double arg2, long arg3);} +static public interface LLDLD{double invokePrim(long arg0, long arg1, double arg2, long arg3);} +static public interface LLDDO{Object invokePrim(long arg0, long arg1, double arg2, double arg3);} +static public interface LLDDL{long invokePrim(long arg0, long arg1, double arg2, double arg3);} +static public interface LLDDD{double invokePrim(long arg0, long arg1, double arg2, double arg3);} +static public interface LDOOO{Object invokePrim(long arg0, double arg1, Object arg2, Object arg3);} +static public interface LDOOL{long invokePrim(long arg0, double arg1, Object arg2, Object arg3);} +static public interface LDOOD{double invokePrim(long arg0, double arg1, Object arg2, Object arg3);} +static public interface LDOLO{Object invokePrim(long arg0, double arg1, Object arg2, long arg3);} +static public interface LDOLL{long invokePrim(long arg0, double arg1, Object arg2, long arg3);} +static public interface LDOLD{double invokePrim(long arg0, double arg1, Object arg2, long arg3);} +static public interface LDODO{Object invokePrim(long arg0, double arg1, Object arg2, double arg3);} +static public interface LDODL{long invokePrim(long arg0, double arg1, Object arg2, double arg3);} +static public interface LDODD{double invokePrim(long arg0, double arg1, Object arg2, double arg3);} +static public interface LDLOO{Object invokePrim(long arg0, double arg1, long arg2, Object arg3);} +static public interface LDLOL{long invokePrim(long arg0, double arg1, long arg2, Object arg3);} +static public interface LDLOD{double invokePrim(long arg0, double arg1, long arg2, Object arg3);} +static public interface LDLLO{Object invokePrim(long arg0, double arg1, long arg2, long arg3);} +static public interface LDLLL{long invokePrim(long arg0, double arg1, long arg2, long arg3);} +static public interface LDLLD{double invokePrim(long arg0, double arg1, long arg2, long arg3);} +static public interface LDLDO{Object invokePrim(long arg0, double arg1, long arg2, double arg3);} +static public interface LDLDL{long invokePrim(long arg0, double arg1, long arg2, double arg3);} +static public interface LDLDD{double invokePrim(long arg0, double arg1, long arg2, double arg3);} +static public interface LDDOO{Object invokePrim(long arg0, double arg1, double arg2, Object arg3);} +static public interface LDDOL{long invokePrim(long arg0, double arg1, double arg2, Object arg3);} +static public interface LDDOD{double invokePrim(long arg0, double arg1, double arg2, Object arg3);} +static public interface LDDLO{Object invokePrim(long arg0, double arg1, double arg2, long arg3);} +static public interface LDDLL{long invokePrim(long arg0, double arg1, double arg2, long arg3);} +static public interface LDDLD{double invokePrim(long arg0, double arg1, double arg2, long arg3);} +static public interface LDDDO{Object invokePrim(long arg0, double arg1, double arg2, double arg3);} +static public interface LDDDL{long invokePrim(long arg0, double arg1, double arg2, double arg3);} +static public interface LDDDD{double invokePrim(long arg0, double arg1, double arg2, double arg3);} +static public interface DOOOO{Object invokePrim(double arg0, Object arg1, Object arg2, Object arg3);} +static public interface DOOOL{long invokePrim(double arg0, Object arg1, Object arg2, Object arg3);} +static public interface DOOOD{double invokePrim(double arg0, Object arg1, Object arg2, Object arg3);} +static public interface DOOLO{Object invokePrim(double arg0, Object arg1, Object arg2, long arg3);} +static public interface DOOLL{long invokePrim(double arg0, Object arg1, Object arg2, long arg3);} +static public interface DOOLD{double invokePrim(double arg0, Object arg1, Object arg2, long arg3);} +static public interface DOODO{Object invokePrim(double arg0, Object arg1, Object arg2, double arg3);} +static public interface DOODL{long invokePrim(double arg0, Object arg1, Object arg2, double arg3);} +static public interface DOODD{double invokePrim(double arg0, Object arg1, Object arg2, double arg3);} +static public interface DOLOO{Object invokePrim(double arg0, Object arg1, long arg2, Object arg3);} +static public interface DOLOL{long invokePrim(double arg0, Object arg1, long arg2, Object arg3);} +static public interface DOLOD{double invokePrim(double arg0, Object arg1, long arg2, Object arg3);} +static public interface DOLLO{Object invokePrim(double arg0, Object arg1, long arg2, long arg3);} +static public interface DOLLL{long invokePrim(double arg0, Object arg1, long arg2, long arg3);} +static public interface DOLLD{double invokePrim(double arg0, Object arg1, long arg2, long arg3);} +static public interface DOLDO{Object invokePrim(double arg0, Object arg1, long arg2, double arg3);} +static public interface DOLDL{long invokePrim(double arg0, Object arg1, long arg2, double arg3);} +static public interface DOLDD{double invokePrim(double arg0, Object arg1, long arg2, double arg3);} +static public interface DODOO{Object invokePrim(double arg0, Object arg1, double arg2, Object arg3);} +static public interface DODOL{long invokePrim(double arg0, Object arg1, double arg2, Object arg3);} +static public interface DODOD{double invokePrim(double arg0, Object arg1, double arg2, Object arg3);} +static public interface DODLO{Object invokePrim(double arg0, Object arg1, double arg2, long arg3);} +static public interface DODLL{long invokePrim(double arg0, Object arg1, double arg2, long arg3);} +static public interface DODLD{double invokePrim(double arg0, Object arg1, double arg2, long arg3);} +static public interface DODDO{Object invokePrim(double arg0, Object arg1, double arg2, double arg3);} +static public interface DODDL{long invokePrim(double arg0, Object arg1, double arg2, double arg3);} +static public interface DODDD{double invokePrim(double arg0, Object arg1, double arg2, double arg3);} +static public interface DLOOO{Object invokePrim(double arg0, long arg1, Object arg2, Object arg3);} +static public interface DLOOL{long invokePrim(double arg0, long arg1, Object arg2, Object arg3);} +static public interface DLOOD{double invokePrim(double arg0, long arg1, Object arg2, Object arg3);} +static public interface DLOLO{Object invokePrim(double arg0, long arg1, Object arg2, long arg3);} +static public interface DLOLL{long invokePrim(double arg0, long arg1, Object arg2, long arg3);} +static public interface DLOLD{double invokePrim(double arg0, long arg1, Object arg2, long arg3);} +static public interface DLODO{Object invokePrim(double arg0, long arg1, Object arg2, double arg3);} +static public interface DLODL{long invokePrim(double arg0, long arg1, Object arg2, double arg3);} +static public interface DLODD{double invokePrim(double arg0, long arg1, Object arg2, double arg3);} +static public interface DLLOO{Object invokePrim(double arg0, long arg1, long arg2, Object arg3);} +static public interface DLLOL{long invokePrim(double arg0, long arg1, long arg2, Object arg3);} +static public interface DLLOD{double invokePrim(double arg0, long arg1, long arg2, Object arg3);} +static public interface DLLLO{Object invokePrim(double arg0, long arg1, long arg2, long arg3);} +static public interface DLLLL{long invokePrim(double arg0, long arg1, long arg2, long arg3);} +static public interface DLLLD{double invokePrim(double arg0, long arg1, long arg2, long arg3);} +static public interface DLLDO{Object invokePrim(double arg0, long arg1, long arg2, double arg3);} +static public interface DLLDL{long invokePrim(double arg0, long arg1, long arg2, double arg3);} +static public interface DLLDD{double invokePrim(double arg0, long arg1, long arg2, double arg3);} +static public interface DLDOO{Object invokePrim(double arg0, long arg1, double arg2, Object arg3);} +static public interface DLDOL{long invokePrim(double arg0, long arg1, double arg2, Object arg3);} +static public interface DLDOD{double invokePrim(double arg0, long arg1, double arg2, Object arg3);} +static public interface DLDLO{Object invokePrim(double arg0, long arg1, double arg2, long arg3);} +static public interface DLDLL{long invokePrim(double arg0, long arg1, double arg2, long arg3);} +static public interface DLDLD{double invokePrim(double arg0, long arg1, double arg2, long arg3);} +static public interface DLDDO{Object invokePrim(double arg0, long arg1, double arg2, double arg3);} +static public interface DLDDL{long invokePrim(double arg0, long arg1, double arg2, double arg3);} +static public interface DLDDD{double invokePrim(double arg0, long arg1, double arg2, double arg3);} +static public interface DDOOO{Object invokePrim(double arg0, double arg1, Object arg2, Object arg3);} +static public interface DDOOL{long invokePrim(double arg0, double arg1, Object arg2, Object arg3);} +static public interface DDOOD{double invokePrim(double arg0, double arg1, Object arg2, Object arg3);} +static public interface DDOLO{Object invokePrim(double arg0, double arg1, Object arg2, long arg3);} +static public interface DDOLL{long invokePrim(double arg0, double arg1, Object arg2, long arg3);} +static public interface DDOLD{double invokePrim(double arg0, double arg1, Object arg2, long arg3);} +static public interface DDODO{Object invokePrim(double arg0, double arg1, Object arg2, double arg3);} +static public interface DDODL{long invokePrim(double arg0, double arg1, Object arg2, double arg3);} +static public interface DDODD{double invokePrim(double arg0, double arg1, Object arg2, double arg3);} +static public interface DDLOO{Object invokePrim(double arg0, double arg1, long arg2, Object arg3);} +static public interface DDLOL{long invokePrim(double arg0, double arg1, long arg2, Object arg3);} +static public interface DDLOD{double invokePrim(double arg0, double arg1, long arg2, Object arg3);} +static public interface DDLLO{Object invokePrim(double arg0, double arg1, long arg2, long arg3);} +static public interface DDLLL{long invokePrim(double arg0, double arg1, long arg2, long arg3);} +static public interface DDLLD{double invokePrim(double arg0, double arg1, long arg2, long arg3);} +static public interface DDLDO{Object invokePrim(double arg0, double arg1, long arg2, double arg3);} +static public interface DDLDL{long invokePrim(double arg0, double arg1, long arg2, double arg3);} +static public interface DDLDD{double invokePrim(double arg0, double arg1, long arg2, double arg3);} +static public interface DDDOO{Object invokePrim(double arg0, double arg1, double arg2, Object arg3);} +static public interface DDDOL{long invokePrim(double arg |