Changeset 781 in svn for trunk/Decompiler.class.php


Ignore:
Timestamp:
2011-04-22T12:05:08Z (4 years ago)
Author:
Xuefer
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.