Class InvocationMethodFactory
java.lang.Object
org.jruby.runtime.MethodFactory
org.jruby.internal.runtime.methods.InvocationMethodFactory
- All Implemented Interfaces:
org.objectweb.asm.Opcodes
- Direct Known Subclasses:
DumpingInvocationMethodFactory
,InvokeDynamicMethodFactory
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.
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final int
The lvar index of the method args on the callstatic final int
The lvar index of the passed-in Block on the callstatic final int
The lvar index of the RubyClass being invoked againstprotected final ClassDefiningJRubyClassLoader
The classloader to use for code loadingstatic final int
The lvar index method name being invokedstatic final int
The lvar index of the method-receiving objectprotected final Object
An object to sync against when loading classes, to avoid dupsstatic final int
The lvar index of "this"static final int
The lvar index of the passed-in ThreadContextFields inherited from interface org.objectweb.asm.Opcodes
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, 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, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, 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, INVOKEDYNAMIC, 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, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V9
-
Constructor Summary
ConstructorsConstructorDescriptionInvocationMethodFactory
(ClassLoader classLoader) Construct a new InvocationMethodFactory using the specified classloader to load code. -
Method Summary
Modifier and TypeMethodDescriptionconstructJavaMethod
(RubyModule implementationClass, JavaMethodDescriptor desc, String name, Class c) protected Class
getAnnotatedMethod
(RubyModule implementationClass, List<JavaMethodDescriptor> descs, String name) Use code generation to provide a method handle based on an annotated Java method.getAnnotatedMethod
(RubyModule implementationClass, JavaMethodDescriptor desc, String name) Use code generation to provide a method handle based on an annotated Java method.Use code generation to provide a method handle based on an annotated Java method.static String
getPostMethod
(CallConfiguration callConfig) Methods inherited from class org.jruby.runtime.MethodFactory
createFactory
-
Field Details
-
THIS_INDEX
public static final int THIS_INDEXThe lvar index of "this"- See Also:
-
THREADCONTEXT_INDEX
public static final int THREADCONTEXT_INDEXThe lvar index of the passed-in ThreadContext- See Also:
-
RECEIVER_INDEX
public static final int RECEIVER_INDEXThe lvar index of the method-receiving object- See Also:
-
CLASS_INDEX
public static final int CLASS_INDEXThe lvar index of the RubyClass being invoked against- See Also:
-
NAME_INDEX
public static final int NAME_INDEXThe lvar index method name being invoked- See Also:
-
ARGS_INDEX
public static final int ARGS_INDEXThe lvar index of the method args on the call- See Also:
-
BLOCK_INDEX
public static final int BLOCK_INDEXThe lvar index of the passed-in Block on the call- See Also:
-
classLoader
The classloader to use for code loading -
syncObject
An object to sync against when loading classes, to avoid dups
-
-
Constructor Details
-
InvocationMethodFactory
Construct a new InvocationMethodFactory using the specified classloader to load code. If the target classloader is not an instance of JRubyClassLoader, it will be wrapped with one.- Parameters:
classLoader
- The classloader to use, or to wrap if it is not a JRubyClassLoader instance.
-
-
Method Details
-
getAnnotatedMethod
public DynamicMethod getAnnotatedMethod(RubyModule implementationClass, List<JavaMethodDescriptor> descs, String name) Use code generation to provide a method handle based on an annotated Java method.- Specified by:
getAnnotatedMethod
in classMethodFactory
- Parameters:
implementationClass
- The target class or module on which the method will be bound.- Returns:
- A method handle for the target object.
- See Also:
-
getAnnotatedMethodClass
Use code generation to provide a method handle based on an annotated Java method. Return the resulting generated or loaded class.- See Also:
-
getAnnotatedMethod
public DynamicMethod getAnnotatedMethod(RubyModule implementationClass, JavaMethodDescriptor desc, String name) Use code generation to provide a method handle based on an annotated Java method.- Specified by:
getAnnotatedMethod
in classMethodFactory
- Parameters:
implementationClass
- The target class or module on which the method will be bound.desc
- A JavaMethodDescriptor describing the target method- Returns:
- A method handle for the target object.
- See Also:
-
constructJavaMethod
public JavaMethod constructJavaMethod(RubyModule implementationClass, JavaMethodDescriptor desc, String name, Class c) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException -
getPostMethod
-
endClass
-