< prev index next >
src/jdk/nashorn/internal/codegen/LocalVariableTypesCalculator.java
Print this page
*** 129,139 ****
}
private enum LvarType {
UNDEFINED(Type.UNDEFINED),
BOOLEAN(Type.BOOLEAN),
INT(Type.INT),
- LONG(Type.LONG),
DOUBLE(Type.NUMBER),
OBJECT(Type.OBJECT);
private final Type type;
private final TypeHolderExpression typeExpression;
--- 129,138 ----
*** 270,320 ****
symbol.setHasSlotFor(type.type);
}
}
private static class SymbolConversions {
! private static byte I2L = 1 << 0;
! private static byte I2D = 1 << 1;
! private static byte I2O = 1 << 2;
! private static byte L2D = 1 << 3;
! private static byte L2O = 1 << 4;
! private static byte D2O = 1 << 5;
private byte conversions;
void recordConversion(final LvarType from, final LvarType to) {
switch (from) {
case UNDEFINED:
return;
case INT:
case BOOLEAN:
switch (to) {
- case LONG:
- recordConversion(I2L);
- return;
case DOUBLE:
recordConversion(I2D);
return;
case OBJECT:
recordConversion(I2O);
return;
default:
illegalConversion(from, to);
return;
}
- case LONG:
- switch (to) {
- case DOUBLE:
- recordConversion(L2D);
- return;
- case OBJECT:
- recordConversion(L2O);
- return;
- default:
- illegalConversion(from, to);
- return;
- }
case DOUBLE:
if(to == LvarType.OBJECT) {
recordConversion(D2O);
}
return;
--- 269,301 ----
symbol.setHasSlotFor(type.type);
}
}
private static class SymbolConversions {
! private static final byte I2D = 1 << 0;
! private static final byte I2O = 1 << 1;
! private static final byte D2O = 1 << 2;
private byte conversions;
void recordConversion(final LvarType from, final LvarType to) {
switch (from) {
case UNDEFINED:
return;
case INT:
case BOOLEAN:
switch (to) {
case DOUBLE:
recordConversion(I2D);
return;
case OBJECT:
recordConversion(I2O);
return;
default:
illegalConversion(from, to);
return;
}
case DOUBLE:
if(to == LvarType.OBJECT) {
recordConversion(D2O);
}
return;
*** 338,367 ****
void calculateTypeLiveness(final Symbol symbol) {
if(symbol.hasSlotFor(Type.OBJECT)) {
if(hasConversion(D2O)) {
symbol.setHasSlotFor(Type.NUMBER);
}
- if(hasConversion(L2O)) {
- symbol.setHasSlotFor(Type.LONG);
- }
if(hasConversion(I2O)) {
symbol.setHasSlotFor(Type.INT);
}
}
if(symbol.hasSlotFor(Type.NUMBER)) {
- if(hasConversion(L2D)) {
- symbol.setHasSlotFor(Type.LONG);
- }
if(hasConversion(I2D)) {
symbol.setHasSlotFor(Type.INT);
}
}
- if(symbol.hasSlotFor(Type.LONG)) {
- if(hasConversion(I2L)) {
- symbol.setHasSlotFor(Type.INT);
- }
- }
}
}
private void symbolIsConverted(final Symbol symbol, final LvarType from, final LvarType to) {
SymbolConversions conversions = symbolConversions.get(symbol);
--- 319,337 ----
*** 376,386 ****
assert type != null;
final LvarType lvarType = TO_LVAR_TYPE.get(type);
if(lvarType != null) {
return lvarType;
}
! assert type.isObject();
return LvarType.OBJECT;
}
private static LvarType widestLvarType(final LvarType t1, final LvarType t2) {
if(t1 == t2) {
return t1;
--- 346,356 ----
assert type != null;
final LvarType lvarType = TO_LVAR_TYPE.get(type);
if(lvarType != null) {
return lvarType;
}
! assert type.isObject() : "Unsupported primitive type: " + type;
return LvarType.OBJECT;
}
private static LvarType widestLvarType(final LvarType t1, final LvarType t2) {
if(t1 == t2) {
return t1;
< prev index next >