Changeset 758 for trunk


Ignore:
Timestamp:
2011-04-17T10:23:57+02:00 (4 years ago)
Author:
moo
Message:

Decompiler: improves break/continue/goto, updates test sample

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r757 r758  
    650650            $op['line'] = $i;
    651651            switch ($op['opcode']) {
     652            case XC_CONT:
     653            case XC_BRK:
     654                $op['jmpouts'] = array();
     655                break;
     656
    652657            case XC_GOTO:
    653658            case XC_JMP:
     
    801806            return;
    802807        }
    803         if (!empty($op['jmpouts']) && isset($op['isjmp'])) {
     808        if (isset($op['jmpouts']) && isset($op['isjmp'])) {
    804809            if (isset($op['cond'])) {
    805810                echo "{$indent}check (" . str($op["cond"]) . ") {\n";
    806811                echo INDENT;
    807812            }
    808             echo $indent;
    809             echo xcache_get_opcode($op['opcode']), ' line', $op['jmpouts'][0];
    810             if (isset($op['jmpouts'][1])) {
    811                 echo ', line', $op['jmpouts'][1];
    812             }
    813             echo ";";
    814             // echo ' // <- line', $op['line'];
    815             echo "\n";
     813            switch ($op['opcode']) {
     814            case XC_CONT:
     815            case XC_BRK:
     816                break;
     817
     818            case XC_GOTO:
     819                echo $indent, 'goto', ' line', $op['jmpouts'][0], ';', "\n";
     820                break;
     821
     822            default:
     823                echo $indent;
     824                echo xcache_get_opcode($op['opcode']), ' line', $op['jmpouts'][0];
     825                if (isset($op['jmpouts'][1])) {
     826                    echo ', line', $op['jmpouts'][1];
     827                }
     828                echo ";";
     829                // echo ' // <- line', $op['line'];
     830                echo "\n";
     831            }
    816832            if (isset($op['cond'])) echo "$indent}\n";
    817833        }
     
    15211537                    break;
    15221538                    // }}}
     1539                case XC_CONT:
     1540                case XC_BRK:
     1541                    $op['cond'] = null;
     1542                    $op['isjmp'] = true;
     1543                    $resvar = $opc == XC_CONT ? 'continue' : 'break';
     1544                    $count = str($this->getOpVal($op2, $EX));
     1545                    if ($count != '1') {
     1546                        $resvar .= ' ' . $count;
     1547                    }
     1548                    break;
    15231549                case XC_GOTO:
    15241550                case XC_JMP: // {{{
     
    15311557                    $caseValue = $this->getOpVal($op2, $EX);
    15321558                    $resvar = str($switchValue) . ' == ' . str($caseValue);
    1533                     break;
    1534                 case XC_BRK:
    15351559                    break;
    15361560                case XC_RECV_INIT:
     
    15781602                    $EX['silence'] --;
    15791603                    $lastresvar = '@' . str($lastresvar, $EX);
    1580                     break;
    1581                     // }}}
    1582                 case XC_CONT: // {{{
    15831604                    break;
    15841605                    // }}}
  • trunk/decompilesample.php

    r753 r758  
    186186$a = $b ^ $c;
    187187$a = ~$b;
     188$a = -$b;
     189$a = +$b;
    188190$a = $b >> $c;
    189191$a = $b >> $c;
     
    249251
    250252foreach ($array as $key => $value) {
    251     echo $key . ' = ' . $value . "\n";
    252     continue;
     253    foreach ($array as $key => $value) {
     254        echo $key . ' = ' . $value . "\n";
     255        break 2;
     256        continue;
     257    }
    253258}
    254259
     
    279284echo __LINE__;
    280285
    281 //* >= PHP 5.3
     286//*
    282287echo 'PHP 5.3+ code testing';
    283288const CONST_VALUE = 1;
     
    309314$greet('PHP');
    310315$total = 0;
     316$tax = 1;
    311317$callback = function ($quantity, $product) use ($tax, &$total) {
     318    static $static = array(1);
     319    $tax = 'tax';
    312320    $pricePerItem = constant('PRICE_' . strtoupper($product));
    313321    $total += $pricePerItem * $quantity * ($tax + 1);
Note: See TracChangeset for help on using the changeset viewer.