summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2010-10-20 21:28:30 -0400
committerRich Hickey <richhickey@gmail.com>2010-10-20 21:28:30 -0400
commit52adb74f5335c8256f6468581028f44220547dca (patch)
tree6f6c2a24a555384583ab233589a5f85ed5aa256b
parentc643a37953964eb15a2f39fa31fc317079467bf0 (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.clj2
-rw-r--r--src/jvm/clojure/lang/Compiler.java170
-rw-r--r--src/jvm/clojure/lang/IFn.java359
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