Changeset 791 in svn for trunk/Decompiler.class.php


Ignore:
Timestamp:
2011-04-25T15:27:44Z (4 years ago)
Author:
Xuefer
Message:

Decompiler: fix foreach to not be recognized as switch, fix i/j looping

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r790 r791  
    585585                $ret = foldToCode($ret, $EX);
    586586            }
    587             if ($free) {
     587            if ($free && empty($this->keepTs)) {
    588588                unset($T[$op['var']]);
    589589            }
     
    880880        $opcodes = &$EX['opcodes'];
    881881
    882         $i = $starti = $first;
    883         while ($i <= $last) {
     882        $starti = $first;
     883        for ($i = $starti; $i <= $last; ++$i) {
    884884            $op = $opcodes[$i];
    885885            if (!empty($op['jmpins']) || !empty($op['jmpouts'])) {
    886886                $blockFirst = $i;
    887887                $blockLast = -1;
    888                 $i = $blockFirst;
    889                 // $this->dumpRange($EX, $i, $last, $indent);
     888                $j = $blockFirst;
    890889                do {
    891                     $op = $opcodes[$i];
     890                    $op = $opcodes[$j];
    892891                    if (!empty($op['jmpins'])) {
    893892                        // care about jumping from blocks behind, not before
     
    901900                        $blockLast = max($blockLast, max($op['jmpouts']) - 1);
    902901                    }
    903                     ++$i;
    904                 } while ($i <= $blockLast);
     902                    ++$j;
     903                } while ($j <= $blockLast);
    905904                assert('$blockLast <= $last');
    906905
     
    910909                    }
    911910                    $this->decompileComplexBlock($EX, $blockFirst, $blockLast, $indent);
    912                     $i = $starti = $blockLast + 1;
     911                    $starti = $blockLast + 1;
     912                    $i = $starti - 1;
    913913                    continue;
    914914                }
    915915            }
    916             ++$i;
    917916        }
    918917        if ($starti <= $last) {
     
    10301029
    10311030        /* dump whole array
     1031        $this->keepTs = true;
    10321032        $this->dasmBasicBlock($EX, $first, $last);
    10331033        for ($i = $first; $i <= $last; ++$i) {
     
    17781778                    // }}}
    17791779                case XC_FE_FETCH: // {{{
    1780                     $op['fe_src'] = $this->getOpVal($op1, $EX);
     1780                    $op['fe_src'] = $this->getOpVal($op1, $EX, false, true);
    17811781                    $fe = new Decompiler_ForeachBox($op);
    17821782                    $fe->iskey = false;
Note: See TracChangeset for help on using the changeset viewer.