org.jruby.internal.runtime.methods
Class InvocationMethodFactory

java.lang.Object
  extended by org.jruby.runtime.MethodFactory
      extended by org.jruby.internal.runtime.methods.InvocationMethodFactory
Direct Known Subclasses:
DumpingInvocationMethodFactory

public class InvocationMethodFactory
extends MethodFactory

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
COMPILED_METHOD_PARAMS
 
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)
          Deprecated. 
protected  java.lang.Class endCall(ClassWriter cw, MethodVisitor mv, java.lang.String name)
           
protected  java.lang.Class endClass(ClassWriter cw, java.lang.String name)
           
protected  void endMethod(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.
 DynamicMethod getCompiledMethodLazily(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

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 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)
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)
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.
Returns:
A new method handle for the target compiled method.
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

getAnnotatedMethodClass

public java.lang.Class getAnnotatedMethodClass(JavaMethodDescriptor desc)
                                        throws java.lang.Exception
Use code generation to provide a method handle based on an annotated Java method.

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

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

defineIndexedAnnotatedMethods

@Deprecated
public void defineIndexedAnnotatedMethods(RubyModule implementationClass,
                                                     java.lang.Class type,
                                                     MethodFactory.MethodDefiningCallback callback)
Deprecated. 

Use code generation to generate a set of method handles based on all annotated methods in the target class.

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

endCall

protected java.lang.Class endCall(ClassWriter cw,
                                  MethodVisitor mv,
                                  java.lang.String name)

endMethod

protected void endMethod(MethodVisitor mv)

endClass

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


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