Changeset 1306 for trunk


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

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

Location:
trunk
Files:
4 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, 
  • trunk/mod_disassembler/sample.php

    r1305 r1306  
    3737        echo CONST_VALUE; 
    3838        echo ClassName::CONST_VALUE; 
    39         unset(ClassName::$classProp1); 
     39        empty(ClassName::$classProp); 
     40        isset(ClassName::$classProp); 
     41        unset(ClassName::$classProp); 
     42        ClassName::$classProp = 1; 
     43        echo ClassName::$classProp; 
     44        empty($obj->objProp); 
     45        isset($obj->objProp); 
    4046        unset($obj->objProp); 
     47        $obj->objProp = 1; 
     48        echo $obj->objProp; 
     49        empty($this->thisProp); 
     50        isset($this->thisProp); 
    4151        unset($this->thisProp); 
     52        $this->thisProp = 1; 
     53        echo $this->thisProp; 
    4254        unset($array['index']->valueProp); 
    4355        unset($obj->array['index']); 
    4456        unset($this->array['index']); 
    45         isset($GLOBALS['a']); 
    46         empty($GLOBALS['a']); 
    47         unset($GLOBALS['a']); 
    48         isset(ClassName::$a); 
    49         empty(ClassName::$a); 
    50         unset(ClassName::$a); 
    51         echo $GLOBALS['a']; 
    52         $obj->objProp = 1; 
    53         $this->thisProp = 1; 
    54         $array['index']->valueProp = 1; 
     57        empty($_GET['get']); 
     58        isset($_GET['get']); 
     59        unset($_GET['get']); 
     60        $_GET['get'] = 1; 
     61        echo $_GET['get']; 
     62        isset($GLOBALS['global']); 
     63        empty($GLOBALS['global']); 
     64        unset($GLOBALS['global']); 
     65        $GLOBALS['global'] = 1; 
     66        echo $GLOBALS['global']; 
     67        empty($array['index']); 
     68        isset($array['index']); 
     69        unset($array['index']); 
    5570        $array['index'] = 1; 
    56         $array[1] = 1; 
     71        echo $array['index']; 
     72        empty($array['index']->indexProp); 
     73        isset($array['index']->indexProp); 
     74        unset($array['index']->indexProp); 
     75        $array['index']->indexProp = 1; 
     76        echo $array['index']->indexProp; 
     77        empty($GLOBALS['var']->indexProp); 
     78        isset($GLOBALS['var']->indexProp); 
     79        unset($GLOBALS['var']->indexProp); 
     80        $GLOBALS['var']->indexProp = 1; 
     81        echo $GLOBALS['var']->indexProp; 
    5782    } 
    5883 
     
    438463$a = ($b ?: $d) + $c; 
    439464$a = f1() ?: f2(); 
     465$a = C::f1() ?: C::f2(); 
    440466$a = ($b ? $c : $d); 
    441467$a = ($b ? $c : $d) + $c; 
  • trunk/xcache/xc_opcode_spec.c

    r1281 r1306  
    66#define OPSPEC(ext, op1, op2, res) { OPSPEC_##ext, OPSPEC_##op1, OPSPEC_##op2, OPSPEC_##res }, 
    77#define OPSPEC_VAR_2 OPSPEC_STD 
     8#ifdef ZEND_ENGINE_2_4 
     9#undef OPSPEC_FETCH 
     10#define OPSPEC_FETCH OPSPEC_STD 
     11#endif 
    812#include "xc_opcode_spec_def.h" 
    913 
  • trunk/xcache/xc_opcode_spec_def.h

    r1303 r1306  
    8080#ifdef ZEND_ENGINE_2_1 
    8181  /* php 5.1 and up */ 
    82 #   ifdef ZEND_ENGINE_2_4 
    83     OPSPEC(    UNUSED,        STD,        STD,     UNUSED) /* 74 UNSET_VAR                      */ 
    84 #   else 
    8582    OPSPEC(    UNUSED,        STD,      FETCH,     UNUSED) /* 74 UNSET_VAR                      */ 
    86 #   endif 
    8783    OPSPEC(       STD,        STD,        STD,     UNUSED) /* 75 UNSET_DIM                      */ 
    8884    OPSPEC(       STD,        STD,        STD,     UNUSED) /* 76 UNSET_OBJ                      */ 
     
    154150    OPSPEC(    UNUSED,     UCLASS,        STD,     UNUSED) /* 113 INIT_STATIC_METHOD_CALL        */ 
    155151#endif 
    156 #ifdef ZEND_ENGINE_2_4 
    157     OPSPEC(     ISSET,        STD,        STD,        TMP) /* 114 ISSET_ISEMPTY_VAR              */ 
    158 #else 
    159152    OPSPEC(     ISSET,        STD,      FETCH,        TMP) /* 114 ISSET_ISEMPTY_VAR              */ 
    160 #endif 
    161153    OPSPEC(     ISSET,        STD,        STD,        TMP) /* 115 ISSET_ISEMPTY_DIM_OBJ          */ 
    162154 
Note: See TracChangeset for help on using the changeset viewer.