LARA

Overview of Classfile Constant Pool

Take abstract syntax tree for method type signatures and constants

  • serialize it as a graph

To see it, use

javap -verbose

Cafebabe does most of these things for you

  • can unzip Scala source code to see how

Documentation is in JVM Spec, Class File Format

Example

class Factorial {
    public int fact(int num){
	int num_aux;
	if (num < 1)
	    num_aux = 1 ;
	else 
	    num_aux = num * (this.fact(num-1));
	return num_aux;
    }
}
class Calls {
    public static void main(String[] args) {
	Factorial f = new Factorial();
	System.out.println("Result is: " + f.fact(6));
    }
}

Result of javap -v:

Compiled from "Calls.java"
class Calls extends java.lang.Object
  SourceFile: "Calls.java"
  minor version: 0
  major version: 50
  Constant pool:
const #1 = Method	#14.#23;	//  java/lang/Object."<init>":()V
const #2 = class	#24;	//  Factorial
const #3 = Method	#2.#23;	//  Factorial."<init>":()V
const #4 = Field	#25.#26;	//  java/lang/System.out:Ljava/io/PrintStream;
const #5 = class	#27;	//  java/lang/StringBuilder
const #6 = Method	#5.#23;	//  java/lang/StringBuilder."<init>":()V
const #7 = String	#28;	//  Result is: 
const #8 = Method	#5.#29;	//  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #9 = Method	#2.#30;	//  Factorial.fact:(I)I
const #10 = Method	#5.#31;	//  java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
const #11 = Method	#5.#32;	//  java/lang/StringBuilder.toString:()Ljava/lang/String;
const #12 = Method	#33.#34;	//  java/io/PrintStream.println:(Ljava/lang/String;)V
const #13 = class	#35;	//  Calls
const #14 = class	#36;	//  java/lang/Object
const #15 = Asciz	<init>;
const #16 = Asciz	()V;
const #17 = Asciz	Code;
const #18 = Asciz	LineNumberTable;
const #19 = Asciz	main;
const #20 = Asciz	([Ljava/lang/String;)V;
const #21 = Asciz	SourceFile;
const #22 = Asciz	Calls.java;
const #23 = NameAndType	#15:#16;//  "<init>":()V
const #24 = Asciz	Factorial;
const #25 = class	#37;	//  java/lang/System
const #26 = NameAndType	#38:#39;//  out:Ljava/io/PrintStream;
const #27 = Asciz	java/lang/StringBuilder;
const #28 = Asciz	Result is: ;
const #29 = NameAndType	#40:#41;//  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #30 = NameAndType	#42:#43;//  fact:(I)I
const #31 = NameAndType	#40:#44;//  append:(I)Ljava/lang/StringBuilder;
const #32 = NameAndType	#45:#46;//  toString:()Ljava/lang/String;
const #33 = class	#47;	//  java/io/PrintStream
const #34 = NameAndType	#48:#49;//  println:(Ljava/lang/String;)V
const #35 = Asciz	Calls;
const #36 = Asciz	java/lang/Object;
const #37 = Asciz	java/lang/System;
const #38 = Asciz	out;
const #39 = Asciz	Ljava/io/PrintStream;;
const #40 = Asciz	append;
const #41 = Asciz	(Ljava/lang/String;)Ljava/lang/StringBuilder;;
const #42 = Asciz	fact;
const #43 = Asciz	(I)I;
const #44 = Asciz	(I)Ljava/lang/StringBuilder;;
const #45 = Asciz	toString;
const #46 = Asciz	()Ljava/lang/String;;
const #47 = Asciz	java/io/PrintStream;
const #48 = Asciz	println;
const #49 = Asciz	(Ljava/lang/String;)V;

{
Calls();
  Code:
   Stack=1, Locals=1, Args_size=1
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return
  LineNumberTable: 
   line 11: 0


public static void main(java.lang.String[]);
  Code:
   Stack=4, Locals=2, Args_size=1
   0:	new	#2; //class Factorial
   3:	dup
   4:	invokespecial	#3; //Method Factorial."<init>":()V
   7:	astore_1
   8:	getstatic	#4; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:	new	#5; //class java/lang/StringBuilder
   14:	dup
   15:	invokespecial	#6; //Method java/lang/StringBuilder."<init>":()V
   18:	ldc	#7; //String Result is: 
   20:	invokevirtual	#8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   23:	aload_1
   24:	bipush	6
   26:	invokevirtual	#9; //Method Factorial.fact:(I)I
   29:	invokevirtual	#10; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   32:	invokevirtual	#11; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   35:	invokevirtual	#12; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   38:	return
  LineNumberTable: 
   line 13: 0
   line 14: 8
   line 15: 38
}