Add basic support for some Instrumented opcodes which should match their
non-instrumented versions.
This commit is contained in:
23
ASTree.cpp
23
ASTree.cpp
@@ -418,6 +418,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
break;
|
break;
|
||||||
case Pyc::CALL_A:
|
case Pyc::CALL_A:
|
||||||
case Pyc::CALL_FUNCTION_A:
|
case Pyc::CALL_FUNCTION_A:
|
||||||
|
case Pyc::INSTRUMENTED_CALL_A:
|
||||||
{
|
{
|
||||||
int kwparams = (operand & 0xFF00) >> 8;
|
int kwparams = (operand & 0xFF00) >> 8;
|
||||||
int pparams = (operand & 0xFF);
|
int pparams = (operand & 0xFF);
|
||||||
@@ -508,8 +509,10 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
PycRef<ASTNode> func = stack.top();
|
PycRef<ASTNode> func = stack.top();
|
||||||
stack.pop();
|
stack.pop();
|
||||||
if (opcode == Pyc::CALL_A && stack.top() == nullptr)
|
if ((opcode == Pyc::CALL_A || opcode == Pyc::INSTRUMENTED_CALL_A) &&
|
||||||
|
stack.top() == nullptr) {
|
||||||
stack.pop();
|
stack.pop();
|
||||||
|
}
|
||||||
|
|
||||||
stack.push(new ASTCall(func, pparamList, kwparamList));
|
stack.push(new ASTCall(func, pparamList, kwparamList));
|
||||||
}
|
}
|
||||||
@@ -880,6 +883,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pyc::FOR_ITER_A:
|
case Pyc::FOR_ITER_A:
|
||||||
|
case Pyc::INSTRUMENTED_FOR_ITER_A:
|
||||||
{
|
{
|
||||||
PycRef<ASTNode> iter = stack.top(); // Iterable
|
PycRef<ASTNode> iter = stack.top(); // Iterable
|
||||||
stack.pop();
|
stack.pop();
|
||||||
@@ -1040,6 +1044,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
case Pyc::POP_JUMP_IF_TRUE_A:
|
case Pyc::POP_JUMP_IF_TRUE_A:
|
||||||
case Pyc::POP_JUMP_FORWARD_IF_FALSE_A:
|
case Pyc::POP_JUMP_FORWARD_IF_FALSE_A:
|
||||||
case Pyc::POP_JUMP_FORWARD_IF_TRUE_A:
|
case Pyc::POP_JUMP_FORWARD_IF_TRUE_A:
|
||||||
|
case Pyc::INSTRUMENTED_POP_JUMP_IF_FALSE_A:
|
||||||
|
case Pyc::INSTRUMENTED_POP_JUMP_IF_TRUE_A:
|
||||||
{
|
{
|
||||||
PycRef<ASTNode> cond = stack.top();
|
PycRef<ASTNode> cond = stack.top();
|
||||||
PycRef<ASTCondBlock> ifblk;
|
PycRef<ASTCondBlock> ifblk;
|
||||||
@@ -1048,7 +1054,9 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
if (opcode == Pyc::POP_JUMP_IF_FALSE_A
|
if (opcode == Pyc::POP_JUMP_IF_FALSE_A
|
||||||
|| opcode == Pyc::POP_JUMP_IF_TRUE_A
|
|| opcode == Pyc::POP_JUMP_IF_TRUE_A
|
||||||
|| opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A
|
|| opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A
|
||||||
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A) {
|
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A
|
||||||
|
|| opcode == Pyc::INSTRUMENTED_POP_JUMP_IF_FALSE_A
|
||||||
|
|| opcode == Pyc::INSTRUMENTED_POP_JUMP_IF_TRUE_A) {
|
||||||
/* Pop condition before the jump */
|
/* Pop condition before the jump */
|
||||||
stack.pop();
|
stack.pop();
|
||||||
popped = ASTCondBlock::PRE_POPPED;
|
popped = ASTCondBlock::PRE_POPPED;
|
||||||
@@ -1068,12 +1076,14 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
bool neg = opcode == Pyc::JUMP_IF_TRUE_A
|
bool neg = opcode == Pyc::JUMP_IF_TRUE_A
|
||||||
|| opcode == Pyc::JUMP_IF_TRUE_OR_POP_A
|
|| opcode == Pyc::JUMP_IF_TRUE_OR_POP_A
|
||||||
|| opcode == Pyc::POP_JUMP_IF_TRUE_A
|
|| opcode == Pyc::POP_JUMP_IF_TRUE_A
|
||||||
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A;
|
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A
|
||||||
|
|| opcode == Pyc::INSTRUMENTED_POP_JUMP_IF_TRUE_A;
|
||||||
|
|
||||||
int offs = operand;
|
int offs = operand;
|
||||||
if (mod->verCompare(3, 10) >= 0)
|
if (mod->verCompare(3, 10) >= 0)
|
||||||
offs *= sizeof(uint16_t); // // BPO-27129
|
offs *= sizeof(uint16_t); // // BPO-27129
|
||||||
if (opcode == Pyc::JUMP_IF_FALSE_A
|
if (mod->verCompare(3, 12) >= 0
|
||||||
|
|| opcode == Pyc::JUMP_IF_FALSE_A
|
||||||
|| opcode == Pyc::JUMP_IF_TRUE_A
|
|| opcode == Pyc::JUMP_IF_TRUE_A
|
||||||
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A
|
|| opcode == Pyc::POP_JUMP_FORWARD_IF_TRUE_A
|
||||||
|| opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A) {
|
|| opcode == Pyc::POP_JUMP_FORWARD_IF_FALSE_A) {
|
||||||
@@ -1270,6 +1280,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pyc::JUMP_FORWARD_A:
|
case Pyc::JUMP_FORWARD_A:
|
||||||
|
case Pyc::INSTRUMENTED_JUMP_FORWARD_A:
|
||||||
{
|
{
|
||||||
int offs = operand;
|
int offs = operand;
|
||||||
if (mod->verCompare(3, 10) >= 0)
|
if (mod->verCompare(3, 10) >= 0)
|
||||||
@@ -1775,6 +1786,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pyc::RETURN_VALUE:
|
case Pyc::RETURN_VALUE:
|
||||||
|
case Pyc::INSTRUMENTED_RETURN_VALUE_A:
|
||||||
{
|
{
|
||||||
PycRef<ASTNode> value = stack.top();
|
PycRef<ASTNode> value = stack.top();
|
||||||
stack.pop();
|
stack.pop();
|
||||||
@@ -1797,6 +1809,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pyc::RETURN_CONST_A:
|
case Pyc::RETURN_CONST_A:
|
||||||
|
case Pyc::INSTRUMENTED_RETURN_CONST_A:
|
||||||
{
|
{
|
||||||
PycRef<ASTObject> value = new ASTObject(code->getConst(operand));
|
PycRef<ASTObject> value = new ASTObject(code->getConst(operand));
|
||||||
curblock->append(new ASTReturn(value.cast<ASTNode>()));
|
curblock->append(new ASTReturn(value.cast<ASTNode>()));
|
||||||
@@ -2403,6 +2416,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pyc::YIELD_VALUE:
|
case Pyc::YIELD_VALUE:
|
||||||
|
case Pyc::INSTRUMENTED_YIELD_VALUE_A:
|
||||||
{
|
{
|
||||||
PycRef<ASTNode> value = stack.top();
|
PycRef<ASTNode> value = stack.top();
|
||||||
stack.pop();
|
stack.pop();
|
||||||
@@ -2414,6 +2428,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
break;
|
break;
|
||||||
case Pyc::PRECALL_A:
|
case Pyc::PRECALL_A:
|
||||||
case Pyc::RESUME_A:
|
case Pyc::RESUME_A:
|
||||||
|
case Pyc::INSTRUMENTED_RESUME_A:
|
||||||
/* We just entirely ignore this / no-op */
|
/* We just entirely ignore this / no-op */
|
||||||
break;
|
break;
|
||||||
case Pyc::CACHE:
|
case Pyc::CACHE:
|
||||||
|
Reference in New Issue
Block a user