Changeset 739


Ignore:
Timestamp:
2011-04-11T06:46:16+02:00 (3 years ago)
Author:
moo
Message:

merge decompiler updates from trunk

Location:
branches/1.3
Files:
5 edited
1 copied

Legend:

Unmodified
Added
Removed
  • branches/1.3

  • branches/1.3/Decompiler.class.php

    r728 r739  
    99} 
    1010 
    11 function str($src, $indent = '') // {{{ 
     11function str($code, $indent = '') // {{{ 
     12{ 
     13    if (is_object($code)) { 
     14        if (get_class($code) != 'Decompiler_Code') { 
     15            $code = toCode($code, $indent); 
     16        } 
     17        return $code->__toString(); 
     18    } 
     19 
     20    return (string) $code; 
     21} 
     22// }}} 
     23function toCode($src, $indent = '') // {{{ 
    1224{ 
    1325    if (is_array($indent)) { 
     
    1527    } 
    1628 
    17     /* 
    18     $e = xcache_get_special_value($src); 
    19     if (isset($e)) { 
    20         if (is_array($e)) { 
    21             $src = $e; 
    22         } 
    23         else { 
    24             return $e; 
    25         } 
    26     } 
    27     */ 
    28  
    29     if (is_array($src)) { 
    30         exit('array str'); 
    31         $src = new Decompiler_Array($src, $indent); 
    32         return $src->__toString(); 
    33     } 
    34  
    3529    if (is_object($src)) { 
    36         if (!method_exists($src, '__toString')) { 
     30        if (!method_exists($src, 'toCode')) { 
    3731            var_dump($src); 
    38             exit('no __toString'); 
    39         } 
    40         return $src->__toString(); 
    41     } 
    42  
    43     return $src; 
     32            exit('no toCode'); 
     33        } 
     34        return new Decompiler_Code($src->toCode($indent)); 
     35    } 
     36 
     37    return new Decompiler_Code($src); 
    4438} 
    4539// }}} 
     
    5549    } 
    5650 
    57     if ($value instanceof Decompiler_Object) { 
     51    if (is_a($value, 'Decompiler_Object')) { 
    5852        // use as is 
    5953    } 
    6054    else if (is_array($value)) { 
    61         $value = new Decompiler_Array($value); 
     55        $value = new Decompiler_ConstArray($value); 
    6256    } 
    6357    else { 
     
    8074    } 
    8175 
    82     function __toString() 
     76    function toCode($indent) 
    8377    { 
    8478        return var_export($this->value, true); 
     
    9387    { 
    9488        $this->src = $src; 
     89    } 
     90 
     91    function toCode($indent) 
     92    { 
     93        return $this; 
    9594    } 
    9695 
     
    107106    var $op2; 
    108107    var $parent; 
     108    var $indent; 
    109109 
    110110    function Decompiler_Binop($parent, $op1, $opc, $op2) 
     
    116116    } 
    117117 
    118     function __toString() 
    119     { 
    120         $op1 = str($this->op1); 
     118    function toCode($indent) 
     119    { 
     120        $op1 = toCode($this->op1, $indent); 
    121121        if (is_a($this->op1, 'Decompiler_Binop') && $this->op1->opc != $this->opc) { 
    122122            $op1 = "($op1)"; 
     
    124124        $opstr = $this->parent->binops[$this->opc]; 
    125125        if ($op1 == '0' && $this->opc == XC_SUB) { 
    126             return $opstr . str($this->op2); 
    127         } 
    128         return $op1 . ' ' . $opstr . ' ' . str($this->op2); 
     126            return $opstr . toCode($this->op2, $indent); 
     127        } 
     128        return $op1 . ' ' . $opstr . ' ' . toCode($this->op2, $indent); 
    129129    } 
    130130} 
     
    142142    } 
    143143 
    144     function __toString() 
     144    function toCode($indent) 
    145145    { 
    146146        switch ($this->fetchType) { 
     
    168168    } 
    169169 
    170     function __toString() 
    171     { 
    172         return $this->obj->__toString(); 
     170    function toCode($indent) 
     171    { 
     172        return $this->obj->toCode($indent); 
    173173    } 
    174174} 
     
    180180    var $assign = null; 
    181181 
    182     function __toString() 
     182    function toCode($indent) 
    183183    { 
    184184        if (is_a($this->value, 'Decompiler_ListBox')) { 
    185             $exp = str($this->value->obj->src); 
     185            $exp = toCode($this->value->obj->src, $indent); 
    186186        } 
    187187        else { 
    188             $exp = str($this->value); 
     188            $exp = toCode($this->value, $indent); 
    189189        } 
    190190        foreach ($this->offsets as $dim) { 
    191             $exp .= '[' . str($dim) . ']'; 
     191            $exp .= '[' . toCode($dim, $indent) . ']'; 
    192192        } 
    193193        return $exp; 
     
    205205    var $everLocked = false; 
    206206 
    207     function __toString() 
     207    function toCode($indent) 
    208208    { 
    209209        if (count($this->dims) == 1 && !$this->everLocked) { 
     
    212212            $dim->value = $this->src; 
    213213            if (!isset($dim->assign)) { 
    214                 return str($dim); 
    215             } 
    216             return str($this->dims[0]->assign) . ' = ' . str($dim); 
     214                return toCode($dim, $indent); 
     215            } 
     216            return toCode($this->dims[0]->assign, $indent) . ' = ' . toCode($dim, $indent); 
    217217        } 
    218218        /* flatten dims */ 
     
    223223                $assign = &$assign[$offset]; 
    224224            } 
    225             $assign = str($dim->assign); 
    226         } 
    227         return $this->toList($assigns) . ' = ' . str($this->src); 
     225            $assign = toCode($dim->assign, $indent); 
     226        } 
     227        return $this->toList($assigns) . ' = ' . toCode($this->src, $indent); 
    228228    } 
    229229 
     
    260260class Decompiler_Array extends Decompiler_Value // {{{ 
    261261{ 
    262     var $indent = ''; 
    263  
    264     function Decompiler_Array($value = array(), $indent = '') 
    265     { 
    266         $this->value = $value; 
    267         $this->indent = $indent; 
    268     } 
    269  
    270     function __toString() 
    271     { 
     262    // emenets 
     263    function Decompiler_Array() 
     264    { 
     265        $this->value = array(); 
     266    } 
     267 
     268    function toCode($indent) 
     269    { 
     270        $subindent = $indent . INDENT; 
     271 
     272        $elementsCode = array(); 
     273        $index = 0; 
     274        foreach ($this->value as $element) { 
     275            list($key, $value) = $element; 
     276            if (!isset($key)) { 
     277                $key = $index++; 
     278            } 
     279            $elementsCode[] = array(str($key, $subindent), str($value, $subindent), $key, $value); 
     280        } 
     281 
    272282        $exp = "array("; 
    273         $indent = $this->indent . INDENT; 
    274         $assoclen = 0; 
     283        $indent = $indent . INDENT; 
     284        $assocWidth = 0; 
    275285        $multiline = 0; 
    276286        $i = 0; 
    277         foreach ($this->value as $k => $v) { 
    278             if ($i !== $k) { 
    279                 $len = strlen($k); 
    280                 if ($assoclen < $len) { 
    281                     $assoclen = $len; 
    282                 } 
    283             } 
    284             if (is_array($v)) { 
     287        foreach ($elementsCode as $element) { 
     288            list($keyCode, $valueCode) = $element; 
     289            if ((string) $i !== $keyCode) { 
     290                $assocWidth = 1; 
     291                break; 
     292            } 
     293            ++$i; 
     294        } 
     295        foreach ($elementsCode as $element) { 
     296            list($keyCode, $valueCode, $key, $value) = $element; 
     297            if ($assocWidth) { 
     298                $len = strlen($keyCode); 
     299                if ($assocWidth < $len) { 
     300                    $assocWidth = $len; 
     301                } 
     302            } 
     303            if (is_array($value) || is_a($value, 'Decompiler_Array')) { 
    285304                $multiline ++; 
    286305            } 
    287             ++ $i; 
    288         } 
    289         if ($assoclen) { 
    290             $assoclen += 2; 
    291306        } 
    292307 
    293308        $i = 0; 
    294         $subindent = $indent . INDENT; 
    295         foreach ($this->value as $k => $v) { 
     309        foreach ($elementsCode as $element) { 
     310            list($keyCode, $value) = $element; 
    296311            if ($multiline) { 
    297312                if ($i) { 
     
    307322            } 
    308323 
    309             $k = var_export($k, true); 
    310             if ($multiline) { 
    311                 $exp .= sprintf("%{$assoclen}s => ", $k); 
    312             } 
    313             else if ($assoclen) { 
    314                 $exp .= $k . ' => '; 
    315             } 
    316  
    317             $exp .= str(value($v), $subindent); 
     324            if ($assocWidth) { 
     325                if ($multiline) { 
     326                    $exp .= sprintf("%-{$assocWidth}s => ", $keyCode); 
     327                } 
     328                else { 
     329                    $exp .= $keyCode . ' => '; 
     330                } 
     331            } 
     332 
     333            $exp .= $value; 
    318334 
    319335            $i ++; 
    320336        } 
    321337        if ($multiline) { 
    322             $exp .= "$indent);"; 
     338            $exp .= "\n$indent)"; 
    323339        } 
    324340        else { 
     
    326342        } 
    327343        return $exp; 
     344    } 
     345} 
     346// }}} 
     347class Decompiler_ConstArray extends Decompiler_Array // {{{ 
     348{ 
     349    function Decompiler_ConstArray($array) 
     350    { 
     351        $elements = array(); 
     352        foreach ($array as $key => $value) { 
     353            $elements[] = array(value($key), value($value)); 
     354        } 
     355        $this->value = $elements; 
    328356    } 
    329357} 
     
    333361    var $iskey; 
    334362 
    335     function __toString() 
     363    function toCode($indent) 
    336364    { 
    337365        return 'foreach (' . ''; 
     
    417445                    $curticks = $toticks; 
    418446                } 
    419                 echo $indent, str($op['php']), ";\n"; 
     447                echo $indent, toCode($op['php'], $indent), ";\n"; 
    420448            } 
    421449        } 
     
    429457        switch ($op['op_type']) { 
    430458        case XC_IS_CONST: 
    431             return str(value($op['constant'])); 
     459            return toCode(value($op['constant']), $EX); 
    432460 
    433461        case XC_IS_VAR: 
     
    436464            $ret = $T[$op['var']]; 
    437465            if ($tostr) { 
    438                 $ret = str($ret, $EX); 
     466                $ret = toCode($ret, $EX); 
    439467            } 
    440468            if ($free) { 
     
    466494    } 
    467495    // }}} 
    468     function &dop_array($op_array, $indent = '') // {{{ 
    469     { 
    470         $opcodes = &$op_array['opcodes']; 
    471         $last = count($opcodes) - 1; 
    472         if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) { 
    473             unset($opcodes[$last]); 
    474         } 
    475         $EX['indent'] = ''; 
     496    function &fixOpcode($opcodes, $removeTailing = false, $defaultReturnValue = null) // {{{ 
     497    { 
    476498        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 
    477499            if (function_exists('xcache_get_fixed_opcode')) { 
     
    505527            } 
    506528        } 
     529 
     530        if ($removeTailing) { 
     531            $last = count($opcodes) - 1; 
     532            if ($opcodes[$last]['opcode'] == XC_HANDLE_EXCEPTION) { 
     533                unset($opcodes[$last]); 
     534                --$last; 
     535            } 
     536            if ($opcodes[$last]['opcode'] == XC_RETURN) { 
     537                $op1 = $opcodes[$last]['op1']; 
     538                if ($op1['op_type'] == XC_IS_CONST && array_key_exists('constant', $op1) && $op1['constant'] === $defaultReturnValue) { 
     539                    unset($opcodes[$last]); 
     540                    --$last; 
     541                } 
     542            } 
     543        } 
     544        return $opcodes; 
     545    } 
     546    // }}} 
     547    function &dop_array($op_array, $indent = '') // {{{ 
     548    { 
     549        $op_array['opcodes'] = $this->fixOpcode($op_array['opcodes'], true, $indent == '' ? 1 : null); 
     550        $opcodes = &$op_array['opcodes']; 
     551        $EX['indent'] = ''; 
    507552        // {{{ build jmp array 
    508553        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 
     
    633678            $body = ob_get_clean(); 
    634679 
    635             $as = str($op['fe_as']); 
     680            $as = toCode($op['fe_as'], $EX); 
    636681            if (isset($op['fe_key'])) { 
    637                 $as = str($op['fe_key']) . ' => ' . $as; 
    638             } 
    639             echo "{$indent}foreach (" . str($op['fe_src']) . " as $as) {\n"; 
     682                $as = toCode($op['fe_key'], $EX) . ' => ' . $as; 
     683            } 
     684            echo "{$indent}foreach (" . toCode($op['fe_src'], $EX) . " as $as) {\n"; 
    640685            echo $body; 
    641686            echo "{$indent}}"; 
     
    757802 
    758803            $resvar = null; 
    759             if (isset($res['EA.type']) && ($res['EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) { 
     804            if ((ZEND_ENGINE_2_4 ? ($res['op_type'] & EXT_TYPE_UNUSED) : ($res['EA.type'] & EXT_TYPE_UNUSED)) || $res['op_type'] == XC_IS_UNUSED) { 
    760805                $istmpres = false; 
    761806            } 
     
    791836                    $EX['called_scope'] = null; 
    792837                    $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX)); 
    793                     if (PHP_VERSION < 5) { 
     838                    if (!ZEND_ENGINE_2) { 
    794839                        $resvar = '$new object$'; 
    795840                    } 
     
    798843                case XC_FETCH_CLASS: // {{{ 
    799844                    if ($op2['op_type'] == XC_IS_UNUSED) { 
    800                         switch ($ext) { 
     845                        switch (($ext & (defined('ZEND_FETCH_CLASS_MASK') ? ZEND_FETCH_CLASS_MASK : 0xFF))) { 
    801846                        case ZEND_FETCH_CLASS_SELF: 
    802847                            $class = 'self'; 
     
    843888                case XC_UNSET_VAR: 
    844889                    $rvalue = $this->getOpVal($op1, $EX); 
    845                     $fetchtype = $op2[PHP_VERSION < 5 ? 'fetch_type' : 'EA.type']; 
     890                    if (defined('ZEND_FETCH_TYPE_MASK')) { 
     891                        $fetchtype = ($ext & ZEND_FETCH_TYPE_MASK); 
     892                    } 
     893                    else { 
     894                        $fetchtype = $op2[!ZEND_ENGINE_2 ? 'fetch_type' : 'EA.type']; 
     895                    } 
    846896                    switch ($fetchtype) { 
    847897                    case ZEND_FETCH_STATIC_MEMBER: 
     
    856906                    } 
    857907                    if ($opc == XC_UNSET_VAR) { 
    858                         $op['php'] = "unset(" . str($rvalue) . ")"; 
     908                        $op['php'] = "unset(" . toCode($rvalue, $EX) . ")"; 
    859909                        $lastphpop = &$op; 
    860910                    } 
     
    917967                        ++ $i; 
    918968                        $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 
    919                         $resvar = str($lvalue) . ' = ' . $rvalue; 
     969                        $resvar = toCode($lvalue, $EX) . ' = ' . $rvalue; 
    920970                    } 
    921971                    else if ($opc == XC_UNSET_DIM) { 
    922                         $op['php'] = "unset(" . str($rvalue) . ")"; 
     972                        $op['php'] = "unset(" . toCode($rvalue, $EX) . ")"; 
    923973                        $lastphpop = &$op; 
    924974                    } 
     
    941991                        $dim->assign = $lvalue; 
    942992                        if ($dim->isLast) { 
    943                             $resvar = str($dim->value); 
     993                            $resvar = toCode($dim->value, $EX); 
    944994                        } 
    945995                        unset($dim); 
    946996                        break; 
    947997                    } 
    948                     $resvar = "$lvalue = " . str($rvalue, $EX); 
     998                    $resvar = "$lvalue = " . toCode($rvalue, $EX); 
    949999                    break; 
    9501000                    // }}} 
     
    9531003                    $rvalue = $this->getOpVal($op2, $EX, false); 
    9541004                    if (is_a($rvalue, 'Decompiler_Fetch')) { 
    955                         $src = str($rvalue->src); 
     1005                        $src = toCode($rvalue->src, $EX); 
    9561006                        if (substr($src, 1, -1) == substr($lvalue, 1)) { 
    9571007                            switch ($rvalue->fetchType) { 
    9581008                            case ZEND_FETCH_GLOBAL: 
     1009                            case ZEND_FETCH_GLOBAL_LOCK: 
    9591010                                $resvar = 'global ' . $lvalue; 
    9601011                                break 2; 
     
    9661017                                    $var = $statics[$name]; 
    9671018                                    $resvar .= ' = '; 
    968                                     $resvar .= str(value($var), $EX); 
     1019                                    $resvar .= toCode(value($var), $EX); 
    9691020                                } 
    9701021                                unset($statics); 
    9711022                                break 2; 
     1023                            default: 
    9721024                            } 
    9731025                        } 
    9741026                    } 
    975                     $rvalue = str($rvalue); 
     1027                    // TODO: PHP_6 global 
     1028                    $rvalue = toCode($rvalue, $EX); 
    9761029                    $resvar = "$lvalue = &$rvalue"; 
    9771030                    break; 
     
    10181071                        } 
    10191072                        else { 
    1020                             $rvalue = "${" . $rvalue . "}"; 
     1073                            $rvalue = '${' . $rvalue . '}'; 
    10211074                        } 
    10221075                        if ($op2['EA.type'] == ZEND_FETCH_STATIC_MEMBER) { 
     
    10441097                    } 
    10451098 
    1046                     switch ((PHP_VERSION < 5 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) { 
     1099                    switch ((!ZEND_ENGINE_2 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) { 
    10471100                    case ZEND_ISSET: 
    10481101                        $rvalue = "isset($rvalue)"; 
     
    11861239                    switch ($opc) { 
    11871240                    case XC_ADD_CHAR: 
    1188                         $op2val = str(chr($op2val), $EX); 
     1241                        $op2val = toCode(chr($op2val), $EX); 
    11891242                        break; 
    11901243                    case XC_ADD_STRING: 
    1191                         $op2val = str($op2val, $EX); 
     1244                        $op2val = toCode($op2val, $EX); 
    11921245                        break; 
    11931246                    case XC_ADD_VAR: 
     
    12261279 
    12271280                    if ($opc == XC_ADD_ARRAY_ELEMENT) { 
    1228                         $offset = $this->getOpVal($op2, $EX); 
    1229                         if (isset($offset)) { 
    1230                             $T[$res['var']]->value[$offset] = $rvalue; 
     1281                        $assoc = $this->getOpVal($op2, $EX); 
     1282                        if (isset($assoc)) { 
     1283                            $T[$res['var']]->value[] = array($assoc, $rvalue); 
    12311284                        } 
    12321285                        else { 
    1233                             $T[$res['var']]->value[] = $rvalue; 
     1286                            $T[$res['var']]->value[] = array(null, $rvalue); 
    12341287                        } 
    12351288                    } 
     
    12421295                        } 
    12431296 
    1244                         $offset = $this->getOpVal($op2, $EX); 
    1245                         if (isset($offset)) { 
    1246                             $resvar->value[$offset] = $rvalue; 
     1297                        $assoc = $this->getOpVal($op2, $EX); 
     1298                        if (isset($assoc)) { 
     1299                            $resvar->value[] = array($assoc, $rvalue); 
    12471300                        } 
    12481301                        else { 
    1249                             $resvar->value[] = $rvalue; 
     1302                            $resvar->value[] = array(null, $rvalue); 
    12501303                        } 
    12511304                    } 
     
    13291382                        $targetop = &$EX['opcodes'][$op2['opline_num']]; 
    13301383                        if ($opc == XC_JMPNZ_EX) { 
    1331                             $targetop['cond_true'][] = str($rvalue); 
     1384                            $targetop['cond_true'][] = toCode($rvalue, $EX); 
    13321385                        } 
    13331386                        else { 
    1334                             $targetop['cond_false'][] = str($rvalue); 
     1387                            $targetop['cond_false'][] = toCode($rvalue, $EX); 
    13351388                        } 
    13361389                        unset($targetop); 
     
    13601413                        $default = null; 
    13611414                    } 
    1362                     $EX['recvs'][$offset] = array($lvalue, $default); 
     1415                    $EX['recvs'][str($offset)] = array($lvalue, $default); 
    13631416                    break; 
    13641417                case XC_POST_DEC: 
     
    14001453                case XC_END_SILENCE: // {{{ 
    14011454                    $EX['silence'] --; 
    1402                     $lastresvar = '@' . str($lastresvar); 
     1455                    $lastresvar = '@' . toCode($lastresvar, $EX); 
    14031456                    break; 
    14041457                    // }}} 
     
    14701523            $a = array_pop($EX['argstack']); 
    14711524            if (is_array($a)) { 
    1472                 array_unshift($args, str($a, $EX)); 
     1525                array_unshift($args, toCode($a, $EX)); 
    14731526            } 
    14741527            else { 
     
    15111564            default: 
    15121565                if ($kk == 'res') { 
     1566                    var_dump($op); 
     1567                    exit; 
    15131568                    assert(0); 
    15141569                } 
     
    15251580    function dargs(&$EX, $indent) // {{{ 
    15261581    { 
    1527         $EX['indent'] = $indent; 
    15281582        $op_array = &$EX['op_array']; 
    15291583 
     
    15441598                echo ', '; 
    15451599            } 
     1600            $arg = $EX['recvs'][$i + 1]; 
    15461601            if (isset($op_array['arg_info'])) { 
    15471602                $ai = $op_array['arg_info'][$i]; 
    15481603                if (!empty($ai['class_name'])) { 
    15491604                    echo $ai['class_name'], ' '; 
    1550                     if ($ai['allow_null']) { 
     1605                    if (!ZEND_ENGINE_2_2 && $ai['allow_null']) { 
    15511606                        echo 'or NULL '; 
    15521607                    } 
     
    15541609                else if (!empty($ai['array_type_hint'])) { 
    15551610                    echo 'array '; 
    1556                     if ($ai['allow_null']) { 
     1611                    if (!ZEND_ENGINE_2_2 && $ai['allow_null']) { 
    15571612                        echo 'or NULL '; 
    15581613                    } 
     
    15831638                    } 
    15841639                } 
    1585                 $arg = $EX['recvs'][$i + 1]; 
    1586                 echo str($arg[0]); 
    1587                 if (isset($arg[1])) { 
    1588                     echo ' = ', str($arg[1]); 
    1589                 } 
     1640                echo toCode($arg[0], $indent); 
     1641            } 
     1642            if (isset($arg[1])) { 
     1643                echo ' = ', toCode($arg[1], $indent); 
    15901644            } 
    15911645        } 
     
    16631717                    echo $newindent; 
    16641718                    echo $prefix, $name, ' = '; 
    1665                     echo str(value($v), $EX); 
     1719                    echo toCode(value($v), $newindent); 
    16661720                    echo ";\n"; 
    16671721                } 
     
    16701724        // }}} 
    16711725        // {{{ properties 
    1672         if (!empty($class['default_properties']) || !empty($class['default_static_members'])) { 
     1726        $member_variables = isset($class['properties_info']) ? $class['properties_info'] : ($class['default_static_members'] + $class['default_properties']); 
     1727        if ($member_variables) { 
    16731728            echo "\n"; 
    16741729            $infos = !empty($class['properties_info']) ? $class['properties_info'] : null; 
    1675             foreach (!empty($class['properties_info']) ? $class['properties_info'] : ($class['default_static_members'] + $class['default_properties']) as $name => $dummy) { 
     1730            foreach ($member_variables as $name => $dummy) { 
    16761731                $info = (isset($infos) && isset($infos[$name])) ? $infos[$name] : null; 
    16771732                if (isset($info)) { 
     
    16991754 
    17001755                $mangled = false; 
    1701                 if (PHP_VERSION < 5) { 
     1756                if (!ZEND_ENGINE_2) { 
    17021757                    echo 'var '; 
    17031758                } 
     
    17261781                echo '$', $name; 
    17271782 
    1728                 $key = isset($info) ? $info['name'] . ($mangled ? "\000" : "") : $name; 
    1729  
    1730                 $value = $class[$static ? 'default_static_members' : 'default_properties'][$key]; 
     1783                if (isset($info['offset'])) { 
     1784                    $value = $class[$static ? 'default_static_members_table' : 'default_properties_table'][$info['offset']]; 
     1785                } 
     1786                else { 
     1787                    $key = isset($info) ? $info['name'] . ($mangled ? "\000" : "") : $name; 
     1788 
     1789                    $value = $class[$static ? 'default_static_members' : 'default_properties'][$key]; 
     1790                } 
    17311791                if (isset($value)) { 
    17321792                    echo ' = '; 
    1733                     echo str(value($value)); 
     1793                    echo toCode(value($value), $newindent); 
    17341794                } 
    17351795                echo ";\n"; 
     
    18561916define('ZEND_ACC_SHADOW', 0x2000); 
    18571917 
    1858 define('ZEND_FETCH_GLOBAL',           0); 
    1859 define('ZEND_FETCH_LOCAL',            1); 
    1860 define('ZEND_FETCH_STATIC',           2); 
    1861 define('ZEND_FETCH_STATIC_MEMBER',    3); 
    1862 define('ZEND_FETCH_GLOBAL_LOCK',      4); 
     1918define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.3.99"); 
     1919define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3."); 
     1920define('ZEND_ENGINE_2_2', ZEND_ENGINE_2_3 || PHP_VERSION >= "5.2."); 
     1921define('ZEND_ENGINE_2_1', ZEND_ENGINE_2_2 || PHP_VERSION >= "5.1."); 
     1922define('ZEND_ENGINE_2',   ZEND_ENGINE_2_1 || PHP_VERSION >= "5.0."); 
     1923 
     1924if (ZEND_ENGINE_2_4) { 
     1925    define('ZEND_FETCH_GLOBAL',           0x00000000); 
     1926    define('ZEND_FETCH_LOCAL',            0x10000000); 
     1927    define('ZEND_FETCH_STATIC',           0x20000000); 
     1928    define('ZEND_FETCH_STATIC_MEMBER',    0x30000000); 
     1929    define('ZEND_FETCH_GLOBAL_LOCK',      0x40000000); 
     1930    define('ZEND_FETCH_LEXICAL',          0x50000000); 
     1931 
     1932    define('ZEND_FETCH_TYPE_MASK',        0x70000000); 
     1933} 
     1934else { 
     1935    define('ZEND_FETCH_GLOBAL',           0); 
     1936    define('ZEND_FETCH_LOCAL',            1); 
     1937    define('ZEND_FETCH_STATIC',           2); 
     1938    define('ZEND_FETCH_STATIC_MEMBER',    3); 
     1939    define('ZEND_FETCH_GLOBAL_LOCK',      4); 
     1940} 
    18631941 
    18641942define('ZEND_FETCH_CLASS_DEFAULT',    0); 
     
    18701948define('ZEND_FETCH_CLASS_INTERFACE',  6); 
    18711949define('ZEND_FETCH_CLASS_STATIC',     7); 
     1950if (ZEND_ENGINE_2_4) { 
     1951    define('ZEND_FETCH_CLASS_TRAIT',     14); 
     1952} 
     1953if (ZEND_ENGINE_2_3) { 
     1954    define('ZEND_FETCH_CLASS_MASK',     0xF); 
     1955} 
    18721956 
    18731957define('ZEND_EVAL',               (1<<0)); 
     
    18791963define('ZEND_ISSET',              (1<<0)); 
    18801964define('ZEND_ISEMPTY',            (1<<1)); 
    1881 define('EXT_TYPE_UNUSED',         (1<<0)); 
     1965if (ZEND_ENGINE_2_4) { 
     1966    define('EXT_TYPE_UNUSED',     (1<<5)); 
     1967} 
     1968else { 
     1969    define('EXT_TYPE_UNUSED',     (1<<0)); 
     1970} 
    18821971 
    18831972define('ZEND_FETCH_STANDARD',     0); 
  • branches/1.3/phpdop.phpr

    r604 r739  
    33 
    44$srcdir = dirname(__FILE__); 
     5require_once("$srcdir/Decompiler.class.php"); 
    56if (file_exists("$srcdir/phpdc.debug.php")) { 
    67    include("$srcdir/phpdc.debug.php"); 
     
    1112    switch ($op['op_type']) { 
    1213    case 1: // CONST 
    13         return var_export($op['u.constant'], true); 
     14        return var_export($op['constant'], true); 
    1415 
    1516    case 2: // IS_TMP_VAR 
    16         return 't@' . $op['u.var']; 
     17        return 't@' . $op['var']; 
    1718 
    1819    case 4: 
    19         return 'v$' . $op['u.var']; 
     20        return 'v$' . $op['var']; 
    2021 
    2122    case 8: // UNUSED 
    22         if (isset($op['u.opline_num'])) { 
    23             return 'l#' . $op['u.opline_num']; 
     23        if (isset($op['opline_num'])) { 
     24            return 'l#' . $op['opline_num']; 
    2425        } 
    2526        else { 
     
    2829 
    2930    default: 
    30         return $op['op_type'] . $op['u.var']; 
     31        return $op['op_type'] . $op['var']; 
    3132    } 
    3233} 
    3334 
    34 function dump_opcodes($op_array, $indent = '') 
     35function dump_opcodes($opcodes, $indent = '') 
    3536{ 
     37    global $decompiler; 
     38 
    3639    $types = array('result' => 5, 'op1' => 20, 'op2' => 20); 
    37     foreach ($op_array as $line => $op) { 
     40    foreach ($decompiler->fixOpcode($opcodes) as $line => $op) { 
    3841        echo $indent; 
    3942        echo sprintf("%3d ", $op['lineno']); 
     
    9194    die("Usage: $argv[0] <file>\n"); 
    9295} 
     96$decompiler = new Decompiler(); 
    9397$pk = xcache_dasm_file($argv[1]); 
    9498$op_array = $funcs = $classes = null; 
  • branches/1.3/processor/head.m4

    r726 r739  
    136136#define C_RELAYLINE , __LINE__ 
    137137') 
    138 static inline void xc_calc_string_n(xc_processor_t *processor, zend_uchar type, const zstr str, long size IFASSERT(`, int relayline')) { 
     138static inline void xc_calc_string_n(xc_processor_t *processor, zend_uchar type, const zstr const str, long size IFASSERT(`, int relayline')) { 
    139139    pushdef(`__LINE__', `relayline') 
    140140    int realsize = UNISW(size, (type == IS_UNICODE) ? UBYTES(size) : size); 
     
    158158/* {{{ xc_store_string_n */ 
    159159REDEF(`KIND', `store') 
    160 static inline zstr xc_store_string_n(xc_processor_t *processor, zend_uchar type, const zstr str, long size IFASSERT(`, int relayline')) { 
     160static inline zstr xc_store_string_n(xc_processor_t *processor, zend_uchar type, const zstr const str, long size IFASSERT(`, int relayline')) { 
    161161    pushdef(`__LINE__', `relayline') 
    162162    int realsize = UNISW(size, (type == IS_UNICODE) ? UBYTES(size) : size); 
  • branches/1.3/processor/processor.m4

    r726 r739  
    325325#ifdef ZEND_ENGINE_2_4 
    326326    DISPATCH(int, default_properties_count) 
    327     STRUCT_ARRAY(default_properties_count, zval, default_properties_table) 
     327    STRUCT_ARRAY(default_properties_count, zval_ptr, default_properties_table) 
    328328    DISPATCH(int, default_static_members_count) 
    329     STRUCT_ARRAY(default_static_members_count, zval, default_static_members_table) 
    330     IFCOPY(`dst->static_members_table = &dst->default_static_members_table;') 
     329    STRUCT_ARRAY(default_static_members_count, zval_ptr, default_static_members_table) 
     330    IFCOPY(`dst->static_members_table = dst->default_static_members_table;') 
    331331    DONE(static_members_table) 
    332332#else 
Note: See TracChangeset for help on using the changeset viewer.