More common functionality
This commit is contained in:
53
ASTree.cpp
53
ASTree.cpp
@@ -134,6 +134,14 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
stack.push(new ASTImport(new ASTName(code->getName(operand)), fromlist));
|
stack.push(new ASTImport(new ASTName(code->getName(operand)), fromlist));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case (PY_2000 | Py2k::IMPORT_STAR):
|
||||||
|
case (PY_3000 | Py3k::IMPORT_STAR):
|
||||||
|
{
|
||||||
|
PycRef<ASTNode> import = stack.top();
|
||||||
|
stack.pop();
|
||||||
|
lines.push_back(new ASTStore(import, Node_NULL));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case (PY_1000 | Py1k::LOAD_ATTR):
|
case (PY_1000 | Py1k::LOAD_ATTR):
|
||||||
case (PY_2000 | Py2k::LOAD_ATTR):
|
case (PY_2000 | Py2k::LOAD_ATTR):
|
||||||
case (PY_3000 | Py3k::LOAD_ATTR):
|
case (PY_3000 | Py3k::LOAD_ATTR):
|
||||||
@@ -186,6 +194,16 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
stack.push(new ASTFunction(code, defArgs));
|
stack.push(new ASTFunction(code, defArgs));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case (PY_1000 | Py1k::POP_TOP):
|
||||||
|
case (PY_2000 | Py2k::POP_TOP):
|
||||||
|
case (PY_3000 | Py3k::POP_TOP):
|
||||||
|
{
|
||||||
|
PycRef<ASTNode> value = stack.top();
|
||||||
|
stack.pop();
|
||||||
|
if (value->type() == ASTNode::NODE_CALL)
|
||||||
|
lines.push_back(value);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case (PY_1000 | Py1k::RETURN_VALUE):
|
case (PY_1000 | Py1k::RETURN_VALUE):
|
||||||
case (PY_2000 | Py2k::RETURN_VALUE):
|
case (PY_2000 | Py2k::RETURN_VALUE):
|
||||||
case (PY_3000 | Py3k::RETURN_VALUE):
|
case (PY_3000 | Py3k::RETURN_VALUE):
|
||||||
@@ -195,6 +213,18 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
lines.push_back(new ASTReturn(value));
|
lines.push_back(new ASTReturn(value));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case (PY_1000 | Py1k::STORE_ATTR):
|
||||||
|
case (PY_2000 | Py2k::STORE_ATTR):
|
||||||
|
case (PY_3000 | Py3k::STORE_ATTR):
|
||||||
|
{
|
||||||
|
PycRef<ASTNode> name = stack.top();
|
||||||
|
stack.pop();
|
||||||
|
PycRef<ASTNode> value = stack.top();
|
||||||
|
stack.pop();
|
||||||
|
PycRef<ASTNode> attr = new ASTBinary(name, new ASTName(code->getName(operand)), ASTBinary::BIN_ATTR);
|
||||||
|
lines.push_back(new ASTStore(value, attr));
|
||||||
|
}
|
||||||
|
break;
|
||||||
case (PY_1000 | Py1k::STORE_NAME):
|
case (PY_1000 | Py1k::STORE_NAME):
|
||||||
case (PY_2000 | Py2k::STORE_NAME):
|
case (PY_2000 | Py2k::STORE_NAME):
|
||||||
case (PY_3000 | Py3k::STORE_NAME):
|
case (PY_3000 | Py3k::STORE_NAME):
|
||||||
@@ -205,6 +235,16 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|
|||||||
lines.push_back(new ASTStore(value, name));
|
lines.push_back(new ASTStore(value, name));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case (PY_1000 | Py1k::STORE_GLOBAL):
|
||||||
|
case (PY_2000 | Py2k::STORE_GLOBAL):
|
||||||
|
case (PY_3000 | Py3k::STORE_GLOBAL):
|
||||||
|
{
|
||||||
|
PycRef<ASTNode> value = stack.top();
|
||||||
|
stack.pop();
|
||||||
|
PycRef<ASTNode> name = new ASTName(code->getName(operand));
|
||||||
|
lines.push_back(new ASTStore(value, name));
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (mod->majorVer() == 1)
|
if (mod->majorVer() == 1)
|
||||||
fprintf(stderr, "Unsupported opcode: %s\n", Py1k::OpcodeNames[opcode & 0xFF]);
|
fprintf(stderr, "Unsupported opcode: %s\n", Py1k::OpcodeNames[opcode & 0xFF]);
|
||||||
@@ -326,8 +366,9 @@ void print_src(PycRef<ASTNode> node, PycModule* mod, int indent)
|
|||||||
bool first = true;
|
bool first = true;
|
||||||
PycTuple::value_t::const_iterator ii = fromlist->values().begin();
|
PycTuple::value_t::const_iterator ii = fromlist->values().begin();
|
||||||
for (; ii != fromlist->values().end(); ++ii) {
|
for (; ii != fromlist->values().end(); ++ii) {
|
||||||
if (first) printf(", ");
|
if (!first) printf(", ");
|
||||||
printf("%s", ii->cast<PycString>()->value());
|
printf("%s", ii->cast<PycString>()->value());
|
||||||
|
first = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("import ");
|
printf("import ");
|
||||||
@@ -384,7 +425,11 @@ void print_src(PycRef<ASTNode> node, PycModule* mod, int indent)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "Unsupported Node type: %d\n", node->type());
|
fprintf(stderr, "Unsupported Node type: %d\n", node->type());
|
||||||
|
cleanBuild = false;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanBuild = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void decompyle(PycRef<PycCode> code, PycModule* mod, int indent)
|
void decompyle(PycRef<PycCode> code, PycModule* mod, int indent)
|
||||||
@@ -416,5 +461,11 @@ void decompyle(PycRef<PycCode> code, PycModule* mod, int indent)
|
|||||||
clean->append(new ASTNode(ASTNode::NODE_PASS));
|
clean->append(new ASTNode(ASTNode::NODE_PASS));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool part1clean = cleanBuild;
|
||||||
print_src(source, mod, indent);
|
print_src(source, mod, indent);
|
||||||
|
|
||||||
|
if (!cleanBuild || !part1clean) {
|
||||||
|
start_indent(indent);
|
||||||
|
printf("# WARNING: Decompyle incomplete\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user