Ignore:
Timestamp:
2011-04-22T14:05:08+02:00 (4 years ago)
Author:
moo
Message:

Decompiler: handle closure use()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r780 r781  
    11411141                        break; 
    11421142                    } 
     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                    } 
    11431158                    $resvar = "$lvalue = " . str($rvalue, $EX); 
    1144                     if (0) { 
    1145                     if ($op2['op_type'] == XC_IS_VAR) { 
    1146                         $resvar .= ' /* isvar */'; 
    1147                     } 
    1148                     else if ($op2['op_type'] == XC_IS_TMP_VAR) { 
    1149                         $resvar .= ' /* istmp */'; 
    1150                     } 
    1151                     } 
    11521159                    break; 
    11531160                    // }}} 
     
    11651172                            case ZEND_FETCH_STATIC: 
    11661173                                $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 
    11671180                                $resvar = 'static ' . $lvalue; 
    11681181                                $name = unquoteName($src); 
     
    18541867    function duses(&$EX, $indent) // {{{ 
    18551868    { 
    1856         if (!$EX['uses']) { 
    1857             return; 
    1858         } 
    1859  
    1860         $uses = array(); 
    1861         foreach ($EX['uses'] as $name => $value) { 
    1862             $uses = '$' . $name; 
    1863         } 
    1864         echo ' use(', implode(', ', $uses), ')'; 
     1869        if ($EX['uses']) { 
     1870            echo ' use(', implode(', ', $EX['uses']), ')'; 
     1871        } 
    18651872    } 
    18661873    // }}} 
     
    18861893            $functionName = ''; 
    18871894        } 
    1888         echo 'function ', $functionName, '('; 
     1895        echo 'function', $functionName ? ' ' . $functionName : '', '('; 
    18891896        $this->dargs($EX, $indent); 
    18901897        echo ")"; 
     
    22572264define('IS_CONSTANT', 8); 
    22582265define('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); 
    22592272 
    22602273@define('XC_IS_CV', 16); 
Note: See TracChangeset for help on using the changeset viewer.