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.