Changeset 731 for trunk


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

PHP_6: disassembler/decompiler: fix function static variable

Location:
trunk
Files:
2 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); 
  • trunk/phpdop.phpr

    r605 r731  
    33 
    44$srcdir = dirname(__FILE__); 
     5require_once("$srcdir/Decompiler.class.php"); 
    56if (file_exists("$srcdir/phpdc.debug.php")) { 
    67    include("$srcdir/phpdc.debug.php"); 
     
    1112    switch ($op['op_type']) { 
    1213    case 1: // CONST 
    13         return var_export($op['u.constant'], true); 
     14        return var_export($op['constant'], true); 
    1415 
    1516    case 2: // IS_TMP_VAR 
    16         return 't@' . $op['u.var']; 
     17        return 't@' . $op['var']; 
    1718 
    1819    case 4: 
    19         return 'v$' . $op['u.var']; 
     20        return 'v$' . $op['var']; 
    2021 
    2122    case 8: // UNUSED 
    22         if (isset($op['u.opline_num'])) { 
    23             return 'l#' . $op['u.opline_num']; 
     23        if (isset($op['opline_num'])) { 
     24            return 'l#' . $op['opline_num']; 
    2425        } 
    2526        else { 
     
    2829 
    2930    default: 
    30         return $op['op_type'] . $op['u.var']; 
     31        return $op['op_type'] . $op['var']; 
    3132    } 
    3233} 
    3334 
    34 function dump_opcodes($op_array, $indent = '') 
     35function dump_opcodes($opcodes, $indent = '') 
    3536{ 
     37    global $decompiler; 
     38 
    3639    $types = array('result' => 5, 'op1' => 20, 'op2' => 20); 
    37     foreach ($op_array as $line => $op) { 
     40    foreach ($decompiler->fixOpcode($opcodes) as $line => $op) { 
    3841        echo $indent; 
    3942        echo sprintf("%3d ", $op['lineno']); 
     
    9194    die("Usage: $argv[0] <file>\n"); 
    9295} 
     96$decompiler = new Decompiler(); 
    9397$pk = xcache_dasm_file($argv[1]); 
    9498$op_array = $funcs = $classes = null; 
Note: See TracChangeset for help on using the changeset viewer.