tags:

views:

158

answers:

2

I am trying to learn java bytecode and I stumbled on this: I compiled this very simple code with the -g option:

public class Test
{
 public static void main(String args[])
 {
  double a = 1.0;
  int b = (int)a;
 }
}

The main code turned out to be:

0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return

In addition, main's maximum local variables is 4, and the LocalVariableTable has only 3 entries (args, a, b). I am curious to know why the compiler reserved 4 local variables while there is clearly only 3, and localvariable[2] is no used. Is there something I'm missing? Thank you

+2  A: 

I don't know Java bytecode, this is just a guess:

Could it have to do with the fact that a is a double? Are two words being reserved for it?

Carl Smotricz
+7  A: 

it is 4 because long and double occupies 2 consecutive entries in the frame. This is clearly specified by the Java JVM specification:

A value of type long or type double occupies two consecutive local variables. Such a value may only be addressed using the lesser index. For example, a value of type double stored in the local variable array at index n actually occupies the local variables with indices n and n +1; however, the local variable at index n +1 cannot be loaded from. It can be stored into. However, doing so invalidates the contents of local variable n.

dfa
Woo hoo, I guessed correctly! :)
Carl Smotricz
Clearly, I was missing something. Thanks!!
HH