Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pull request #43

Open
wants to merge 24 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
bfe84cc
fixed error on statement 'from ... import ...', TO Do ... remove 'as …
caot Jul 24, 2013
b861ccc
wrong result might happen in old statement
caot Jul 24, 2013
f9a5109
fixed the following case: "try: x except:" reversed to "try: pass ex…
caot Jul 25, 2013
6b22450
call->kw() instead of call->var()
caot Jul 25, 2013
f405ec0
Test case for try: x except: x = None
caot Jul 25, 2013
e158740
Test case for function_call(*self.args, **self.kw)
caot Jul 25, 2013
e9c8e2c
if node type is NODE_CALL, recursive
caot Jul 26, 2013
96dc9ef
fixed eorr in or's such as: if x or y or z:
caot Jul 27, 2013
b601006
Merge branch 'master' of https://github.com/caot/pycdc
caot Jul 27, 2013
35d75dd
refined code only
caot Jul 27, 2013
710d707
remove unwanted 'continue's
caot Aug 4, 2013
5279310
reversed Commit: e9c8e2c2f58cefa0057e97a8f28b82aabdab83d8 [e9c8e2c]
caot Aug 4, 2013
4c8c264
Issue #35, empty stack
caot Aug 19, 2013
5f62422
fixed Signal : SIGSEGV:Segmentation fault)
caot Dec 28, 2013
e5b1a0d
check !blocks.empty()
caot Dec 28, 2013
d951cb7
it skipped LOAD_FAST, LOAD_GLOBAL
caot Dec 29, 2013
55dac6a
fixed for ...: try ... except: pass, "except: pass" was ignored
caot Dec 29, 2013
57ef52e
byte array to double. TO FIX ... precision lost
caot Dec 30, 2013
459fb93
separate print from fuction bc_disasm(...
caot Dec 31, 2013
ba8207e
fixed error with "for ... if pass elif ... else ..."
caot Dec 31, 2013
b7efa52
curblock->size()
caot Jan 4, 2014
d4748e3
boolean operation
caot Jan 4, 2014
3fdde80
boolean expression
caot Jan 6, 2014
5e8a3aa
check if (nodes.size() > 0)
caot Jan 6, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
156 changes: 117 additions & 39 deletions ASTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
int unpack = 0;
bool else_pop = false;
bool need_try = false;
bool is_disasm = false;

while (!source.atEof()) {
#if defined(BLOCK_DEBUG) || defined(STACK_DEBUG)
Expand All @@ -54,7 +55,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
#endif

curpos = pos;
bc_next(source, mod, opcode, operand, pos);
bc_next(source, code, mod, opcode, operand, pos, is_disasm);

if (need_try && opcode != Pyc::SETUP_EXCEPT_A) {
need_try = false;
Expand Down Expand Up @@ -640,7 +641,9 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
if (curblock->size() != 0) {
blocks.top()->append(curblock.cast<ASTNode>());
}
curblock = blocks.top();

if (!blocks.empty())
curblock = blocks.top();

if (curblock->end() != pos || curblock.cast<ASTContainerBlock>()->hasFinally()) {
PycRef<ASTBlock> elseblk = new ASTBlock(ASTBlock::BLK_ELSE, prev->end());
Expand Down Expand Up @@ -950,15 +953,17 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
stack_hist.push(s_top);
}

if (curblock->end() == offs
|| (curblock->end() == curpos && !top->negative())) {
if ((curblock->end() == offs || curblock->end() == curpos)
&& !top->negative()) {
/* if blah and blah */
newcond = new ASTBinary(cond1, cond, ASTBinary::BIN_LOG_AND);
} else {
/* if blah or blah */
newcond = new ASTBinary(cond1, cond, ASTBinary::BIN_LOG_OR);
}
ifblk = new ASTCondBlock(top->blktype(), offs, newcond, neg);
} else if ( curblock->blktype() == ASTBlock::BLK_FOR && curblock->size() == 1) {
ifblk = new ASTCondBlock(ASTBlock::BLK_ELIF, offs, cond, neg);
} else {
/* Plain old if statement */
ifblk = new ASTCondBlock(ASTBlock::BLK_IF, offs, cond, neg);
Expand Down Expand Up @@ -986,33 +991,42 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)

blocks.pop();
curblock = blocks.top();
} if (curblock->blktype() == ASTBlock::BLK_ELSE) {
stack = stack_hist.top();
stack_hist.pop();
}

blocks.pop();
blocks.top()->append(curblock.cast<ASTNode>());
curblock = blocks.top();
if (curblock->blktype() == ASTBlock::BLK_CONTAINER ||
curblock->blktype() == ASTBlock::BLK_EXCEPT) {
; //pass
} else {
if (curblock->blktype() == ASTBlock::BLK_ELSE) {
stack = stack_hist.top();
stack_hist.pop();

if (curblock->blktype() == ASTBlock::BLK_CONTAINER
&& !curblock.cast<ASTContainerBlock>()->hasFinally()) {
blocks.pop();
blocks.top()->append(curblock.cast<ASTNode>());
curblock = blocks.top();

if (curblock->blktype() == ASTBlock::BLK_CONTAINER
&& !curblock.cast<ASTContainerBlock>()->hasFinally()) {
blocks.pop();
blocks.top()->append(curblock.cast<ASTNode>());
curblock = blocks.top();
}
} else {
curblock->append(new ASTKeyword(ASTKeyword::KW_CONTINUE));
}
} else {
curblock->append(new ASTKeyword(ASTKeyword::KW_CONTINUE));
}

/* We're in a loop, this jumps back to the start */
/* I think we'll just ignore this case... */
break; // Bad idea? Probably!
/* We're in a loop, this jumps back to the start */
/* I think we'll just ignore this case... */
break; // Bad idea? Probably!
}
}

if (curblock->blktype() == ASTBlock::BLK_CONTAINER) {
PycRef<ASTContainerBlock> cont = curblock.cast<ASTContainerBlock>();
if (cont->hasExcept() && pos < cont->except()) {
PycRef<ASTBlock> except = new ASTCondBlock(ASTBlock::BLK_EXCEPT, 0, Node_NULL, false);
if (cont->hasExcept()) {
stack_hist.push(stack);
curblock->setEnd(pos+operand);
PycRef<ASTBlock> except = new ASTCondBlock(ASTBlock::BLK_EXCEPT, pos+operand, Node_NULL, false);
except->init();
blocks.push(except);
curblock = blocks.top();
Expand Down Expand Up @@ -1068,6 +1082,10 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
} while (prev != nil);

curblock = blocks.top();

if (curblock->blktype() == ASTBlock::BLK_EXCEPT) {
curblock->setEnd(pos+operand);
}
}
break;
case Pyc::JUMP_FORWARD_A:
Expand Down Expand Up @@ -1107,7 +1125,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
bool push = true;

do {
blocks.pop();
if (!blocks.empty())
blocks.pop();

if (!blocks.empty())
blocks.top()->append(prev.cast<ASTNode>());
Expand Down Expand Up @@ -1183,7 +1202,8 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)

} while (prev != nil);

curblock = blocks.top();
if (!blocks.empty())
curblock = blocks.top();

if (curblock->blktype() == ASTBlock::BLK_EXCEPT) {
curblock->setEnd(pos+operand);
Expand Down Expand Up @@ -1250,7 +1270,34 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
stack.push(new ASTNode(ASTNode::NODE_LOCALS));
break;
case Pyc::LOAD_NAME_A:
stack.push(new ASTName(code->getName(operand)));
{
stack.push(new ASTName(code->getName(operand)));

ASTBlock::BlkType type = curblock->blktype();
int end = curblock->end();

if (type == ASTBlock::BLK_IF && end == pos) {
PycRef<ASTNode> newcond;
PycRef<ASTNode> cond = stack.top();

PycRef<ASTCondBlock> top = curblock.cast<ASTCondBlock>();
PycRef<ASTNode> cond1 = top->cond();

if (!top->negative()) {
newcond = new ASTBinary(cond1, cond, ASTBinary::BIN_LOG_AND);
} else {
newcond = new ASTBinary(cond1, cond, ASTBinary::BIN_LOG_OR);
}

curblock->append(newcond);

PycRef<ASTNode> curblockfront = curblock->nodes().front();
stack.push(curblockfront);

PycRef<ASTBlock> btop = blocks.top();
btop->removeLast();
};
}
break;
case Pyc::MAKE_CLOSURE_A:
case Pyc::MAKE_FUNCTION_A:
Expand Down Expand Up @@ -1291,8 +1338,10 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
|| curblock->blktype() == ASTBlock::BLK_TRY
|| curblock->blktype() == ASTBlock::BLK_EXCEPT
|| curblock->blktype() == ASTBlock::BLK_FINALLY) {
stack = stack_hist.top();
stack_hist.pop();
if (!stack_hist.empty()) {
stack = stack_hist.top();
stack_hist.pop();
}
}

tmp = curblock;
Expand Down Expand Up @@ -1376,14 +1425,15 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
break;
} else if (value->type() == ASTNode::NODE_INVALID
|| value->type() == ASTNode::NODE_BINARY
|| value->type() == ASTNode::NODE_NAME) {
) {
break;
} else if (value->type() == ASTNode::NODE_COMPARE
&& value.cast<ASTCompare>()->op() == ASTCompare::CMP_EXCEPTION) {
break;
}

curblock->append(value);
if (value->type() != ASTNode::NODE_OBJECT)
curblock->append(value);

if (curblock->blktype() == ASTBlock::BLK_FOR
&& curblock.cast<ASTIterBlock>()->isComprehension()) {
Expand Down Expand Up @@ -1437,10 +1487,12 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)

PycRef<ASTBlock> prev = curblock;
blocks.pop();
curblock = blocks.top();
curblock->append(prev.cast<ASTNode>());
if (!blocks.empty()) {
curblock = blocks.top();
curblock->append(prev.cast<ASTNode>());
}

bc_next(source, mod, opcode, operand, pos);
bc_next(source, code, mod, opcode, operand, pos, is_disasm);
}
}
break;
Expand All @@ -1461,8 +1513,6 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
blocks.pop();
curblock = blocks.top();
curblock->append(prev.cast<ASTNode>());

bc_next(source, mod, opcode, operand, pos);
}
}
break;
Expand Down Expand Up @@ -1746,6 +1796,9 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
&& !curblock->inited()) {
curblock.cast<ASTWithBlock>()->setExpr(value);
curblock.cast<ASTWithBlock>()->setVar(name);
} else if (stack.top()->type() == ASTNode::NODE_IMPORT) {
PycRef<ASTImport> import = stack.top().cast<ASTImport>();
import->add_store(new ASTStore(value, name));
} else {
curblock->append(new ASTStore(value, name));
}
Expand Down Expand Up @@ -1785,7 +1838,13 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
} else {
PycRef<ASTNode> value = stack.top();
stack.pop();
curblock->append(new ASTStore(value, name));

if (name.cast<ASTName>()->name() == value.cast<ASTName>()->name()) {
PycRef<ASTImport> import = stack.top().cast<ASTImport>();
import->add_store(new ASTStore(value, name));
} else {
curblock->append(new ASTStore(value, name));
}
}

/* Mark the global as used */
Expand Down Expand Up @@ -1846,6 +1905,16 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
curblock.cast<ASTWithBlock>()->setExpr(value);
curblock.cast<ASTWithBlock>()->setVar(name);
} else {
ASTBlock::list_t nodes = curblock->nodes();
if (nodes.size() > 0) {
PycRef<ASTNode> b = nodes.back().cast<ASTNode>();
int type = b->type();

if (type == ASTNode::NODE_BLOCK) {
curblock->removeLast();
}
}

curblock->append(new ASTStore(value, name));

if (value->type() == ASTNode::NODE_INVALID)
Expand Down Expand Up @@ -2145,6 +2214,11 @@ static void print_block(PycRef<ASTBlock> blk, PycModule* mod) {
}

for (ASTBlock::list_t::const_iterator ln = lines.begin(); ln != lines.end();) {
if ((*ln).cast<ASTNode>()->type() == ASTNode::NODE_KEYWORD) {
++ln;
continue;
}

if ((*ln).cast<ASTNode>()->type() != ASTNode::NODE_NODELIST) {
start_line(cur_indent);
}
Expand Down Expand Up @@ -2210,7 +2284,7 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
if (!first)
fprintf(pyc_output, ", ");
fprintf(pyc_output, "**");
print_src(call->var(), mod);
print_src(call->kw(), mod);
first = false;
}
fprintf(pyc_output, ")");
Expand Down Expand Up @@ -2308,9 +2382,7 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
cur_indent++;
ASTNodeList::list_t lines = node.cast<ASTNodeList>()->nodes();
for (ASTNodeList::list_t::const_iterator ln = lines.begin(); ln != lines.end(); ++ln) {
if ((*ln).cast<ASTNode>()->type() != ASTNode::NODE_NODELIST) {
start_line(cur_indent);
}
start_line(cur_indent);
print_src(*ln, mod);
end_line();
}
Expand Down Expand Up @@ -2360,6 +2432,8 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
fprintf(pyc_output, " as ");
print_src(var, mod);
}
} else if (blk->blktype() == ASTBlock::BLK_MAIN) {
break;
}
fprintf(pyc_output, ":\n");

Expand Down Expand Up @@ -2469,7 +2543,9 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
if (stores.size() == 1) {
print_src((*ii)->src(), mod);

if ((*ii)->src().cast<ASTName>()->name()->value() != (*ii)->dest().cast<ASTName>()->name()->value()) {
std::string s1 = (*ii)->src().cast<ASTName>()->name()->value();
std::string s2 = (*ii)->dest().cast<ASTName>()->name()->value();
if (s1 != s2) {
fprintf(pyc_output, " as ");
print_src((*ii)->dest(), mod);
}
Expand All @@ -2481,7 +2557,9 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
print_src((*ii)->src(), mod);
first = false;

if ((*ii)->src().cast<ASTName>()->name()->value() != (*ii)->dest().cast<ASTName>()->name()->value()) {
std::string s1 = (*ii)->src().cast<ASTName>()->name()->value();
std::string s2 = (*ii)->dest().cast<ASTName>()->name()->value();
if (s1 != s2) {
fprintf(pyc_output, " as ");
print_src((*ii)->dest(), mod);
}
Expand Down
Loading