Weitere ähnliche Inhalte Ähnlich wie Invoke dynamic your api to hotspot Ähnlich wie Invoke dynamic your api to hotspot (20) Kürzlich hochgeladen (20) Invoke dynamic your api to hotspot8. Anamorphic
StrongTalk
• Optional static typing
• Modern garbage collector
• JIT compiler
10. Anamorphic Sun Microsystems
StrongTalk Java
Stolen legacy!
11. Anamorphic Sun Microsystems
StrongTalk Java
Stolen legacy!
12. Anamorphic Sun Microsystems
StrongTalk Java
Stolen legacy!
20. JIT Spectrum
Eager Lazy
V8
CLR
HotSpot
HiPE
Static Optimizations Runtime Optimizations
26. Generate machine code
Compile JVM bytecode to native ISA
after 10,000 calls
1 1 1 1 1
0 0 0 0 0
1 1 BYTECODE 1 1 1
0 0 0 0 0
41. Made for Java
• InvokeVirtual
• InvokeInterface
• InvokeStatic
• InvokeSpecial
49. InDy
• JSR-292: “Supporting Dynamically
Typed Languages on the Java Platform”
• Initial version shipped in Java 7
• Feeds directly into HotSpot in Java 8
56. JVM Data Endpoints
• Invoke operations
• Array element access
• Property lookup
• And more!
57. InDy Use Cases
• Custom invocation
• “Constant” values (e.g.
globals, language intrinsics)
• Scoped values (e.g.
instance variables)
59. Pieces of InDy
• Bootstrap methods
• Call sites
• Method handles
• Switch points
63. Bootstrap Method
• Called the first time each InDy call
site is used
• Find MethodHandle to dispatch
• Return CallSite object
68. java.lang.invoke.MethodHandle
• Directly executable reference to a
Java method (i.e. fast-as-Java)
• Inlineable by HotSpot
• MethodHandles all the way down
70. Project Lambda
Lambdas for the JVM
Coming in Java 8! (Summer 2013)
76. java.lang.invoke.SwitchPoint
• Publish events across threads (e.g.
blow caches when classes change)
• Only event is valid -> invalid
• Hooks directly into the HotSpot
deoptimizer (no additional branches)
81. Invocation example
CallSite: where the call is taking place
SwitchPoint: did the class change?
GuardWithTest: is this the type we bound?
Target: invoke the target method
82. Invocation example
CallSite: where the call is taking place
SwitchPoint: did the class change?
GuardWithTest: is this the type we bound?
Target: invoke the target method
- or -
Rebind: lookup new method and rebuild call site
83. Invocation example
CallSite: where the call is taking place
SwitchPoint: did the class change?
GuardWithTest: is this the type we bound?
Target: invoke the target method
- or -
Rebind: lookup new method and rebuild call site
- or -
Rebind: lookup potentially changed methods
87. Contrived Ruby code
def foo; 1; end
def invoker; foo; end
i = 0
while i < 10000
invoker
i+=1
end
88. 0x00000001060a1be0: mov %eax,-0x14000(%rsp)
0x00000001060a1be7: push %rbp
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
89. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Stack juggling
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
90. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Is “self” a Ruby object?
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
91. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Same metaclass as before?
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
92. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Store Fixnum “1” for return
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
93. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Note: inside the “foo” method
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
94. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Stack juggling
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
95. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Safe point check
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
96. 0x00000001060a1be0: mov
0x00000001060a1be7: push
%eax,-0x14000(%rsp)
%rbp
Done!
0x00000001060a1be8: sub $0x30,%rsp ;*synchronization entry
; - ruby.__dash_e__::method__1$RUBY$invoker@-1 (line 1)
0x00000001060a1bec: mov 0x8(%rcx),%r10d ; implicit exception: dispatches to 0x00000001060a1c55
0x00000001060a1bf0: cmp $0xfb7aedc9,%r10d ; {oop('org/jruby/RubyObject')}
0x00000001060a1bf7: jne 0x00000001060a1c39
0x00000001060a1bf9: mov %rcx,%r10 ;*checkcast
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@2 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1bfc: mov 0x10(%r10),%ebp ;*getfield metaClass
; - org.jruby.RubyBasicObject::getMetaClass@1 (line 520)
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@5 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c00: cmp $0xfed77602,%ebp ; {oop(a 'org/jruby/MetaClass')}
0x00000001060a1c06: jne 0x00000001060a1c1e ;*if_acmpne
; - org.jruby.runtime.invokedynamic.InvocationLinker::testMetaclass@8 (line 633)
; - java.lang.invoke.MethodHandle::invokeExact@3
; - java.lang.invoke.MethodHandle::invokeExact@5
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
0x00000001060a1c08: movabs $0x7f6bf4bb0,%rax ;*areturn
; - ruby.__dash_e__::method__0$RUBY$foo@6 (line 1)
; - java.lang.invoke.MethodHandle::invokeExact@6
; - java.lang.invoke.MethodHandle::invokeExact@31
; - java.lang.invoke.MethodHandle::invokeExact@29
; - ruby.__dash_e__::method__1$RUBY$invoker@3 (line 1)
; {oop(a 'org/jruby/RubyFixnum')}
0x00000001060a1c12: add $0x30,%rsp
0x00000001060a1c16: pop %rbp
0x00000001060a1c17: test %eax,-0xec3c1d(%rip) # 0x00000001051de000
; {poll_return}
0x00000001060a1c1d: retq
101. Twitter:
@bascule
Celluloid:
celluloid.io
Blog:
unlimitednovelty.com