java 编译器如何在局部变量 table 中分配索引?
How does the java compiler assign index's in the local variables table?
好吧,我正在编写一个编译器,我正在尝试使用局部变量 table 中的信息来计算变量 names/types。
我有以下代码:
public void noob() {
try {
int hello = 0;
short yo = 1;
byte y = 2;
int[] e = new int[9];
System.out.println(y + ", " + hello + ", " + yo+", "+e);
} catch (Exception var6) {
var6.printStackTrace();
}
}
读取变量时 table 我得到以下信息:
LocalVariable{uid=-1, start=0, end=69, nameIndex=30, typeIndex=31, varIndex=0, name='this', typeName='LMain;'}
LocalVariable{uid=-1, start=2, end=60, nameIndex=37, typeIndex=18, varIndex=1, name='hello', typeName='I'}
LocalVariable{uid=-1, start=4, end=60, nameIndex=38, typeIndex=39, varIndex=2, name='yo', typeName='S'}
LocalVariable{uid=-1, start=6, end=60, nameIndex=40, typeIndex=41, varIndex=3, name='y', typeName='B'}
LocalVariable{uid=-1, start=12, end=60, nameIndex=42, typeIndex=43, varIndex=4, name='e', typeName='[I'}
LocalVariable{uid=-1, start=64, end=68, nameIndex=44, typeIndex=45, varIndex=1, name='var6', typeName='Ljava/lang/Exception;'}
(忽略 uid 列)。
我注意到 varIndex 并非对每个变量都是唯一的。为什么 hello (int)
和 var6(Exception)
共享相同的 varIndex?
编译器足够聪明,可以为范围不重叠的变量重用变量槽。因为它们永远不能同时使用,所以没有必要分开存放。
由于hello
和var6
没有重叠,槽位可以重复使用。
好吧,我正在编写一个编译器,我正在尝试使用局部变量 table 中的信息来计算变量 names/types。
我有以下代码:
public void noob() {
try {
int hello = 0;
short yo = 1;
byte y = 2;
int[] e = new int[9];
System.out.println(y + ", " + hello + ", " + yo+", "+e);
} catch (Exception var6) {
var6.printStackTrace();
}
}
读取变量时 table 我得到以下信息:
LocalVariable{uid=-1, start=0, end=69, nameIndex=30, typeIndex=31, varIndex=0, name='this', typeName='LMain;'}
LocalVariable{uid=-1, start=2, end=60, nameIndex=37, typeIndex=18, varIndex=1, name='hello', typeName='I'}
LocalVariable{uid=-1, start=4, end=60, nameIndex=38, typeIndex=39, varIndex=2, name='yo', typeName='S'}
LocalVariable{uid=-1, start=6, end=60, nameIndex=40, typeIndex=41, varIndex=3, name='y', typeName='B'}
LocalVariable{uid=-1, start=12, end=60, nameIndex=42, typeIndex=43, varIndex=4, name='e', typeName='[I'}
LocalVariable{uid=-1, start=64, end=68, nameIndex=44, typeIndex=45, varIndex=1, name='var6', typeName='Ljava/lang/Exception;'}
(忽略 uid 列)。
我注意到 varIndex 并非对每个变量都是唯一的。为什么 hello (int)
和 var6(Exception)
共享相同的 varIndex?
编译器足够聪明,可以为范围不重叠的变量重用变量槽。因为它们永远不能同时使用,所以没有必要分开存放。
由于hello
和var6
没有重叠,槽位可以重复使用。