@@ -240,7 +240,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
240
240
break ;
241
241
case Pyc::END_FINALLY:
242
242
{
243
- if (curblock->type () == ASTBlock::BLK_FINALLY) {
243
+ if (curblock->blktype () == ASTBlock::BLK_FINALLY) {
244
244
blocks.pop ();
245
245
blocks.top ()->append (curblock.cast <ASTNode>());
246
246
@@ -291,40 +291,59 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
291
291
break ;
292
292
case Pyc::JUMP_IF_FALSE_A:
293
293
{
294
+ stack_hist.push (stack);
295
+ // stack = FastStack(stack_hist.top());
294
296
PycRef<ASTNode> cond = stack.top ();
295
- stack.pop ();
296
- stack.push (new ASTJump (operand, ASTJump::JMP_FALSE, cond));
297
- jumps.push (pos + operand);
298
- startBlock = true ;
297
+ // Do not pop the condition off the stack!
298
+
299
+ PycRef<ASTBlock> ifblk;
300
+
301
+ if (curblock->blktype () == ASTBlock::BLK_ELSE && curblock->size () == 0 ) {
302
+ blocks.pop ();
303
+ ifblk = new ASTCondBlock (ASTBlock::BLK_ELIF, pos+operand, cond, false );
304
+ } else {
305
+ ifblk = new ASTCondBlock (ASTBlock::BLK_IF, pos+operand, cond, false );
306
+ }
307
+ blocks.push (ifblk.cast <ASTBlock>());
308
+ curblock = blocks.top ();
299
309
}
300
310
break ;
301
311
case Pyc::JUMP_IF_TRUE_A:
302
312
{
313
+ stack_hist.push (stack);
314
+ // stack = FastStack(stack_hist.top());
303
315
PycRef<ASTNode> cond = stack.top ();
304
- stack.pop ();
305
- stack.push (new ASTJump (operand, ASTJump::JMP_TRUE, cond));
306
- jumps.push (pos + operand);
307
- startBlock = true ;
316
+ // Do not pop the condition off the stack!
317
+
318
+ PycRef<ASTBlock> ifblk;
319
+
320
+ if (curblock->blktype () == ASTBlock::BLK_ELSE && curblock->size () == 0 ) {
321
+ blocks.pop ();
322
+ ifblk = new ASTCondBlock (ASTBlock::BLK_ELIF, pos+operand, cond, true );
323
+ } else {
324
+ ifblk = new ASTCondBlock (ASTBlock::BLK_IF, pos+operand, cond, true );
325
+ }
326
+ blocks.push (ifblk.cast <ASTBlock>());
327
+ curblock = blocks.top ();
308
328
}
309
329
break ;
310
330
case Pyc::JUMP_FORWARD_A:
311
331
{
312
- stack.push (new ASTJump (operand, ASTJump::JUMP, NULL ));
313
- /* std::stack<int> tmp;
314
- int top = jumps.top();
315
- while (top < pos + operand) {
316
- tmp.push(jumps.top());
317
- jumps.pop();
318
- if (!jumps.size())
319
- break;
320
- top = jumps.top();
321
- }
322
- jumps.push(pos + operand);
323
- while (tmp.size()) {
324
- jumps.push(tmp.top());
325
- tmp.pop();
332
+ // stack = FastStack(stack_hist.top());
333
+ stack_hist.pop ();
334
+
335
+ PycRef<ASTBlock> prev = curblock;
336
+ blocks.pop ();
337
+
338
+ blocks.top ()->append (prev.cast <ASTNode>());
339
+
340
+ if (operand > 1 && (prev->blktype () == ASTBlock::BLK_IF
341
+ || prev->blktype () == ASTBlock::BLK_ELIF))
342
+ {
343
+ PycRef<ASTBlock> next = new ASTBlock (ASTBlock::BLK_ELSE, pos+operand);
344
+ blocks.push (next.cast <ASTBlock>());
326
345
}
327
- startBlock = true; */
346
+ curblock = blocks. top ();
328
347
}
329
348
break ;
330
349
case Pyc::LOAD_ATTR_A:
@@ -374,7 +393,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
374
393
stack.push (new ASTFunction (code, defArgs));
375
394
}
376
395
break ;
377
- case Pyc::POP_BLOCK:
396
+ /* case Pyc::POP_BLOCK:
378
397
{
379
398
PycRef<ASTBlock> tmp = curblock;
380
399
@@ -392,21 +411,15 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
392
411
//todo
393
412
}
394
413
}
395
- break ;
414
+ break;*/
396
415
case Pyc::POP_TOP:
397
416
{
398
417
PycRef<ASTNode> value = stack.top ();
399
418
stack.pop ();
400
- if (value->type () == ASTNode::NODE_CALL || value-> type () == ASTNode::NODE_JUMP ) {
419
+ if (value->type () == ASTNode::NODE_CALL) {
401
420
lines.top ().push_back (value);
402
421
curblock->append (value);
403
422
}
404
-
405
- /* if (startBlock) {
406
- ASTNodeList::list_t blk;
407
- lines.push(blk);
408
- startBlock = false;
409
- }*/
410
423
}
411
424
break ;
412
425
case Pyc::PRINT_ITEM:
@@ -442,7 +455,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
442
455
case Pyc::SET_LINENO_A:
443
456
// Ignore
444
457
break ;
445
- case Pyc::SETUP_EXCEPT_A:
458
+ /* case Pyc::SETUP_EXCEPT_A:
446
459
{
447
460
if (curblock->type() == ASTBlock::BLK_TRY) {
448
461
PycRef<ASTTryBlock> tryblk = curblock.cast<ASTTryBlock>();
@@ -459,14 +472,14 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
459
472
curblock = blocks.top();
460
473
}
461
474
}
462
- break ;
463
- case Pyc::SETUP_FINALLY_A:
475
+ break;*/
476
+ /* case Pyc::SETUP_FINALLY_A:
464
477
{
465
478
PycRef<ASTBlock> tryblk = new ASTTryBlock(pos, pos+operand, 0, pos+operand);
466
479
blocks.push(tryblk.cast<ASTBlock>());
467
480
curblock = blocks.top();
468
481
}
469
- break ;
482
+ break;*/
470
483
case Pyc::STORE_ATTR_A:
471
484
{
472
485
PycRef<ASTNode> name = stack.top ();
@@ -566,16 +579,15 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
566
579
return new ASTNodeList (defblock->nodes ());
567
580
}
568
581
569
- /* while (jumps.size() && jumps.top() == pos)
570
- {
571
- ASTNodeList::list_t block = lines.top();
572
- if (lines.size() > 1)
573
- {
574
- lines.pop();
575
- }
576
- lines.top().push_back(new ASTNodeList(block));
577
- jumps.pop();
578
- }*/
582
+ if (curblock->end () && curblock->end () < pos) {
583
+ // stack = FastStack(stack_hist.top());
584
+ stack_hist.pop ();
585
+
586
+ PycRef<ASTBlock> prev = curblock;
587
+ blocks.pop ();
588
+ curblock = blocks.top ();
589
+ curblock->append (prev.cast <ASTNode>());
590
+ }
579
591
}
580
592
581
593
cleanBuild = true ;
@@ -766,15 +778,29 @@ void print_src(PycRef<ASTNode> node, PycModule* mod)
766
778
break ;
767
779
case ASTNode::NODE_BLOCK:
768
780
{
769
- printf (" %s:\n " , node.cast <ASTBlock>()->type_str ());
781
+ printf (" %s" , node.cast <ASTBlock>()->type_str ());
782
+ if (node.cast <ASTBlock>()->blktype () == ASTBlock::BLK_IF
783
+ || node.cast <ASTBlock>()->blktype () == ASTBlock::BLK_ELIF)
784
+ {
785
+ if (node.cast <ASTCondBlock>()->negative ())
786
+ printf (" not " );
787
+ else
788
+ printf (" " );
789
+
790
+ print_src (node.cast <ASTCondBlock>()->cond (), mod);
791
+ }
792
+ printf (" :\n " );
793
+
770
794
cur_indent++;
771
795
ASTBlock::list_t lines = node.cast <ASTBlock>()->nodes ();
772
- for (ASTBlock::list_t ::const_iterator ln = lines.begin (); ln != lines.end (); ++ln ) {
796
+ for (ASTBlock::list_t ::const_iterator ln = lines.begin (); ln != lines.end ();) {
773
797
if ((*ln).cast <ASTNode>()->type () != ASTNode::NODE_NODELIST) {
774
798
start_line (cur_indent);
775
799
}
776
800
print_src (*ln, mod);
777
- end_line ();
801
+ if (++ln != lines.end ()) {
802
+ end_line ();
803
+ }
778
804
}
779
805
cur_indent--;
780
806
}
0 commit comments