|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.jruby.runtime.MethodFactory
org.jruby.internal.runtime.methods.InvocationMethodFactory
public class InvocationMethodFactory
In order to avoid the overhead with reflection-based method handles, this MethodFactory uses ASM to generate tiny invoker classes. This allows for better performance and more specialization per-handle than can be supported via reflection. It also allows optimizing away many conditionals that can be determined once ahead of time. When running in secured environments, this factory may not function. When this can be detected, MethodFactory will fall back on the reflection-based factory instead.
org.jruby.internal.runtime.methods.MethodFactory
Nested Class Summary |
---|
Nested classes/interfaces inherited from class org.jruby.runtime.MethodFactory |
---|
MethodFactory.MethodDefiningCallback |
Field Summary | |
---|---|
static int |
ARGS_INDEX
The lvar index of the method args on the call |
static int |
BLOCK_INDEX
The lvar index of the passed-in Block on the call |
static int |
CLASS_INDEX
The lvar index of the RubyClass being invoked against |
protected JRubyClassLoader |
classLoader
The classloader to use for code loading |
static int |
NAME_INDEX
The lvar index method name being invoked |
static int |
RECEIVER_INDEX
The lvar index of the method-receiving object |
static int |
THIS_INDEX
The lvar index of "this" |
static int |
THREADCONTEXT_INDEX
The lvar index of the passed-in ThreadContext |
Fields inherited from class org.jruby.runtime.MethodFactory |
---|
COMPILED_METHOD_PARAMS |
Fields inherited from interface org.objectweb.asm.Opcodes |
---|
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6 |
Constructor Summary | |
---|---|
InvocationMethodFactory(java.lang.ClassLoader classLoader)
Construct a new InvocationMethodFactory using the specified classloader to load code. |
Method Summary | |
---|---|
void |
defineIndexedAnnotatedMethods(RubyModule implementationClass,
java.lang.Class type,
MethodFactory.MethodDefiningCallback callback)
Use code generation to generate a set of method handles based on all annotated methods in the target class. |
protected java.lang.Class |
endCall(org.objectweb.asm.ClassWriter cw,
org.objectweb.asm.MethodVisitor mv,
java.lang.String name)
|
protected java.lang.Class |
endClass(org.objectweb.asm.ClassWriter cw,
java.lang.String name)
|
protected void |
endMethod(org.objectweb.asm.MethodVisitor mv)
|
DynamicMethod |
getAnnotatedMethod(RubyModule implementationClass,
JavaMethodDescriptor desc)
Use code generation to provide a method handle based on an annotated Java method. |
DynamicMethod |
getAnnotatedMethod(RubyModule implementationClass,
java.util.List<JavaMethodDescriptor> descs)
Use code generation to provide a method handle based on an annotated Java method. |
java.lang.Class |
getAnnotatedMethodClass(JavaMethodDescriptor desc)
Use code generation to provide a method handle based on an annotated Java method. |
java.lang.Class |
getAnnotatedMethodClass(java.util.List<JavaMethodDescriptor> descs)
Use code generation to provide a method handle based on an annotated Java method. |
DynamicMethod |
getCompiledMethod(RubyModule implementationClass,
java.lang.String method,
Arity arity,
Visibility visibility,
StaticScope scope,
java.lang.Object scriptObject,
CallConfiguration callConfig)
Use code generation to provide a method handle for a compiled Ruby method. |
void |
prepareAnnotatedMethod(RubyModule implementationClass,
JavaMethod javaMethod,
JavaMethodDescriptor desc)
Use code generation to provide a method handle based on an annotated Java method. |
Methods inherited from class org.jruby.runtime.MethodFactory |
---|
createFactory |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
---|
public static final int THIS_INDEX
public static final int THREADCONTEXT_INDEX
public static final int RECEIVER_INDEX
public static final int CLASS_INDEX
public static final int NAME_INDEX
public static final int ARGS_INDEX
public static final int BLOCK_INDEX
protected JRubyClassLoader classLoader
Constructor Detail |
---|
public InvocationMethodFactory(java.lang.ClassLoader classLoader)
classLoader
- The classloader to use, or to wrap if it is not a
JRubyClassLoader instance.Method Detail |
---|
public DynamicMethod getCompiledMethod(RubyModule implementationClass, java.lang.String method, Arity arity, Visibility visibility, StaticScope scope, java.lang.Object scriptObject, CallConfiguration callConfig)
getCompiledMethod
in class MethodFactory
implementationClass
- The class to which the method will be bound.method
- The name of the methodarity
- The Arity of the methodvisibility
- The method's visibility on the target type.scope
- The methods static scoping information.scriptObject
- An instace of the target compiled method class.callConfig
- The call configuration to use for this method.
org.jruby.internal.runtime.methods.MethodFactory#getCompiledMethod
public DynamicMethod getAnnotatedMethod(RubyModule implementationClass, java.util.List<JavaMethodDescriptor> descs)
getAnnotatedMethod
in class MethodFactory
implementationClass
- The target class or module on which the method
will be bound.
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public java.lang.Class getAnnotatedMethodClass(java.util.List<JavaMethodDescriptor> descs) throws java.lang.Exception
java.lang.Exception
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public DynamicMethod getAnnotatedMethod(RubyModule implementationClass, JavaMethodDescriptor desc)
getAnnotatedMethod
in class MethodFactory
implementationClass
- The target class or module on which the method
will be bound.desc
- A JavaMethodDescriptor describing the target method
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public java.lang.Class getAnnotatedMethodClass(JavaMethodDescriptor desc) throws java.lang.Exception
java.lang.Exception
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public void prepareAnnotatedMethod(RubyModule implementationClass, JavaMethod javaMethod, JavaMethodDescriptor desc)
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public void defineIndexedAnnotatedMethods(RubyModule implementationClass, java.lang.Class type, MethodFactory.MethodDefiningCallback callback)
defineIndexedAnnotatedMethods
in class MethodFactory
implementationClass
- The target class or module on which the method
will be bound.type
- The Java class containined annotated methods to
be bound.callback
- A callback provided by the caller which handles binding
each method.org.jruby.internal.runtime.methods.MethodFactory#defineIndexedAnnotatedMethods
protected java.lang.Class endCall(org.objectweb.asm.ClassWriter cw, org.objectweb.asm.MethodVisitor mv, java.lang.String name)
protected void endMethod(org.objectweb.asm.MethodVisitor mv)
protected java.lang.Class endClass(org.objectweb.asm.ClassWriter cw, java.lang.String name)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |