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

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

File:
1 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                    // }}} 
Note: See TracChangeset for help on using the changeset viewer.