Changeset 731 in svn for trunk/Decompiler.class.php


Ignore:
Timestamp:
2011-04-10T11:07:58+02:00 (4 years ago)
Author:
Xuefer
Message:

PHP_6: disassembler/decompiler: fix function static variable

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r730 r731  
    282282                }
    283283            }
    284             if (is_array($v)) {
     284            if (is_array(value($v))) {
    285285                $multiline ++;
    286286            }
     
    466466    }
    467467    // }}}
    468     function &dop_array($op_array, $indent = '') // {{{
    469     {
    470         $opcodes = &$op_array['opcodes'];
    471         $last = count($opcodes) - 1;
    472         if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) {
    473             unset($opcodes[$last]);
    474         }
    475         $EX['indent'] = '';
     468    function &fixOpcode($opcodes, $removeTailing = false) // {{{
     469    {
     470        if ($removeTailing) {
     471            $last = count($opcodes) - 1;
     472            if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) {
     473                unset($opcodes[$last]);
     474            }
     475        }
    476476        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) {
    477477            if (function_exists('xcache_get_fixed_opcode')) {
     
    505505            }
    506506        }
     507        return $opcodes;
     508    }
     509    // }}}
     510    function &dop_array($op_array, $indent = '') // {{{
     511    {
     512        $op_array['opcodes'] = $this->fixOpcode($op_array['opcodes'], true);
     513        $opcodes = &$op_array['opcodes'];
     514        $EX['indent'] = '';
    507515        // {{{ build jmp array
    508516        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) {
     
    757765
    758766            $resvar = null;
    759             if (isset($res['EA.type']) && ($res['EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) {
     767            if ((ZEND_ENGINE_2_4 ? ($res['op_type'] & EXT_TYPE_UNUSED) : ($res['EA.type'] & EXT_TYPE_UNUSED)) || $res['op_type'] == XC_IS_UNUSED) {
    760768                $istmpres = false;
    761769            }
     
    791799                    $EX['called_scope'] = null;
    792800                    $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX));
    793                     if (PHP_VERSION < 5) {
     801                    if (!ZEND_ENGINE_2) {
    794802                        $resvar = '$new object$';
    795803                    }
     
    798806                case XC_FETCH_CLASS: // {{{
    799807                    if ($op2['op_type'] == XC_IS_UNUSED) {
    800                         switch ($ext) {
     808                        switch (($ext & (defined('ZEND_FETCH_CLASS_MASK') ? ZEND_FETCH_CLASS_MASK : 0xFF))) {
    801809                        case ZEND_FETCH_CLASS_SELF:
    802810                            $class = 'self';
     
    843851                case XC_UNSET_VAR:
    844852                    $rvalue = $this->getOpVal($op1, $EX);
    845                     $fetchtype = $op2[PHP_VERSION < 5 ? 'fetch_type' : 'EA.type'];
     853                    if (defined('ZEND_FETCH_TYPE_MASK')) {
     854                        $fetchtype = ($ext & ZEND_FETCH_TYPE_MASK);
     855                    }
     856                    else {
     857                        $fetchtype = $op2[!ZEND_ENGINE_2 ? 'fetch_type' : 'EA.type'];
     858                    }
    846859                    switch ($fetchtype) {
    847860                    case ZEND_FETCH_STATIC_MEMBER:
     
    957970                            switch ($rvalue->fetchType) {
    958971                            case ZEND_FETCH_GLOBAL:
     972                            case ZEND_FETCH_GLOBAL_LOCK:
    959973                                $resvar = 'global ' . $lvalue;
    960974                                break 2;
     
    970984                                unset($statics);
    971985                                break 2;
     986                            default:
    972987                            }
    973988                        }
    974989                    }
     990                    // TODO: PHP_6 global
    975991                    $rvalue = str($rvalue);
    976992                    $resvar = "$lvalue = &$rvalue";
     
    10441060                    }
    10451061
    1046                     switch ((PHP_VERSION < 5 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) {
     1062                    switch ((!ZEND_ENGINE_2 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) {
    10471063                    case ZEND_ISSET:
    10481064                        $rvalue = "isset($rvalue)";
     
    15111527            default:
    15121528                if ($kk == 'res') {
     1529                    var_dump($op);
     1530                    exit;
    15131531                    assert(0);
    15141532                }
     
    17001718
    17011719                $mangled = false;
    1702                 if (PHP_VERSION < 5) {
     1720                if (!ZEND_ENGINE_2) {
    17031721                    echo 'var ';
    17041722                }
     
    18621880define('ZEND_ACC_SHADOW', 0x2000);
    18631881
    1864 define('ZEND_FETCH_GLOBAL',           0);
    1865 define('ZEND_FETCH_LOCAL',            1);
    1866 define('ZEND_FETCH_STATIC',           2);
    1867 define('ZEND_FETCH_STATIC_MEMBER',    3);
    1868 define('ZEND_FETCH_GLOBAL_LOCK',      4);
     1882define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.3.99");
     1883define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3.");
     1884define('ZEND_ENGINE_2_2', ZEND_ENGINE_2_3 || PHP_VERSION >= "5.2.");
     1885define('ZEND_ENGINE_2_1', ZEND_ENGINE_2_2 || PHP_VERSION >= "5.1.");
     1886define('ZEND_ENGINE_2',   ZEND_ENGINE_2_1 || PHP_VERSION >= "5.0.");
     1887
     1888if (ZEND_ENGINE_2_4) {
     1889    define('ZEND_FETCH_GLOBAL',           0x00000000);
     1890    define('ZEND_FETCH_LOCAL',            0x10000000);
     1891    define('ZEND_FETCH_STATIC',           0x20000000);
     1892    define('ZEND_FETCH_STATIC_MEMBER',    0x30000000);
     1893    define('ZEND_FETCH_GLOBAL_LOCK',      0x40000000);
     1894    define('ZEND_FETCH_LEXICAL',          0x50000000);
     1895
     1896    define('ZEND_FETCH_TYPE_MASK',        0x70000000);
     1897}
     1898else {
     1899    define('ZEND_FETCH_GLOBAL',           0);
     1900    define('ZEND_FETCH_LOCAL',            1);
     1901    define('ZEND_FETCH_STATIC',           2);
     1902    define('ZEND_FETCH_STATIC_MEMBER',    3);
     1903    define('ZEND_FETCH_GLOBAL_LOCK',      4);
     1904}
    18691905
    18701906define('ZEND_FETCH_CLASS_DEFAULT',    0);
     
    18761912define('ZEND_FETCH_CLASS_INTERFACE',  6);
    18771913define('ZEND_FETCH_CLASS_STATIC',     7);
     1914if (ZEND_ENGINE_2_4) {
     1915    define('ZEND_FETCH_CLASS_TRAIT',     14);
     1916}
     1917if (ZEND_ENGINE_2_3) {
     1918    define('ZEND_FETCH_CLASS_MASK',     0xF);
     1919}
    18781920
    18791921define('ZEND_EVAL',               (1<<0));
     
    18851927define('ZEND_ISSET',              (1<<0));
    18861928define('ZEND_ISEMPTY',            (1<<1));
    1887 define('EXT_TYPE_UNUSED',         (1<<0));
     1929if (ZEND_ENGINE_2_4) {
     1930    define('EXT_TYPE_UNUSED',     (1<<5));
     1931}
     1932else {
     1933    define('EXT_TYPE_UNUSED',     (1<<0));
     1934}
    18881935
    18891936define('ZEND_FETCH_STANDARD',     0);
Note: See TracChangeset for help on using the changeset viewer.