Changeset 1317 for trunk


Ignore:
Timestamp:
2013-07-15T11:03:17+02:00 (13 months ago)
Author:
moo
Message:

Decompiler: fix PHP5.0 foreach, pre/post inc/dec

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Decompiler.class.php

    r1316 r1317  
    179179    function Decompiler_Code($src) 
    180180    { 
    181         assert('isset($src)'); 
     181        if (!assert('isset($src)')) { 
     182            printBacktrace(); 
     183        } 
    182184        $this->src = $src; 
    183185    } 
     
    502504    function toCode($indent) 
    503505    { 
    504         return 'foreach (' . ''; 
     506        return '#foreachBox#'; 
    505507    } 
    506508} 
     
    12131215            $body = ob_get_clean(); 
    12141216 
    1215             $as = foldToCode($firstJmpOp['fe_as'], $EX); 
     1217            $as = str(foldToCode($firstJmpOp['fe_as'], $EX), $EX); 
    12161218            if (isset($firstJmpOp['fe_key'])) { 
    1217                 $as = str($firstJmpOp['fe_key'], $EX) . ' => ' . str($as); 
     1219                $as = str($firstJmpOp['fe_key'], $EX) . ' => ' . $as; 
    12181220            } 
    12191221 
     
    15611563                else { 
    15621564                    $rvalue = isset($op1['constant']) ? $op1['constant'] : $this->getOpVal($op1, $EX); 
    1563                     $globalName = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[" . $this->getOpVal($op1, $EX) . "]"; 
     1565                    $globalName = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[" . str($this->getOpVal($op1, $EX), $EX) . "]"; 
    15641566                    $rvalue = new Decompiler_Fetch($rvalue, $fetchType, $globalName); 
    15651567                } 
     
    15981600                $src = $this->getOpVal($op1, $EX); 
    15991601                if (is_a($src, "Decompiler_ForeachBox")) { 
    1600                     $src->iskey = $this->getOpVal($op2, $EX); 
     1602                    assert($opc == XC_FETCH_DIM_TMP_VAR); 
     1603                    $src = clone $src; 
     1604                    $src->iskey = $op2['constant']; 
    16011605                    $resvar = $src; 
    16021606                    break; 
     
    20512055                $fe = new Decompiler_ForeachBox($op); 
    20522056                $fe->iskey = false; 
    2053                 $T[$res['var']] = $fe; 
    2054  
    2055                 ++ $i; 
    2056                 if (($ext & ZEND_FE_FETCH_WITH_KEY)) { 
     2057 
     2058                if (ZEND_ENGINE_2_1) { 
     2059                    // save current first 
     2060                    $T[$res['var']] = $fe; 
     2061 
     2062                    // move to next opcode 
     2063                    ++ $i; 
     2064                    assert($opcodes[$i]['opcode'] == XC_OP_DATA); 
    20572065                    $fe = new Decompiler_ForeachBox($op); 
    20582066                    $fe->iskey = true; 
    20592067 
    20602068                    $res = $opcodes[$i]['result']; 
    2061                     $T[$res['var']] = $fe; 
    2062                 } 
     2069                } 
     2070 
     2071                $resvar = $fe; 
    20632072                break; 
    20642073                // }}} 
     
    21302139                $flags = array_flip(explode('_', $opname)); 
    21312140                if (isset($flags['OBJ'])) { 
    2132                     $name = isset($op2['constant']) ? $op2['constant'] : unquoteVariableName($this->getOpVal($op2, $EX), $EX); 
    2133                     $resvar = str($this->getOpVal($op1, $EX)) . '->' . $name; 
     2141                    $resvar = str($this->getOpVal($op1, $EX)) . '->' . $op2['constant']; 
    21342142                } 
    21352143                else { 
     
    28232831} 
    28242832 
    2825 define('ZEND_FE_FETCH_BYREF',     1); 
    2826 define('ZEND_FE_FETCH_WITH_KEY',  2); 
     2833if (ZEND_ENGINE_2_1) { 
     2834    define('ZEND_FE_FETCH_BYREF',     1); 
     2835    define('ZEND_FE_FETCH_WITH_KEY',  2); 
     2836} 
    28272837 
    28282838define('ZEND_MEMBER_FUNC_CALL',   1<<0); 
  • trunk/mod_disassembler/sample.php

    r1306 r1317  
    359359} 
    360360 
    361 foreach ($array as $key => $value) { 
     361foreach ($array as $value) { 
    362362    foreach ($value as $key => $value) { 
    363363        echo $key . ' = ' . $value . "\n"; 
Note: See TracChangeset for help on using the changeset viewer.