JUDCon 2013:Brazil


invokewat?

@qmx - blog.qmx.me

whoami

dynjs
# disclaimer

JVM

JVM?

Java?

I've got 99 problems

Java ain't one

stack-based

Virtual Machine

1+2 = ?

(+ 1 2)

ZOMG, lisp???

le stack

PUSH 1
  • 1
PUSH 2
  • 1
  • 2
ADD
  • 3

le stack - bytecode

iconst_1
  • 1
iconst_2
  • 1
  • 2
iadd
  • 3

bytecode?

iadd?

integer add

^^^^------

statically typed

1 + 2

is 1 an integer?

NO

					> 1.class
=> Fixnum
					

OO

taken to the next level

1+2

						1.+(2)
					

1+2

						1.send(:+, 2)
					

writing this in Java

						
IRubyObject +(IRubyObject o){}
						
					

syntax error

Java

Y U NO

OPERATOR OVERLOADING

we <3 Java

but

Java (language) is

limited

(and that's ok)

writing this in Java

						
IRubyObject op_plus(IRubyObject o){}
						
					

verbose

1 + 2

						IRubyObject x  = // 1
IRubyObject y = // 2
x.op_plus(y);
					

IRubyObject?

everything is an object

Java

Virtual Machine

requires

ALL THE TYPES

during compilation

do you know

where

methods live?

Object.methods()

classes!

so

{:+ => #<Object:0x007f95329a4510>, ...}

map!

back to Java

let's call it

						IRubyObject x = //;
x.+(); // fails
x.callMethod(context, "+"); // works

					

what's happening here?

steps

  1. gets the object
  2. hash lookup
  3. context lookup
  4. actual invocation
  5. profit?

what if...?

we could teach

the JVM

on how to reach the method instance we want?

what if...?

we could give

the JVM

more hints about the code it runs?

invokedynamic

bytecode

method handles

bootstrap method

target method

MethodHandles

int (*foo)(int)

good ol' pointers

bytecode

bytecode - standard invoke

						INVOKEVIRTUAL #39, #42
					

#39 is method name, #42 is the signature with types

bytecode - invokedynamic

						INVOKEDYNAMIC name, #42, BSM, BSM_SIG
					

Bootstrap Method

returns a CallSite

a CallSite has a

Method Handle

which points to the

TargetMethod

magic?

invokedynamic's

friends

SwitchPoint

case study: Ruby inconstants

making things

simple

bytecode

jitescript

internal DSL for bytecode generation

jitescript

defineMethod("main",..,sig),
new CodeBlock() {{
 ldc("helloWorld");
 getstatic(p(System.class), "out", ci(PrintStream.class));
 swap();
 invokevirtual(p(PrintStream.class), "println", sig(void.class, Object.class));
 voidreturn();
}});

invokebinder

(MethodHandle API for mortals)

going polyglot

MOP

meta object protocol

inter-language

no serialization

dynalink

rephract

why?

future

indify

TL;DR

thanks!

?

thanks!