eval4j: a JVM bytecode interpreter written in Java, used to implement "Evaluate Expression" functionality in debuggers for JVM Languages
Video: http://medianetwork.oracle.com/video/player/3731152022001
6. Working Horse: Bare JDI
• Access Variables
• Access Fields
• Call Methods
• No Evaluate Expression
out-of-the-box
7. How it’s done for Java
• IntelliJ has an intepreter for Java expressions
– written from scratch
– yet another definition of semantics
– may disagree with the compiler’s semantics
• Well, IntelliJ’s not very intimate with javac
8. When you have your own compiler?
• Eclipse Java DT still has an interpreter
• Scala IDE (Eclipse) — no Evaluate Expression
• Ceylon IDE (Eclipse) — no Evaluate Expression
• There’s some room for improvement…
9. Reuse the Compiler (Take 1)
a + b
.class
file
Debugee
process
compile
load
run
13. Challenge: Lambdas/Anonymous
Classes
• Not supported for Java/Scala
• Problems:
– New class that is not available in the debugee
process
– That class may access privates that it’s not allowed
to access
16. How Privates Work Normally
• Special synthetic accessor methods
– INVOKESTATIC Foo.access$001()
– can’t insert a new method into the outer class
17. Prepare the methods of the lambda
• Evaluate the body of the method
public Object invoke() {
Object result = null;
Throwable exception = null;
if (exception == null)
return result;
else throw exception;
}
18. What happens to your thread
• You stopped on a bp1
• You evaluated an expression
– Set another bp
– Stopped on it
– Computed something
– Resulmed
– => you are not on bp1 any more
19. Workaround
• Start a special thread
while (true) {
nop();
}
• To stop:
boolean done = false;
while (!done) {
nop();
}
20. Summary
• Prerequisites
– Extract method
– Ability to compile with some tweaks
• Results
– Any expressions/statements
– Lambdas/local classes
• Use it for your language!
– https://github.com/abreslav/eval4j