Booleans and Data Representation
Types in programming language:
- specify length of data (how many bits)
- help prevent errors
- enforce program invariants
In assembly and C:
- possible to case integer into a pointer
- enables program to write to random memory locations
Types in JVM
- as in (early version of) Java (sometimes simpler types)
- goal: JVM byte code verifier ensures memory safety
- cannot overwrite memory locations
- can avoid doing certain checks while running JVM
One difference Java vs Byte codes:
- java treats boolean as int
- they are implicitly converted into integers primitive conversions
- and they are implicitly converted back from integers :)
Little support for boolean operations
- intermediate boolean values are often invisible (encoded in program points)
- can manipulate them as integers
Booleans in Bytecode are Fiction
Using cafebabe, our wonderful bytecode generation library, we generate this class:
public boolean test(int, boolean); Code: 0: iload_1 1: iload_2 2: bipush 37 4: iadd 5: iadd 6: ireturn public static void main(java.lang.String[]); Code: 0: getstatic #19; //Field java/lang/System.out:Ljava/io/PrintStream; 3: new #3; //class HW 6: dup 7: invokespecial #20; //Method "<init>":()V * 10: iconst_3 * 11: iconst_2 * 12: invokevirtual #22; //Method test:(IZ)Z 15: invokevirtual #28; //Method java/io/PrintStream.println:(I)V 18: return }
Using
java HW
in Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode), this:
- successfully passes bytecode verifier
- happily returns 'the' answer
Convention on Booleans
We adopt the following convention in code generation for JVM
The generated code will use 'int' to represent boolean values in
- local variables
- parameters
- intermediate stack values (if needed–often not needed)
In such cases, the 'int' variables will always be either
- 0, representing false
- 1, representing true
Other conventions are possible