From b3e5024efd7d26dd8adc8f88bbb1fd303a3bf742 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Mon, 27 Jul 2009 03:23:56 +0000 Subject: [PATCH] More common functionality --- ASTree.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/ASTree.cpp b/ASTree.cpp index 5420bb4..348cd59 100644 --- a/ASTree.cpp +++ b/ASTree.cpp @@ -134,6 +134,14 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) stack.push(new ASTImport(new ASTName(code->getName(operand)), fromlist)); } break; + case (PY_2000 | Py2k::IMPORT_STAR): + case (PY_3000 | Py3k::IMPORT_STAR): + { + PycRef import = stack.top(); + stack.pop(); + lines.push_back(new ASTStore(import, Node_NULL)); + } + break; case (PY_1000 | Py1k::LOAD_ATTR): case (PY_2000 | Py2k::LOAD_ATTR): case (PY_3000 | Py3k::LOAD_ATTR): @@ -186,6 +194,16 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) stack.push(new ASTFunction(code, defArgs)); } break; + case (PY_1000 | Py1k::POP_TOP): + case (PY_2000 | Py2k::POP_TOP): + case (PY_3000 | Py3k::POP_TOP): + { + PycRef value = stack.top(); + stack.pop(); + if (value->type() == ASTNode::NODE_CALL) + lines.push_back(value); + } + break; case (PY_1000 | Py1k::RETURN_VALUE): case (PY_2000 | Py2k::RETURN_VALUE): case (PY_3000 | Py3k::RETURN_VALUE): @@ -195,6 +213,18 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) lines.push_back(new ASTReturn(value)); } break; + case (PY_1000 | Py1k::STORE_ATTR): + case (PY_2000 | Py2k::STORE_ATTR): + case (PY_3000 | Py3k::STORE_ATTR): + { + PycRef name = stack.top(); + stack.pop(); + PycRef value = stack.top(); + stack.pop(); + PycRef 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_2000 | Py2k::STORE_NAME): case (PY_3000 | Py3k::STORE_NAME): @@ -205,6 +235,16 @@ PycRef BuildFromCode(PycRef code, PycModule* mod) lines.push_back(new ASTStore(value, name)); } break; + case (PY_1000 | Py1k::STORE_GLOBAL): + case (PY_2000 | Py2k::STORE_GLOBAL): + case (PY_3000 | Py3k::STORE_GLOBAL): + { + PycRef value = stack.top(); + stack.pop(); + PycRef name = new ASTName(code->getName(operand)); + lines.push_back(new ASTStore(value, name)); + } + break; default: if (mod->majorVer() == 1) fprintf(stderr, "Unsupported opcode: %s\n", Py1k::OpcodeNames[opcode & 0xFF]); @@ -326,8 +366,9 @@ void print_src(PycRef node, PycModule* mod, int indent) bool first = true; PycTuple::value_t::const_iterator ii = fromlist->values().begin(); for (; ii != fromlist->values().end(); ++ii) { - if (first) printf(", "); + if (!first) printf(", "); printf("%s", ii->cast()->value()); + first = false; } } else { printf("import "); @@ -384,7 +425,11 @@ void print_src(PycRef node, PycModule* mod, int indent) break; default: fprintf(stderr, "Unsupported Node type: %d\n", node->type()); + cleanBuild = false; + return; } + + cleanBuild = true; } void decompyle(PycRef code, PycModule* mod, int indent) @@ -416,5 +461,11 @@ void decompyle(PycRef code, PycModule* mod, int indent) clean->append(new ASTNode(ASTNode::NODE_PASS)); } + bool part1clean = cleanBuild; print_src(source, mod, indent); + + if (!cleanBuild || !part1clean) { + start_indent(indent); + printf("# WARNING: Decompyle incomplete\n"); + } }