Changeset 781 for trunk


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

Decompiler: handle closure use()

Location:
trunk
Files:
3 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); 
  • trunk/decompilesample.php

    r780 r781  
    360360$total = 0; 
    361361$tax = 1; 
    362 $callback = function ($quantity, $product) use ($tax, &$total) { 
    363     static $static = array(1); 
     362$callback = function($quantity, $product) use($tax, &$total) { 
     363    $tax = 'tax'; 
     364    static $static1 = array(1); 
     365    static $static2; 
    364366    $tax = 'tax'; 
    365367    $tax = --$tax; 
  • trunk/xcache.c

    r780 r781  
    28762876/* }}} */ 
    28772877/* {{{ proto int xcache_get_refcount(mixed variable) 
    2878    Get reference count of variable */ 
     2878   XCache internal uses only: Get reference count of variable */ 
    28792879PHP_FUNCTION(xcache_get_refcount) 
    28802880{ 
     
    28882888/* }}} */ 
    28892889/* {{{ proto bool xcache_get_isref(mixed variable) 
    2890    check if variable data is marked referenced */ 
     2890   XCache internal uses only: Check if variable data is marked referenced */ 
     2891ZEND_BEGIN_ARG_INFO_EX(arginfo_xcache_get_isref, 0, 0, 1) 
     2892    ZEND_ARG_INFO(1, variable) 
     2893ZEND_END_ARG_INFO() 
     2894 
    28912895PHP_FUNCTION(xcache_get_isref) 
    28922896{ 
     
    28962900    } 
    28972901 
    2898     RETURN_BOOL(Z_ISREF_P(variable)); 
     2902    RETURN_BOOL(Z_ISREF_P(variable) && Z_REFCOUNT_P(variable) >= 3); 
    28992903} 
    29002904/* }}} */ 
     
    30473051/* }}} */ 
    30483052#endif 
    3049 /* {{{ proto mixed xcache_get_special_value(zval value) */ 
     3053/* {{{ proto mixed xcache_get_special_value(zval value) 
     3054   XCache internal use only: For decompiler to get static value with type fixed */ 
    30503055PHP_FUNCTION(xcache_get_special_value) 
    30513056{ 
     
    30723077        RETURN_NULL(); 
    30733078    } 
     3079} 
     3080/* }}} */ 
     3081/* {{{ proto int xcache_get_type(zval value) 
     3082   XCache internal use only for disassembler to get variable type in engine level */ 
     3083PHP_FUNCTION(xcache_get_type) 
     3084{ 
     3085    zval *value; 
     3086 
     3087    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE) { 
     3088        return; 
     3089    } 
     3090 
     3091    RETURN_LONG(Z_TYPE_P(value)); 
    30743092} 
    30753093/* }}} */ 
     
    31263144#endif 
    31273145    PHP_FE(xcache_get_special_value, NULL) 
     3146    PHP_FE(xcache_get_type,          NULL) 
    31283147    PHP_FE(xcache_get_op_type,       NULL) 
    31293148    PHP_FE(xcache_get_data_type,     NULL) 
     
    31413160    PHP_FE(xcache_unset_by_prefix,   NULL) 
    31423161    PHP_FE(xcache_get_refcount,      NULL) 
    3143     PHP_FE(xcache_get_isref,         NULL) 
     3162    PHP_FE(xcache_get_isref,         arginfo_xcache_get_isref) 
    31443163#ifdef HAVE_XCACHE_DPRINT 
    31453164    PHP_FE(xcache_dprint,            NULL) 
Note: See TracChangeset for help on using the changeset viewer.