Changeset 789 in svn for trunk


Ignore:
Timestamp:
2011-04-25T10:42:11Z (4 years ago)
Author:
Xuefer
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.