Changeset 1317 in svn for trunk/lib/Decompiler.class.php


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

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

File:
1 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);
Note: See TracChangeset for help on using the changeset viewer.