Changeset 1306 for trunk


Ignore:
Timestamp:
2013-07-13T06:24:58+02:00 (23 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.