MethodHandles.constant not inlining?

Charles Oliver Nutter headius at headius.com
Wed Jun 8 16:49:49 PDT 2011


An update:

Almost all literals and several non-literal-but-constructed-once
syntax niblets from Ruby are now constructed through invokedynamic.
Most of these use the "one time only" model, patching the call site
with a MethodHandles.constant from then on. The runtime constructs are
always on; the literals are on by default and can be turned off with
jruby.invokedynamic.literals=false.

jruby --bytecode -e "p 1, 1111111111111111111, 1.0, '1', /1/, :a"
...
  public static
__file__(Lruby/__dash_e__;Lorg/jruby/runtime/ThreadContext;Lorg/jruby/runtime/builtin/IRubyObject;[Lorg/jruby/runtime/builtin/IRubyObject;Lorg/jruby/runtime/Block;)Lorg/jruby/runtime/builtin/IRubyObject;
  @Lorg/jruby/anno/JRubyMethod;(name="__file__", frame=true,
required=0, optional=0, rest=-2)
   L0
    LINENUMBER 1 L0
    ALOAD 1
    ALOAD 2
    ALOAD 2
    LDC "p"
    BIPUSH 6
    ANEWARRAY org/jruby/runtime/builtin/IRubyObject
    DUP
    ICONST_0
    ALOAD 1
    INVOKEDYNAMIC getFixnum
(Lorg/jruby/runtime/ThreadContext;)Lorg/jruby/RubyFixnum;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.getFixnumBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;J)Ljava/lang/invoke/CallSite;
(6), 1]
    AASTORE
    DUP
    ICONST_1
    ALOAD 1
    GETFIELD org/jruby/runtime/ThreadContext.runtime : Lorg/jruby/Ruby;
    INVOKEDYNAMIC getBigInteger ()Ljava/math/BigInteger;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.getBigIntegerBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;)Ljava/lang/invoke/CallSite;
(6), "25a55a46e5da99c71c7"]
    INVOKESTATIC org/jruby/RubyBignum.newBignum
(Lorg/jruby/Ruby;Ljava/math/BigInteger;)Lorg/jruby/RubyBignum;
    AASTORE
    DUP
    ICONST_2
    ALOAD 1
    INVOKEDYNAMIC getFloat
(Lorg/jruby/runtime/ThreadContext;)Lorg/jruby/RubyFloat;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.getFloatBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;D)Ljava/lang/invoke/CallSite;
(6), 1.0]
    AASTORE
    DUP
    ICONST_3
    ALOAD 1
    INVOKEDYNAMIC getString
(Lorg/jruby/runtime/ThreadContext;)Lorg/jruby/RubyString;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.getStringBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/invoke/CallSite;
(6), "1", "ASCII-8BIT", 32]
    AASTORE
    DUP
    ICONST_4
    ALOAD 1
    INVOKEDYNAMIC getRegexp
(Lorg/jruby/runtime/ThreadContext;)Lorg/jruby/RubyRegexp;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.getRegexpBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/invoke/CallSite;
(6), "1", "ASCII-8BIT", 512]
    AASTORE
    DUP
    ICONST_5
    ALOAD 0
    ALOAD 1
    LDC "a"
    INVOKEVIRTUAL ruby/__dash_e__.getSymbol0
(Lorg/jruby/runtime/ThreadContext;Ljava/lang/String;)Lorg/jruby/RubySymbol;
    AASTORE
    INVOKEDYNAMIC fcall
(Lorg/jruby/runtime/ThreadContext;Lorg/jruby/runtime/builtin/IRubyObject;Lorg/jruby/runtime/builtin/IRubyObject;Ljava/lang/String;[Lorg/jruby/runtime/builtin/IRubyObject;)Lorg/jruby/runtime/builtin/IRubyObject;
[org/jruby/runtime/invokedynamic/InvokeDynamicSupport.invocationBootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
(6)]
    ARETURN
    MAXSTACK = 10
    MAXLOCALS = 5

- Charlie


More information about the mlvm-dev mailing list