sync with dc5d2b9
This commit is contained in:
114
ASTree.cpp
114
ASTree.cpp
@@ -607,6 +607,32 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
stack.push(call);
|
||||
}
|
||||
break;
|
||||
// BEGIN ONESHOT TEMPORARY PATCH
|
||||
case Pyc::CALL_FUNCTION_EX_A:
|
||||
{
|
||||
PycRef<ASTNode> kw;
|
||||
if (operand & 0x01)
|
||||
{
|
||||
kw = stack.top();
|
||||
stack.pop();
|
||||
}
|
||||
PycRef<ASTNode> var = stack.top();
|
||||
stack.pop();
|
||||
PycRef<ASTNode> func = stack.top();
|
||||
stack.pop();
|
||||
if (stack.top() == nullptr)
|
||||
{
|
||||
stack.pop();
|
||||
}
|
||||
|
||||
PycRef<ASTNode> call = new ASTCall(func, ASTCall::pparam_t(), ASTCall::kwparam_t());
|
||||
if (operand & 0x01)
|
||||
call.cast<ASTCall>()->setKW(kw);
|
||||
call.cast<ASTCall>()->setVar(var);
|
||||
stack.push(call);
|
||||
}
|
||||
break;
|
||||
// END ONESHOT PATCH
|
||||
case Pyc::CALL_METHOD_A:
|
||||
{
|
||||
ASTCall::pparam_t pparamList;
|
||||
@@ -1307,6 +1333,19 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
bool push = true;
|
||||
|
||||
do {
|
||||
// BEGIN ONESHOT TEMPORARY PATCH
|
||||
// This implementation is probably wrong
|
||||
// Skip junk code on top level scope
|
||||
auto &top = blocks.top();
|
||||
if (top == defblock) {
|
||||
pos += offs;
|
||||
for (int i = 0; i < offs; i++) {
|
||||
source.getByte();
|
||||
}
|
||||
break;
|
||||
}
|
||||
// END ONESHOT PATCH
|
||||
|
||||
blocks.pop();
|
||||
|
||||
if (!blocks.empty())
|
||||
@@ -1374,7 +1413,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
blocks.push(except);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "Something TERRIBLE happened!!\n");
|
||||
fprintf(stderr, "Something TERRIBLE happened!! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
}
|
||||
prev = nil;
|
||||
} else {
|
||||
@@ -1606,7 +1646,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
stack = stack_hist.top();
|
||||
stack_hist.pop();
|
||||
} else {
|
||||
fprintf(stderr, "Warning: Stack history is empty, something wrong might have happened\n");
|
||||
fprintf(stderr, "Warning: Stack history is empty, something wrong might have happened at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
}
|
||||
}
|
||||
PycRef<ASTBlock> tmp = curblock;
|
||||
@@ -1890,7 +1931,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
stack.pop();
|
||||
|
||||
if (none != NULL) {
|
||||
fprintf(stderr, "Something TERRIBLE happened!\n");
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1998,7 +2040,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(attr);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2033,7 +2076,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(name);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2073,7 +2117,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(name);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2132,7 +2177,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(name);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2174,7 +2220,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(name);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2295,7 +2342,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
if (tup.type() == ASTNode::NODE_TUPLE)
|
||||
tup.cast<ASTTuple>()->add(save);
|
||||
else
|
||||
fputs("Something TERRIBLE happened!\n", stderr);
|
||||
fprintf(stderr, "Something TERRIBLE happened! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
if (--unpack <= 0) {
|
||||
stack.pop();
|
||||
@@ -2473,8 +2521,42 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
stack.push(next_tup);
|
||||
}
|
||||
break;
|
||||
// BEGIN ONESHOT TEMPORARY PATCH
|
||||
// These opcodes are not implemented
|
||||
case Pyc::COPY_A:
|
||||
{
|
||||
FastStack tmp_stack(20);
|
||||
for (int i = 0; i < operand - 1; i++) {
|
||||
tmp_stack.push(stack.top());
|
||||
stack.pop();
|
||||
}
|
||||
auto value = stack.top();
|
||||
for (int i = 0; i < operand - 1; i++) {
|
||||
stack.push(tmp_stack.top());
|
||||
tmp_stack.pop();
|
||||
}
|
||||
stack.push(value);
|
||||
}
|
||||
case Pyc::PUSH_EXC_INFO:
|
||||
{
|
||||
stack.push(stack.top());
|
||||
}
|
||||
case Pyc::JUMP_IF_NOT_EXC_MATCH_A:
|
||||
{
|
||||
PycRef<ASTNode> ex_type = stack.top();
|
||||
stack.pop();
|
||||
PycRef<ASTNode> cur_ex = stack.top();
|
||||
stack.pop();
|
||||
}
|
||||
case Pyc::RERAISE:
|
||||
case Pyc::RERAISE_A:
|
||||
break;
|
||||
// END ONESHOT PATCH
|
||||
default:
|
||||
fprintf(stderr, "Unsupported opcode: %s (%d)\n", Pyc::OpcodeName(opcode), opcode);
|
||||
fprintf(stderr, "Unsupported opcode: %s (%d) at %s\n",
|
||||
Pyc::OpcodeName(opcode),
|
||||
opcode,
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
cleanBuild = false;
|
||||
return new ASTNodeList(defblock->nodes());
|
||||
}
|
||||
@@ -2486,7 +2568,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
}
|
||||
|
||||
if (stack_hist.size()) {
|
||||
fputs("Warning: Stack history is not empty!\n", stderr);
|
||||
fprintf(stderr, "Warning: Stack history is not empty! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
while (stack_hist.size()) {
|
||||
stack_hist.pop();
|
||||
@@ -2494,7 +2577,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
||||
}
|
||||
|
||||
if (blocks.size() > 1) {
|
||||
fputs("Warning: block stack is not empty!\n", stderr);
|
||||
fprintf(stderr, "Warning: block stack is not empty! at %s\n",
|
||||
mod->verCompare(3, 11) >= 0 ? code->qualName()->value() : code->name()->value());
|
||||
|
||||
while (blocks.size() > 1) {
|
||||
PycRef<ASTBlock> tmp = blocks.top();
|
||||
@@ -2898,6 +2982,12 @@ void print_src(PycRef<ASTNode> node, PycModule* mod, std::ostream& pyc_output)
|
||||
case ASTNode::NODE_BLOCK:
|
||||
{
|
||||
PycRef<ASTBlock> blk = node.cast<ASTBlock>();
|
||||
|
||||
// BEGIN ONESHOT TEMPORARY PATCH
|
||||
if (blk->blktype() == ASTBlock::BLK_MAIN)
|
||||
break;
|
||||
// END ONESHOT PATCH
|
||||
|
||||
if (blk->blktype() == ASTBlock::BLK_ELSE && blk->size() == 0)
|
||||
break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user