Keep real type of stack contexts, which I think I need later. Exec test passes, not sure of other implications of this.

This commit is contained in:
Adam
2016-01-30 15:56:36 -05:00
parent 2a3b9158ea
commit cbe45eddfe
20 changed files with 40 additions and 33 deletions

View File

@@ -52,7 +52,7 @@ public class GetField extends Instruction implements GetFieldInstruction
StackContext object = stack.pop();
ins.pop(object);
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType(), Value.NULL);
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()), Value.NULL);
stack.push(ctx);
ins.push(ctx);

View File

@@ -56,7 +56,7 @@ public class GetStatic extends Instruction implements GetFieldInstruction
InstructionContext ins = new InstructionContext(this, frame);
Stack stack = frame.getStack();
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()).toStackType(), Value.NULL);
StackContext ctx = new StackContext(ins, new Type(field.getNameAndType().getDescriptorType()), Value.NULL);
stack.push(ctx);
ins.push(ctx);

View File

@@ -65,7 +65,7 @@ public class IInc extends Instruction implements LVTInstruction, WideInstruction
Variables var = frame.getVariables();
VariableContext vctx = var.get(index);
assert vctx.getType().equals(new Type(int.class.getCanonicalName()));
assert vctx.getType().isInt();
ins.read(vctx);
Value value = vctx.getValue();

View File

@@ -70,7 +70,7 @@ public class ILoad extends Instruction implements LVTInstruction, WideInstructio
Variables variables = frame.getVariables();
VariableContext vctx = variables.get(index);
assert vctx.getType().equals(new Type(int.class.getName()));
assert vctx.getType().isInt();
ins.read(vctx);
StackContext ctx = new StackContext(ins, vctx);

View File

@@ -29,7 +29,7 @@ public class ILoad_0 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
VariableContext vctx = variables.get(0);
assert vctx.getType().equals(new Type(int.class.getName()));
assert vctx.getType().isInt();
ins.read(vctx);
StackContext ctx = new StackContext(ins, vctx);

View File

@@ -29,7 +29,7 @@ public class ILoad_1 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
VariableContext vctx = variables.get(1);
assert vctx.getType().equals(new Type(int.class.getName()));
assert vctx.getType().isInt();
ins.read(vctx);
StackContext ctx = new StackContext(ins, vctx);

View File

@@ -29,7 +29,7 @@ public class ILoad_2 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
VariableContext vctx = variables.get(2);
assert vctx.getType().equals(new Type(int.class.getName()));
assert vctx.getType().isInt();
ins.read(vctx);
StackContext ctx = new StackContext(ins, vctx);

View File

@@ -29,7 +29,7 @@ public class ILoad_3 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
VariableContext vctx = variables.get(3);
assert vctx.getType().equals(new Type(int.class.getName()));
assert vctx.getType().isInt();
ins.read(vctx);
StackContext ctx = new StackContext(ins, vctx);

View File

@@ -55,7 +55,7 @@ public class IStore extends Instruction implements LVTInstruction, WideInstructi
Variables variables = frame.getVariables();
StackContext value = stack.pop();
assert value.getType().equals(new Type(int.class.getName()));
assert value.getType().isInt();
ins.pop(value);
variables.set(index, new VariableContext(ins, value));

View File

@@ -34,7 +34,7 @@ public class IStore_0 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
StackContext value = stack.pop();
assert value.getType().equals(new Type(int.class.getName()));
assert value.getType().isInt();
ins.pop(value);
variables.set(0, new VariableContext(ins, value));

View File

@@ -34,7 +34,7 @@ public class IStore_1 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
StackContext value = stack.pop();
assert value.getType().equals(new Type(int.class.getName()));
assert value.getType().isInt();
ins.pop(value);
variables.set(1, new VariableContext(ins, value));

View File

@@ -34,7 +34,7 @@ public class IStore_2 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
StackContext value = stack.pop();
assert value.getType().equals(new Type(int.class.getName()));
assert value.getType().isInt();
ins.pop(value);
variables.set(2, new VariableContext(ins, value));

View File

@@ -29,7 +29,7 @@ public class IStore_3 extends Instruction implements LVTInstruction
Variables variables = frame.getVariables();
StackContext value = stack.pop();
assert value.getType().equals(new Type(int.class.getName()));
assert value.getType().isInt();
ins.pop(value);
variables.set(3, new VariableContext(ins, value));

View File

@@ -92,7 +92,7 @@ public class InvokeInterface extends Instruction implements InvokeInstruction
if (!method.getNameAndType().isVoid())
{
StackContext ctx = new StackContext(ins,
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
Value.NULL
);
stack.push(ctx);

View File

@@ -77,7 +77,7 @@ public class InvokeSpecial extends Instruction implements InvokeInstruction
if (!method.getNameAndType().isVoid())
{
StackContext ctx = new StackContext(ins,
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
Value.NULL
);
stack.push(ctx);

View File

@@ -87,7 +87,7 @@ public class InvokeStatic extends Instruction implements InvokeInstruction
if (!method.getNameAndType().isVoid())
{
StackContext ctx = new StackContext(ins,
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
Value.NULL
);
stack.push(ctx);

View File

@@ -79,7 +79,7 @@ public class InvokeVirtual extends Instruction implements InvokeInstruction
if (!method.getNameAndType().isVoid())
{
StackContext ctx = new StackContext(ins,
new Type(method.getNameAndType().getDescriptor().getReturnValue()).toStackType(),
new Type(method.getNameAndType().getDescriptor().getReturnValue()),
Value.NULL
);
stack.push(ctx);

View File

@@ -64,7 +64,7 @@ public class Frame
NameAndType nat = method.getNameAndType();
for (int i = 0; i < nat.getNumberOfArgs(); ++i)
{
variables.set(pos, new VariableContext(new Type(nat.getDescriptor().getTypeOfArg(i)).toStackType()).markParameter());
variables.set(pos, new VariableContext(new Type(nat.getDescriptor().getTypeOfArg(i))).markParameter());
pos += nat.getDescriptor().getTypeOfArg(i).getSlots();
}

View File

@@ -17,8 +17,8 @@ public class Type
for (int i = 0; i < t.getArrayDims(); ++i)
type = type + "[]";
}
public Type toStackType()
private Type toStackType()
{
if (type.equals(byte.class.getCanonicalName()) || type.equals(char.class.getCanonicalName()) || type.equals(short.class.getCanonicalName())
|| type.equals(boolean.class.getCanonicalName()))
@@ -26,6 +26,11 @@ public class Type
return this;
}
public boolean isInt()
{
return toStackType().equals(new Type(int.class.getName()));
}
private static String asmTypeToClass(String type)
{
switch (type)