|
||||||||||
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 |
---|
CAN_LOAD_BYTECODE, 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, INVOKEDYNAMIC, INVOKEDYNAMIC_OWNER, 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, V1_7 |
Constructor Summary | |
---|---|
InvocationMethodFactory(java.lang.ClassLoader classLoader)
Construct a new InvocationMethodFactory using the specified classloader to load code. |
Method Summary | |
---|---|
protected java.lang.Class |
endCall(org.objectweb.asm.ClassWriter cw,
java.lang.String name)
|
protected byte[] |
endCallOffline(org.objectweb.asm.ClassWriter cw)
|
protected java.lang.Class |
endCallWithBytes(byte[] classBytes,
java.lang.String name)
|
protected java.lang.Class |
endClass(org.objectweb.asm.ClassWriter cw,
java.lang.String name)
|
protected byte[] |
endClassOffline(org.objectweb.asm.ClassWriter cw)
|
protected java.lang.Class |
endClassWithBytes(byte[] code,
java.lang.String name)
|
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(java.util.List<JavaMethodDescriptor> descs)
Use code generation to provide a method handle based on an annotated Java method. |
CompiledBlockCallback |
getBlockCallback(java.lang.String method,
java.lang.String file,
int line,
java.lang.Object scriptObject)
Get a CompiledBlockCallback for the specified block |
CompiledBlockCallback19 |
getBlockCallback19(java.lang.String method,
java.lang.String file,
int line,
java.lang.Object scriptObject)
Get a CompiledBlockCallback for the specified block |
byte[] |
getBlockCallback19Offline(java.lang.String method,
java.lang.String file,
int line,
java.lang.String classname)
Get a CompiledBlockCallback for the specified block, returning the bytes but not loading the class. |
byte[] |
getBlockCallbackOffline(java.lang.String method,
java.lang.String file,
int line,
java.lang.String classname)
Get a CompiledBlockCallback for the specified block, returning the bytes but not loading the class. |
DynamicMethod |
getCompiledMethod(RubyModule implementationClass,
java.lang.String method,
Arity arity,
Visibility visibility,
StaticScope scope,
java.lang.Object scriptObject,
CallConfiguration callConfig,
ISourcePosition position,
java.lang.String parameterDesc)
Use code generation to provide a method handle for a compiled Ruby method. |
DynamicMethod |
getCompiledMethodLazily(RubyModule implementationClass,
java.lang.String method,
Arity arity,
Visibility visibility,
StaticScope scope,
java.lang.Object scriptObject,
CallConfiguration callConfig,
ISourcePosition position,
java.lang.String parameterDesc)
Use code generation to provide a method handle for a compiled Ruby method. |
byte[] |
getCompiledMethodOffline(java.lang.String method,
java.lang.String className,
java.lang.String invokerPath,
Arity arity,
StaticScope scope,
CallConfiguration callConfig,
java.lang.String filename,
int line)
Use code generation to provide a method handle for a compiled Ruby method. |
static java.lang.String |
getPostMethod(CallConfiguration callConfig)
|
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 final 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 getCompiledMethodLazily(RubyModule implementationClass, java.lang.String method, Arity arity, Visibility visibility, StaticScope scope, java.lang.Object scriptObject, CallConfiguration callConfig, ISourcePosition position, java.lang.String parameterDesc)
getCompiledMethodLazily
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 getCompiledMethod(RubyModule implementationClass, java.lang.String method, Arity arity, Visibility visibility, StaticScope scope, java.lang.Object scriptObject, CallConfiguration callConfig, ISourcePosition position, java.lang.String parameterDesc)
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.position
- The position to use when generating traceable handles.
org.jruby.internal.runtime.methods.MethodFactory#getCompiledMethod
public byte[] getCompiledMethodOffline(java.lang.String method, java.lang.String className, java.lang.String invokerPath, Arity arity, StaticScope scope, CallConfiguration callConfig, java.lang.String filename, int line)
getCompiledMethodOffline
in class MethodFactory
method
- The name of the methodclassName
- The path-like (with / instead of .) name of the classinvokerPath
- The path-line name of the invoker to generatearity
- The Arity of the methodscope
- The methods static scoping information.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 CompiledBlockCallback getBlockCallback(java.lang.String method, java.lang.String file, int line, java.lang.Object scriptObject)
MethodFactory
getBlockCallback
in class MethodFactory
method
- The name of the methodscriptObject
- The object in which the method can be found
public byte[] getBlockCallbackOffline(java.lang.String method, java.lang.String file, int line, java.lang.String classname)
MethodFactory
getBlockCallbackOffline
in class MethodFactory
method
- The name of the methodclassname
- The /-based name of the class containing the method
public CompiledBlockCallback19 getBlockCallback19(java.lang.String method, java.lang.String file, int line, java.lang.Object scriptObject)
MethodFactory
getBlockCallback19
in class MethodFactory
method
- The name of the methodscriptObject
- The object in which the method can be found
public byte[] getBlockCallback19Offline(java.lang.String method, java.lang.String file, int line, java.lang.String classname)
MethodFactory
getBlockCallback19Offline
in class MethodFactory
method
- The name of the methodclassname
- The /-based name of the class containing the method
public void prepareAnnotatedMethod(RubyModule implementationClass, JavaMethod javaMethod, JavaMethodDescriptor desc)
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod
public static java.lang.String getPostMethod(CallConfiguration callConfig)
protected java.lang.Class endCall(org.objectweb.asm.ClassWriter cw, java.lang.String name)
protected java.lang.Class endCallWithBytes(byte[] classBytes, java.lang.String name)
protected byte[] endCallOffline(org.objectweb.asm.ClassWriter cw)
protected java.lang.Class endClass(org.objectweb.asm.ClassWriter cw, java.lang.String name)
protected java.lang.Class endClassWithBytes(byte[] code, java.lang.String name)
protected byte[] endClassOffline(org.objectweb.asm.ClassWriter cw)
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |