Changeset 791


Ignore:
Timestamp:
2011-04-25T17:27:44+02:00 (4 years ago)
Author:
moo
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.