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