org.jruby.internal.runtime.methods
Class InvocationMethodFactory

java.lang.Object
  extended by org.jruby.runtime.MethodFactory
      extended by org.jruby.internal.runtime.methods.InvocationMethodFactory
All Implemented Interfaces:
org.objectweb.asm.Opcodes
Direct Known Subclasses:
DumpingInvocationMethodFactory

public class InvocationMethodFactory
extends MethodFactory
implements org.objectweb.asm.Opcodes

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:
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

THIS_INDEX

public static final int THIS_INDEX
The lvar index of "this"

See Also:
Constant Field Values

THREADCONTEXT_INDEX

public static final int THREADCONTEXT_INDEX
The lvar index of the passed-in ThreadContext

See Also:
Constant Field Values

RECEIVER_INDEX

public static final int RECEIVER_INDEX
The lvar index of the method-receiving object

See Also:
Constant Field Values

CLASS_INDEX

public static final int CLASS_INDEX
The lvar index of the RubyClass being invoked against

See Also:
Constant Field Values

NAME_INDEX

public static final int NAME_INDEX
The lvar index method name being invoked

See Also:
Constant Field Values

ARGS_INDEX

public static final int ARGS_INDEX
The lvar index of the method args on the call

See Also:
Constant Field Values

BLOCK_INDEX

public static final int BLOCK_INDEX
The lvar index of the passed-in Block on the call

See Also:
Constant Field Values

classLoader

protected final JRubyClassLoader classLoader
The classloader to use for code loading

Constructor Detail

InvocationMethodFactory

public InvocationMethodFactory(java.lang.ClassLoader classLoader)
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 Detail

getCompiledMethodLazily

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)
Use code generation to provide a method handle for a compiled Ruby method.

Specified by:
getCompiledMethodLazily in class MethodFactory
Parameters:
implementationClass - The class to which the method will be bound.
method - The name of the method
arity - The Arity of the method
visibility - 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.
Returns:
A new method handle for the target compiled method.
See Also:
org.jruby.internal.runtime.methods.MethodFactory#getCompiledMethod

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)
Use code generation to provide a method handle for a compiled Ruby method.

Specified by:
getCompiledMethod in class MethodFactory
Parameters:
implementationClass - The class to which the method will be bound.
method - The name of the method
arity - The Arity of the method
visibility - 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.
Returns:
A new method handle for the target compiled method.
See Also:
org.jruby.internal.runtime.methods.MethodFactory#getCompiledMethod

getCompiledMethodOffline

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)
Use code generation to provide a method handle for a compiled Ruby method.

Overrides:
getCompiledMethodOffline in class MethodFactory
Parameters:
method - The name of the method
className - The path-like (with / instead of .) name of the class
invokerPath - The path-line name of the invoker to generate
arity - The Arity of the method
scope - The methods static scoping information.
callConfig - The call configuration to use for this method.
Returns:
See Also:
org.jruby.internal.runtime.methods.MethodFactory#getCompiledMethod

getAnnotatedMethod

public DynamicMethod getAnnotatedMethod(RubyModule implementationClass,
                                        java.util.List<JavaMethodDescriptor> descs)
Use code generation to provide a method handle based on an annotated Java method.

Specified by:
getAnnotatedMethod in class MethodFactory
Parameters:
implementationClass - The target class or module on which the method will be bound.
Returns:
A method handle for the target object.
See Also:
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod

getAnnotatedMethodClass

public java.lang.Class getAnnotatedMethodClass(java.util.List<JavaMethodDescriptor> descs)
                                        throws java.lang.Exception
Use code generation to provide a method handle based on an annotated Java method. Return the resulting generated or loaded class.

Throws:
java.lang.Exception
See Also:
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod

getAnnotatedMethod

public DynamicMethod getAnnotatedMethod(RubyModule implementationClass,
                                        JavaMethodDescriptor desc)
Use code generation to provide a method handle based on an annotated Java method.

Specified by:
getAnnotatedMethod in class MethodFactory
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:
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod

getBlockCallback

public CompiledBlockCallback getBlockCallback(java.lang.String method,
                                              java.lang.String file,
                                              int line,
                                              java.lang.Object scriptObject)
Description copied from class: MethodFactory
Get a CompiledBlockCallback for the specified block

Specified by:
getBlockCallback in class MethodFactory
Parameters:
method - The name of the method
scriptObject - The object in which the method can be found
Returns:
A new CompiledBlockCallback for the method

getBlockCallbackOffline

public byte[] getBlockCallbackOffline(java.lang.String method,
                                      java.lang.String file,
                                      int line,
                                      java.lang.String classname)
Description copied from class: MethodFactory
Get a CompiledBlockCallback for the specified block, returning the bytes but not loading the class. This is used for offline generation of the callback class file.

Overrides:
getBlockCallbackOffline in class MethodFactory
Parameters:
method - The name of the method
classname - The /-based name of the class containing the method
Returns:
The bytes of the class

getBlockCallback19

public CompiledBlockCallback19 getBlockCallback19(java.lang.String method,
                                                  java.lang.String file,
                                                  int line,
                                                  java.lang.Object scriptObject)
Description copied from class: MethodFactory
Get a CompiledBlockCallback for the specified block

Specified by:
getBlockCallback19 in class MethodFactory
Parameters:
method - The name of the method
scriptObject - The object in which the method can be found
Returns:
A new CompiledBlockCallback for the method

getBlockCallback19Offline

public byte[] getBlockCallback19Offline(java.lang.String method,
                                        java.lang.String file,
                                        int line,
                                        java.lang.String classname)
Description copied from class: MethodFactory
Get a CompiledBlockCallback for the specified block, returning the bytes but not loading the class. This is used for offline generation of the callback class file. This version generates a 1.9-compatible callback.

Overrides:
getBlockCallback19Offline in class MethodFactory
Parameters:
method - The name of the method
classname - The /-based name of the class containing the method
Returns:
The bytes of the class

prepareAnnotatedMethod

public void prepareAnnotatedMethod(RubyModule implementationClass,
                                   JavaMethod javaMethod,
                                   JavaMethodDescriptor desc)
Use code generation to provide a method handle based on an annotated Java method.

See Also:
org.jruby.internal.runtime.methods.MethodFactory#getAnnotatedMethod

getPostMethod

public static java.lang.String getPostMethod(CallConfiguration callConfig)

endCall

protected java.lang.Class endCall(org.objectweb.asm.ClassWriter cw,
                                  java.lang.String name)

endCallWithBytes

protected java.lang.Class endCallWithBytes(byte[] classBytes,
                                           java.lang.String name)

endCallOffline

protected byte[] endCallOffline(org.objectweb.asm.ClassWriter cw)

endClass

protected java.lang.Class endClass(org.objectweb.asm.ClassWriter cw,
                                   java.lang.String name)

endClassWithBytes

protected java.lang.Class endClassWithBytes(byte[] code,
                                            java.lang.String name)

endClassOffline

protected byte[] endClassOffline(org.objectweb.asm.ClassWriter cw)


Copyright © 2002-2009 JRuby Team. All Rights Reserved.