Ignore:
Timestamp:
2013-07-13T06:24:58+02:00 (16 months ago)
Author:
moo
Message:

Decompiler, disassembler: fix catch for different PHP version; fetch hack is not necessary for PHP5.4+; update for ?: operator

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Decompiler.class.php

    r1305 r1306  
    567567                XC_ASSIGN_REF          => "= &", 
    568568                XC_JMP_SET             => "?:", 
     569                XC_JMP_SET_VAR         => "?:", 
    569570                XC_JMPZ_EX             => "&&", 
    570571                XC_JMPNZ_EX            => "||", 
     
    596597    function stripNamespace($name) // {{{ 
    597598    { 
     599        $name = str($name); 
    598600        $len = strlen($this->namespace) + 1; 
    599601        if (substr($name, 0, $len) == $this->namespace . '\\') { 
     
    664666        case XC_IS_TMP_VAR: 
    665667            $T = &$EX['Ts']; 
     668            if (!isset($T[$op['var']])) { 
     669                printBacktrace(); 
     670            } 
    666671            $ret = $T[$op['var']]; 
    667672            if ($free && empty($this->keepTs)) { 
     
    834839        } 
    835840        // }}} 
    836         // {{{ ?: excluding JMP_SET 
     841        // {{{ ?: excluding JMP_SET/JMP_SET_VAR 
    837842        if ($firstOp['opcode'] == XC_JMPZ && !empty($firstOp['jmpouts']) 
    838843         && $range[1] >= $range[0] + 3 
    839          && $opcodes[$firstOp['jmpouts'][0] - 2]['opcode'] == XC_QM_ASSIGN 
     844         && ($opcodes[$firstOp['jmpouts'][0] - 2]['opcode'] == XC_QM_ASSIGN || $opcodes[$firstOp['jmpouts'][0] - 2]['opcode'] == XC_QM_ASSIGN_VAR) 
    840845         && $opcodes[$firstOp['jmpouts'][0] - 1]['opcode'] == XC_JMP && $opcodes[$firstOp['jmpouts'][0] - 1]['jmpouts'][0] == $range[1] + 1 
    841          && $lastOp['opcode'] == XC_QM_ASSIGN 
     846         && ($lastOp['opcode'] == XC_QM_ASSIGN || $lastOp['opcode'] == XC_QM_ASSIGN_VAR) 
    842847        ) { 
    843848            $trueRange = array($range[0] + 1, $firstOp['jmpouts'][0] - 2); 
     
    10141019                $catchOp = &$opcodes[$catchOpLine]; 
    10151020                echo $indent, 'catch (' 
    1016                         , isset($catchOp['op1']['constant']) ? $catchOp['op1']['constant'] : str($this->getOpVal($catchOp['op1'], $EX)) 
     1021                        , $this->stripNamespace(isset($catchOp['op1']['constant']) ? $catchOp['op1']['constant'] : str($this->getOpVal($catchOp['op1'], $EX))) 
    10171022                        , ' ' 
    1018                         , str($this->getOpVal($catchOp['op2'], $EX)) 
     1023                        , isset($catchOp['op2']['constant']) ? '$' . $catchOp['op2']['constant'] : str($this->getOpVal($catchOp['op2'], $EX)) 
    10191024                        , ") {", PHP_EOL; 
    10201025                unset($catchOp); 
     
    13151320            case XC_JMPNZ_EX: 
    13161321            // case XC_JMP_SET: 
     1322            // case XC_JMP_SET_VAR: 
    13171323            // case XC_FE_RESET: 
    13181324            case XC_FE_FETCH: 
     
    14751481                $EX['object'] = (int) $res['var']; 
    14761482                $EX['called_scope'] = null; 
    1477                 $EX['fbc'] = 'new ' . unquoteName($this->getOpVal($op1, $EX), $EX); 
     1483                $EX['fbc'] = 'new ' . $this->stripNamespace($this->getOpVal($op1, $EX)); 
    14781484                break; 
    14791485                // }}} 
     
    14901496                // }}} 
    14911497            case XC_INSTANCEOF: // {{{ 
    1492                 $resvar = str($this->getOpVal($op1, $EX)) . ' instanceof ' . str($this->getOpVal($op2, $EX)); 
     1498                $resvar = str($this->getOpVal($op1, $EX)) . ' instanceof ' . $this->stripNamespace($this->getOpVal($op2, $EX)); 
    14931499                break; 
    14941500                // }}} 
     
    15371543            case XC_FETCH_UNSET: 
    15381544            case XC_FETCH_IS: 
    1539             case XC_UNSET_VAR: 
    1540                 $rvalue = $this->getOpVal($op1, $EX); 
    1541                 $fetchtype = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2['EA.type']; 
    1542                 if ($fetchtype == ZEND_FETCH_STATIC_MEMBER) { 
    1543                     $rvalue = $this->stripNamespace($op2['constant']) . '::$' . unquoteName($rvalue, $EX); 
    1544                 } 
    1545                 else if ($opc != XC_UNSET_VAR) { 
    1546                     $name = unquoteName($rvalue, $EX); 
     1545                $fetchType = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2['EA.type']; 
     1546                $name = isset($op1['constant']) ? $op1['constant'] : unquoteName($this->getOpVal($op1, $EX), $EX); 
     1547                if ($fetchType == ZEND_FETCH_STATIC_MEMBER) { 
     1548                    $class = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX); 
     1549                    $rvalue = $this->stripNamespace($class) . '::$' . $name; 
     1550                } 
     1551                else { 
     1552                    $rvalue = $this->getOpVal($op1, $EX); 
    15471553                    $globalname = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[" . str($rvalue) . "]"; 
    1548                     $rvalue = new Decompiler_Fetch($rvalue, $fetchtype, $globalname); 
    1549                 } 
    1550  
    1551                 if ($opc == XC_UNSET_VAR) { 
    1552                     $op['php'] = "unset(" . str($rvalue, $EX) . ")"; 
    1553                     $lastphpop = &$op; 
    1554                 } 
    1555                 else if ($res['op_type'] != XC_IS_UNUSED) { 
     1554                    $rvalue = new Decompiler_Fetch($rvalue, $fetchType, $globalname); 
     1555                } 
     1556 
     1557                if ($res['op_type'] != XC_IS_UNUSED) { 
    15561558                    $resvar = $rvalue; 
    15571559                } 
     1560                break; 
     1561                // }}} 
     1562            case XC_UNSET_VAR: // {{{ 
     1563                $fetchType = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2['EA.type']; 
     1564                if ($fetchType == ZEND_FETCH_STATIC_MEMBER) { 
     1565                    $class = isset($op2['constant']) ? $op2['constant'] /* PHP5.3- */ : $this->getOpVal($op2, $EX); 
     1566                    $rvalue = $this->stripNamespace($class) . '::$' . $op1['constant']; 
     1567                } 
     1568                else { 
     1569                    $rvalue = $this->getOpVal($op1, $EX); 
     1570                } 
     1571 
     1572                $op['php'] = "unset(" . str($rvalue, $EX) . ")"; 
     1573                $lastphpop = &$op; 
    15581574                break; 
    15591575                // }}} 
     
    17381754                    $fetchtype = defined('ZEND_FETCH_TYPE_MASK') ? ($ext & ZEND_FETCH_TYPE_MASK) : $op2['EA.type']; 
    17391755                    if ($fetchtype == ZEND_FETCH_STATIC_MEMBER) { 
    1740                         $rvalue = $this->stripNamespace($op2['constant']) . '::' . unquoteName($rvalue, $EX); 
     1756                        $class = isset($op2['constant']) ? $op2['constant'] : $this->getOpVal($op2, $EX); 
     1757                        $rvalue = $this->stripNamespace($class) . '::' . unquoteName($rvalue, $EX); 
    17411758                    } 
    17421759                } 
     
    20492066                // }}} 
    20502067            case XC_JMP_NO_CTOR: 
    2051                 break; 
    2052             case XC_JMP_SET: // ?: 
    2053                 $resvar = new Decompiler_Binop($this, $this->getOpVal($op1, $EX), XC_JMP_SET, null); 
    20542068                break; 
    20552069            case XC_JMPZ_EX: // and 
     
    24692483        echo $isInterface ? 'interface ' : 'class ', $this->stripNamespace($class['name']); 
    24702484        if ($class['parent']) { 
    2471             echo ' extends ', $class['parent']; 
     2485            echo ' extends ', $this->stripNamespace($class['parent']); 
    24722486        } 
    24732487        /* TODO */ 
     
    28572871    'XC_JMP_NO_CTOR' => -1, 
    28582872    'XC_JMP_SET' => -1, 
     2873    'XC_JMP_SET_VAR' => -1, 
    28592874    'XC_QM_ASSIGN_VAR' => -1, 
    28602875    'XC_UNSET_DIM_OBJ' => -1, 
Note: See TracChangeset for help on using the changeset viewer.