Boolean stack implementation #18
@@ -342,10 +342,52 @@ contract Push3Interpreter {
|
|||||||
// do nothing
|
// do nothing
|
||||||
}
|
}
|
||||||
else if (uint8(op) <= OPCODE_INTEGER_OFFSET) {
|
else if (uint8(op) <= OPCODE_INTEGER_OFFSET) {
|
||||||
(intTop, intStack) = execIntOpCode(intTop, intStack, op);
|
// INTEGER OPCODES
|
||||||
|
if (op == OpCode.INTEGER_PLUS) {
|
||||||
|
// pop top 2 => sum
|
||||||
|
if (intTop >= 2) {
|
||||||
|
int256 a = intStack[intTop - 1];
|
||||||
|
int256 b = intStack[intTop - 2];
|
||||||
|
intTop -= 2;
|
||||||
|
intStack[intTop] = b + a;
|
||||||
|
intTop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OpCode.INTEGER_MINUS) {
|
||||||
|
// pop top 2 => minus
|
||||||
|
if (intTop >= 2) {
|
||||||
|
int256 a = intStack[intTop - 1];
|
||||||
|
int256 b = intStack[intTop - 2];
|
||||||
|
intTop -= 2;
|
||||||
|
intStack[intTop] = b - a;
|
||||||
|
intTop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OpCode.INTEGER_MULT) {
|
||||||
|
// pop top 2 => minus
|
||||||
|
if (intTop >= 2) {
|
||||||
|
int256 a = intStack[intTop - 1];
|
||||||
|
int256 b = intStack[intTop - 2];
|
||||||
|
intTop -= 2;
|
||||||
|
intStack[intTop] = b * a;
|
||||||
|
intTop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OpCode.INTEGER_DUP) {
|
||||||
|
if (intTop >= 1) {
|
||||||
|
int256 a = intStack[intTop - 1];
|
||||||
|
intStack[intTop] = a;
|
||||||
|
intTop++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (op == OpCode.INTEGER_POP) {
|
||||||
|
if (intTop >= 1) {
|
||||||
|
intTop -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (uint8(op) <= OPCODE_BOOL_OFFSET) {
|
else if (uint8(op) <= OPCODE_BOOL_OFFSET) {
|
||||||
(boolTop, boolStack) = execBoolOpCode(boolTop, boolStack, op);
|
// BOOL OPCODES
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (tag == CodeTag.INT_LITERAL) {
|
else if (tag == CodeTag.INT_LITERAL) {
|
||||||
@@ -392,50 +434,4 @@ contract Push3Interpreter {
|
|||||||
finalIntStack[i] = intStack[i];
|
finalIntStack[i] = intStack[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function execIntOpCode(uint256 intTop, int256[] memory intStack, OpCode op) internal returns (uint256, int256[] memory) {
|
|
||||||
if (op == OpCode.INTEGER_PLUS) {
|
|
||||||
// pop top 2 => sum
|
|
||||||
if (intTop >= 2) {
|
|
||||||
int256 a = intStack[intTop - 1];
|
|
||||||
int256 b = intStack[intTop - 2];
|
|
||||||
intTop -= 2;
|
|
||||||
intStack[intTop] = b + a;
|
|
||||||
intTop++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (op == OpCode.INTEGER_MINUS) {
|
|
||||||
// pop top 2 => minus
|
|
||||||
if (intTop >= 2) {
|
|
||||||
int256 a = intStack[intTop - 1];
|
|
||||||
int256 b = intStack[intTop - 2];
|
|
||||||
intTop -= 2;
|
|
||||||
intStack[intTop] = b - a;
|
|
||||||
intTop++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (op == OpCode.INTEGER_MULT) {
|
|
||||||
// pop top 2 => minus
|
|
||||||
if (intTop >= 2) {
|
|
||||||
int256 a = intStack[intTop - 1];
|
|
||||||
int256 b = intStack[intTop - 2];
|
|
||||||
intTop -= 2;
|
|
||||||
intStack[intTop] = b * a;
|
|
||||||
intTop++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (op == OpCode.INTEGER_DUP) {
|
|
||||||
if (intTop >= 1) {
|
|
||||||
int256 a = intStack[intTop - 1];
|
|
||||||
intStack[intTop] = a;
|
|
||||||
intTop++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (op == OpCode.INTEGER_POP) {
|
|
||||||
if (intTop >= 1) {
|
|
||||||
intTop -= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (intTop, intStack);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user