Ignore:
Timestamp:
2011-04-22T17:18:42+02:00 (4 years ago)
Author:
moo
Message:

merge from trunk

Location:
branches/1.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/1.3

  • branches/1.3/Decompiler.class.php

    r766 r784  
    737737        $EX['last'] = count($opcodes) - 1; 
    738738        $EX['silence'] = 0; 
     739        $EX['recvs'] = array(); 
     740        $EX['uses'] = array(); 
    739741 
    740742        for ($next = 0, $last = $EX['last']; 
     
    11391141                        break; 
    11401142                    } 
     1143                    if (is_a($rvalue, 'Decompiler_Fetch')) { 
     1144                        $src = str($rvalue->src, $EX); 
     1145                        if ('$' . unquoteName($src) == $lvalue) { 
     1146                            switch ($rvalue->fetchType) { 
     1147                            case ZEND_FETCH_STATIC: 
     1148                                $statics = &$EX['op_array']['static_variables']; 
     1149                                if ((xcache_get_type($statics[$name]) & IS_LEXICAL_VAR)) { 
     1150                                    $EX['uses'][] = str($lvalue); 
     1151                                    unset($statics); 
     1152                                    break 2; 
     1153                                } 
     1154                                unset($statics); 
     1155                            } 
     1156                        } 
     1157                    } 
    11411158                    $resvar = "$lvalue = " . str($rvalue, $EX); 
    11421159                    break; 
     
    11551172                            case ZEND_FETCH_STATIC: 
    11561173                                $statics = &$EX['op_array']['static_variables']; 
     1174                                if ((xcache_get_type($statics[$name]) & IS_LEXICAL_REF)) { 
     1175                                    $EX['uses'][] = '&' . str($lvalue); 
     1176                                    unset($statics); 
     1177                                    break 2; 
     1178                                } 
     1179 
    11571180                                $resvar = 'static ' . $lvalue; 
    11581181                                $name = unquoteName($src); 
     
    12031226                    if ($opc == XC_ISSET_ISEMPTY_VAR) { 
    12041227                        $rvalue = $this->getOpVal($op1, $EX); 
     1228                        // for < PHP_5_3 
     1229                        if ($op1['op_type'] == XC_IS_CONST) { 
     1230                            $rvalue = '$' . unquoteVariableName($this->getOpVal($op1, $EX)); 
     1231                        } 
    12051232                        if ($op2['EA.type'] == ZEND_FETCH_STATIC_MEMBER) { 
    12061233                            $class = $this->getOpVal($op2, $EX); 
     
    12271254                    switch ((!ZEND_ENGINE_2 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) { 
    12281255                    case ZEND_ISSET: 
    1229                         $rvalue = "isset($rvalue)"; 
     1256                        $rvalue = "isset(" . str($rvalue) . ")"; 
    12301257                        break; 
    12311258                    case ZEND_ISEMPTY: 
    1232                         $rvalue = "empty($rvalue)"; 
     1259                        $rvalue = "empty(" . str($rvalue) . ")"; 
    12331260                        break; 
    12341261                    } 
     
    18381865    } 
    18391866    // }}} 
     1867    function duses(&$EX, $indent) // {{{ 
     1868    { 
     1869        if ($EX['uses']) { 
     1870            echo ' use(', implode(', ', $EX['uses']), ')'; 
     1871        } 
     1872    } 
     1873    // }}} 
    18401874    function dfunction($func, $indent = '', $nobody = false) // {{{ 
    18411875    { 
     
    18461880            $EX['op_array'] = &$func['op_array']; 
    18471881            $EX['recvs'] = array(); 
     1882            $EX['uses'] = array(); 
    18481883        } 
    18491884        else { 
     
    18521887            $EX = &$this->dop_array($func['op_array'], $newindent); 
    18531888            $body = ob_get_clean(); 
    1854             if (!isset($EX['recvs'])) { 
    1855                 $EX['recvs'] = array(); 
    1856             } 
    18571889        } 
    18581890 
     
    18611893            $functionName = ''; 
    18621894        } 
    1863         echo 'function ', $functionName, '('; 
     1895        echo 'function', $functionName ? ' ' . $functionName : '', '('; 
    18641896        $this->dargs($EX, $indent); 
    18651897        echo ")"; 
     1898        $this->duses($EX, $indent); 
    18661899        if ($nobody) { 
    18671900            echo ";\n"; 
     
    22312264define('IS_CONSTANT', 8); 
    22322265define('IS_CONSTANT_ARRAY',   9); 
     2266/* Ugly hack to support constants as static array indices */ 
     2267define('IS_CONSTANT_TYPE_MASK',   0x0f); 
     2268define('IS_CONSTANT_UNQUALIFIED', 0x10); 
     2269define('IS_CONSTANT_INDEX',       0x80); 
     2270define('IS_LEXICAL_VAR',          0x20); 
     2271define('IS_LEXICAL_REF',          0x40); 
    22332272 
    22342273@define('XC_IS_CV', 16); 
Note: See TracChangeset for help on using the changeset viewer.