Changeset 789 for trunk


Ignore:
Timestamp:
2011-04-25T12:42:11+02:00 (4 years ago)
Author:
moo
Message:

Decompile: implement foreach, improve blank line

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r788 r789  
    524524    function outputPhp(&$EX, $opline, $last, $indent) // {{{ 
    525525    { 
     526        $needBlankline = isset($EX['lastBlock']); 
    526527        $origindent = $indent; 
    527528        $curticks = 0; 
     
    529530            $op = $EX['opcodes'][$i]; 
    530531            if (isset($op['gofrom'])) { 
     532                if ($needBlankline) { 
     533                    $needBlankline = false; 
     534                    echo PHP_EOL; 
     535                } 
    531536                echo 'label' . $i, ":\n"; 
    532537            } 
     
    547552                            $indent .= INDENT; 
    548553                        } 
     554                        if ($needBlankline) { 
     555                            $needBlankline = false; 
     556                            echo PHP_EOL; 
     557                        } 
    549558                        echo $origindent, "declare (ticks=$curticks) {\n"; 
    550559                    } 
     560                } 
     561                if ($needBlankline) { 
     562                    $needBlankline = false; 
     563                    echo PHP_EOL; 
    551564                } 
    552565                echo $indent, str($op['php'], $indent), ";\n"; 
     
    653666    function decompileBasicBlock(&$EX, $first, $last, $indent) // {{{ 
    654667    { 
    655         if (isset($EX['lastBlock'])) { 
    656             echo PHP_EOL; 
    657         } 
    658668        $this->dasmBasicBlock($EX, $first, $last); 
    659669        // $this->dumpRange($EX, $first, $last); 
     
    670680            $jmpins = array_keys($jmpins); 
    671681        } 
    672         $opcodes[$line]['opcode'] = XC_NOP; 
     682        // $opcodes[$line]['opcode'] = XC_NOP; 
    673683        unset($opcodes[$line]['jmpouts']); 
    674684    } 
     
    694704        $lastOp = &$opcodes[$last]; 
    695705 
    696         if ($lastOp['opcode'] == XC_JMPNZ 
     706        if ($lastOp['opcode'] == XC_JMPNZ && !empty($lastOp['jmpouts']) 
    697707         && $lastOp['jmpouts'][0] == $first) { 
    698708            $this->removeJmpInfo($EX, $last); 
    699709            $this->beginComplexBlock($EX); 
     710 
    700711            echo $indent, 'do {', PHP_EOL; 
    701712            $this->recognizeAndDecompileClosedBlocks($EX, $first, $last, $indent . INDENT); 
    702713            echo $indent, '} while (', str($this->getOpVal($lastOp['op1'], $EX)), ');', PHP_EOL; 
     714 
    703715            $this->endComplexBlock($EX); 
    704716            return; 
     
    717729        if (isset($firstJmpOp) 
    718730         && $firstJmpOp['opcode'] == XC_JMPZ 
    719          && $lastOp['opcode'] == XC_JMP 
     731         && $firstJmpOp['jmpouts'][0] > $last 
     732         && $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts']) 
    720733         && $lastOp['jmpouts'][0] == $first) { 
    721734            $this->removeJmpInfo($EX, $firstJmp); 
    722735            $this->removeJmpInfo($EX, $last); 
    723  
    724736            $this->beginComplexBlock($EX); 
     737 
    725738            ob_start(); 
    726739            $this->recognizeAndDecompileClosedBlocks($EX, $first, $last, $indent . INDENT); 
    727             $code = ob_get_clean(); 
     740            $body = ob_get_clean(); 
     741 
    728742            echo $indent, 'while (', str($this->getOpVal($firstJmpOp['op1'], $EX)), ') {', PHP_EOL; 
    729             echo $code; 
     743            echo $body; 
    730744            echo $indent, '}', PHP_EOL; 
     745 
     746            $this->endComplexBlock($EX); 
     747            return; 
     748        } 
     749 
     750        if (isset($firstJmpOp) 
     751         && $firstJmpOp['opcode'] == XC_FE_FETCH 
     752         && $firstJmpOp['jmpouts'][0] > $last 
     753         && $lastOp['opcode'] == XC_JMP && !empty($lastOp['jmpouts']) 
     754         && $lastOp['jmpouts'][0] == $firstJmp) { 
     755            $this->removeJmpInfo($EX, $firstJmp); 
     756            $this->removeJmpInfo($EX, $last); 
     757            $this->beginComplexBlock($EX); 
     758 
     759            ob_start(); 
     760            $this->recognizeAndDecompileClosedBlocks($EX, $first, $last, $indent . INDENT); 
     761            $body = ob_get_clean(); 
     762 
     763            $as = foldToCode($firstJmpOp['fe_as'], $EX); 
     764            if (isset($firstJmpOp['fe_key'])) { 
     765                $as = str($firstJmpOp['fe_key'], $EX) . ' => ' . str($as); 
     766            } 
     767 
     768            echo $indent, 'foreach (', str($firstJmpOp['fe_src'], $EX), " as $as) {", PHP_EOL; 
     769            echo $body; 
     770            echo $indent, '}', PHP_EOL; 
     771 
    731772            $this->endComplexBlock($EX); 
    732773            return; 
     
    910951        else { 
    911952            $next = null; 
    912         } 
    913         if ($op['opcode'] == XC_FE_FETCH) { 
    914             $opline = $next; 
    915             $next = $op['op2']['opline_num']; 
    916             $end = $next - 1; 
    917  
    918             ob_start(); 
    919             $this->outputCode($EX, $opline, $end /* - 1 skip last jmp */, $indent . INDENT); 
    920             $body = ob_get_clean(); 
    921  
    922             $as = foldToCode($op['fe_as'], $EX); 
    923             if (isset($op['fe_key'])) { 
    924                 $as = str($op['fe_key'], $EX) . ' => ' . str($as); 
    925             } 
    926             echo "{$indent}foreach (" . str($op['fe_src'], $EX) . " as $as) {\n"; 
    927             echo $body; 
    928             echo "{$indent}}"; 
    929             // $this->outputCode($EX, $next, $last, $indent); 
    930             // return; 
    931953        } 
    932954        /* 
  • trunk/decompilesample.php

    r786 r789  
    295295 
    296296foreach ($array as $key => $value) { 
    297     foreach ($array as $key => $value) { 
     297    foreach ($value as $key => $value) { 
    298298        echo $key . ' = ' . $value . "\n"; 
    299299        break 2; 
Note: See TracChangeset for help on using the changeset viewer.