Ignore:
Timestamp:
2011-04-09T14:59:31+02:00 (4 years ago)
Author:
moo
Message:

merge from trunk

Location:
branches/1.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/1.3

  • branches/1.3/Decompiler.class.php

    r623 r726  
    2828 
    2929    if (is_array($src)) { 
    30         die_error('array str'); 
    31         $src = new Decompiler_Array($src, false, $indent); 
     30        exit('array str'); 
     31        $src = new Decompiler_Array($src, $indent); 
    3232        return $src->__toString(); 
    3333    } 
     
    3636        if (!method_exists($src, '__toString')) { 
    3737            var_dump($src); 
    38             die_error('no __toString'); 
    39         } 
    40         return $src->__toString($indent); 
     38            exit('no __toString'); 
     39        } 
     40        return $src->__toString(); 
    4141    } 
    4242 
     
    5555    } 
    5656 
    57     if (is_array($value)) { 
    58         $value = new Decompiler_Array($value, true); 
     57    if ($value instanceof Decompiler_Object) { 
     58        // use as is 
     59    } 
     60    else if (is_array($value)) { 
     61        $value = new Decompiler_Array($value); 
    5962    } 
    6063    else { 
    61         $value = new Decompiler_Value($value, true); 
     64        $value = new Decompiler_Value($value); 
    6265    } 
    6366    return $value; 
     
    257260class Decompiler_Array extends Decompiler_Value // {{{ 
    258261{ 
    259     var $needExport = false; 
    260262    var $indent = ''; 
    261263 
    262     function Decompiler_Array($value = array(), $needexport = false, $indent = '') 
     264    function Decompiler_Array($value = array(), $indent = '') 
    263265    { 
    264266        $this->value = $value; 
    265         $this->needExport = $needexport; 
    266267        $this->indent = $indent; 
    267268    } 
     
    286287            ++ $i; 
    287288        } 
    288         if ($assoclen && $this->needExport) { 
     289        if ($assoclen) { 
    289290            $assoclen += 2; 
    290291        } 
     
    306307            } 
    307308 
    308             if ($this->needExport) { 
    309                 $k = var_export($k, true); 
    310             } 
     309            $k = var_export($k, true); 
    311310            if ($multiline) { 
    312311                $exp .= sprintf("%{$assoclen}s => ", $k); 
     
    316315            } 
    317316 
    318             if (is_array($v)) { 
    319                 $v = new Decompiler_Array($v, $this->needExport); 
    320             } 
    321             $exp .= str($v, $subindent); 
     317            $exp .= str(value($v), $subindent); 
    322318 
    323319            $i ++; 
     
    433429        switch ($op['op_type']) { 
    434430        case XC_IS_CONST: 
    435             return str(value($op['u.constant'])); 
     431            return str(value($op['constant'])); 
    436432 
    437433        case XC_IS_VAR: 
    438434        case XC_IS_TMP_VAR: 
    439435            $T = &$EX['Ts']; 
    440             $ret = $T[$op['u.var']]; 
     436            $ret = $T[$op['var']]; 
    441437            if ($tostr) { 
    442438                $ret = str($ret, $EX); 
    443439            } 
    444440            if ($free) { 
    445                 unset($T[$op['u.var']]); 
     441                unset($T[$op['var']]); 
    446442            } 
    447443            return $ret; 
    448444 
    449445        case XC_IS_CV: 
    450             $var = $op['u.var']; 
     446            $var = $op['var']; 
    451447            $var = $EX['op_array']['vars'][$var]; 
    452448            return '$' . $var['name']; 
     
    455451            return null; 
    456452        } 
     453    } 
     454    // }}} 
     455    function removeKeyPrefix($array, $prefix) // {{{ 
     456    { 
     457        $prefixLen = strlen($prefix); 
     458        $ret = array(); 
     459        foreach ($array as $key => $value) { 
     460            if (substr($key, 0, $prefixLen) == $prefix) { 
     461                $key = substr($key, $prefixLen); 
     462            } 
     463            $ret[$key] = $value; 
     464        } 
     465        return $ret; 
    457466    } 
    458467    // }}} 
     
    465474        } 
    466475        $EX['indent'] = ''; 
    467         //for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 
    468         //  $opcodes[$i]['opcode'] = xcache_get_fixed_opcode($opcodes[$i]['opcode'], $i); 
    469         //} 
     476        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 
     477            if (function_exists('xcache_get_fixed_opcode')) { 
     478                $opcodes[$i]['opcode'] = xcache_get_fixed_opcode($opcodes[$i]['opcode'], $i); 
     479            } 
     480            if (isset($opcodes[$i]['op1'])) { 
     481                $opcodes[$i]['op1'] = $this->removeKeyPrefix($opcodes[$i]['op1'], 'u.'); 
     482                $opcodes[$i]['op2'] = $this->removeKeyPrefix($opcodes[$i]['op2'], 'u.'); 
     483                $opcodes[$i]['result'] = $this->removeKeyPrefix($opcodes[$i]['result'], 'u.'); 
     484            } 
     485            else { 
     486                $op = array( 
     487                    'op1' => array(), 
     488                    'op2' => array(), 
     489                    'op3' => array(), 
     490                ); 
     491                foreach ($opcodes[$i] as $name => $value) { 
     492                    if (preg_match('!^(op1|op2|result)\\.(.*)!', $name, $m)) { 
     493                        list(, $which, $field) = $m; 
     494                        $op[$which][$field] = $value; 
     495                    } 
     496                    else if (preg_match('!^(op1|op2|result)_type$!', $name, $m)) { 
     497                        list(, $which) = $m; 
     498                        $op[$which]['op_type'] = $value; 
     499                    } 
     500                    else { 
     501                        $op[$name] = $value; 
     502                    } 
     503                } 
     504                $opcodes[$i] = $op; 
     505            } 
     506        } 
    470507        // {{{ build jmp array 
    471508        for ($i = 0, $cnt = count($opcodes); $i < $cnt; $i ++) { 
     
    481518            switch ($op['opcode']) { 
    482519            case XC_JMP: 
    483                 $target = $op['op1']['u.var']; 
     520                $target = $op['op1']['var']; 
    484521                $op['jmpouts'] = array($target); 
    485522                $opcodes[$target]['jmpins'][] = $i; 
     
    487524 
    488525            case XC_JMPZNZ: 
    489                 $jmpz = $op['op2']['u.opline_num']; 
     526                $jmpz = $op['op2']['opline_num']; 
    490527                $jmpnz = $op['extended_value']; 
    491528                $op['jmpouts'] = array($jmpz, $jmpnz); 
     
    501538            case XC_FE_FETCH: 
    502539            // case XC_JMP_NO_CTOR: 
    503                 $target = $op['op2']['u.opline_num']; 
     540                $target = $op['op2']['opline_num']; 
    504541                //if (!isset($target)) { 
    505542                //  $this->dumpop($op, $EX); 
     
    539576        // func call 
    540577        $EX['object'] = null; 
     578        $EX['called_scope'] = null; 
    541579        $EX['fbc'] = null; 
    542580        $EX['argstack'] = array(); 
     
    588626        if ($op['opcode'] == XC_FE_FETCH) { 
    589627            $opline = $next; 
    590             $next = $op['op2']['u.opline_num']; 
     628            $next = $op['op2']['opline_num']; 
    591629            $end = $next - 1; 
    592630 
     
    607645        /* 
    608646        if ($op['opcode'] == XC_JMPZ) { 
    609             $target = $op2['u.opline_num']; 
     647            $target = $op2['opline_num']; 
    610648            if ($line + 1) { 
    611649                $nextblock = $EX['nextbbs'][$next]; 
    612650                $jmpop = end($nextblock); 
    613651                if ($jmpop['opcode'] == XC_JMP) { 
    614                     $ifendline = $op2['u.opline_num']; 
     652                    $ifendline = $op2['opline_num']; 
    615653                    if ($ifendline >= $line) { 
    616654                        $cond = $op['cond']; 
     
    657695                } 
    658696 
    659                 $var = $fromop['result']['u.var']; 
     697                $var = $fromop['result']['var']; 
    660698                var_dump($EX['Ts'][$var]); 
    661699                $EX['Ts'][$var] = '(' . $fromop['and_or'] . " $opstr " . $EX['Ts'][$var] . ')'; 
     
    719757 
    720758            $resvar = null; 
    721             if (($res['u.EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) { 
     759            if (isset($res['EA.type']) && ($res['EA.type'] & EXT_TYPE_UNUSED) || $res['op_type'] == XC_IS_UNUSED) { 
    722760                $istmpres = false; 
    723761            } 
     
    749787                switch ($opc) { 
    750788                case XC_NEW: // {{{ 
    751                     array_push($EX['arg_types_stack'], array($EX['object'], $EX['fbc'])); 
    752                     $EX['object'] = (int) $res['u.var']; 
     789                    array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
     790                    $EX['object'] = (int) $res['var']; 
     791                    $EX['called_scope'] = null; 
    753792                    $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX)); 
    754793                    if (PHP_VERSION < 5) { 
     
    765804                        case ZEND_FETCH_CLASS_PARENT: 
    766805                            $class = 'parent'; 
    767                         } 
     806                            break; 
     807                        case ZEND_FETCH_CLASS_STATIC: 
     808                            $class = 'static'; 
     809                            break; 
     810                        } 
     811                        $istmpres = true; 
    768812                    } 
    769813                    else { 
    770                         $class = $op2['u.constant']; 
     814                        $class = $op2['constant']; 
    771815                        if (is_object($class)) { 
    772816                            $class = get_class($class); 
     
    778822                case XC_FETCH_CONSTANT: // {{{ 
    779823                    if ($op1['op_type'] == XC_IS_CONST) { 
    780                         $resvar = $op1['u.constant']; 
     824                        $resvar = $op1['constant']; 
    781825                    } 
    782826                    else if ($op1['op_type'] == XC_IS_UNUSED) { 
    783                         $resvar = $op2['u.constant']; 
     827                        $resvar = $op2['constant']; 
    784828                    } 
    785829                    else { 
    786                         $class = $T[$op1['u.var']]; 
     830                        $class = $T[$op1['var']]; 
    787831                        assert($class[0] == 'class'); 
    788                         $resvar = $class[1] . '::' . $op2['u.constant']; 
     832                        $resvar = $class[1] . '::' . $op2['constant']; 
    789833                    } 
    790834                    break; 
     
    799843                case XC_UNSET_VAR: 
    800844                    $rvalue = $this->getOpVal($op1, $EX); 
    801                     $fetchtype = $op2[PHP_VERSION < 5 ? 'u.fetch_type' : 'u.EA.type']; 
     845                    $fetchtype = $op2[PHP_VERSION < 5 ? 'fetch_type' : 'EA.type']; 
    802846                    switch ($fetchtype) { 
    803847                    case ZEND_FETCH_STATIC_MEMBER: 
     
    845889 
    846890                            $src = new Decompiler_ListBox($list); 
    847                             if (!isset($op1['u.var'])) { 
     891                            if (!isset($op1['var'])) { 
    848892                                $this->dumpop($op, $EX); 
    849893                                var_dump($op); 
    850                                 die('missing u.var'); 
     894                                die('missing var'); 
    851895                            } 
    852                             $T[$op1['u.var']] = $src; 
     896                            $T[$op1['var']] = $src; 
    853897                            unset($list); 
    854898                        } 
     
    890934                        $type = $rvalue->iskey ? 'fe_key' : 'fe_as'; 
    891935                        $rvalue->obj[$type] = $lvalue; 
    892                         unset($T[$op2['u.var']]); 
     936                        unset($T[$op2['var']]); 
    893937                        break; 
    894938                    } 
     
    9761020                            $rvalue = "${" . $rvalue . "}"; 
    9771021                        } 
    978                         if ($op2['u.EA.type'] == ZEND_FETCH_STATIC_MEMBER) { 
     1022                        if ($op2['EA.type'] == ZEND_FETCH_STATIC_MEMBER) { 
    9791023                            $class = $this->getOpVal($op2, $EX); 
    9801024                            $rvalue = $class . '::' . $rvalue; 
     
    9871031                        $container = $this->getOpVal($op1, $EX); 
    9881032                        $dim = $this->getOpVal($op2, $EX); 
    989                         $rvalue = $container . "[$dim]"; 
    990                     } 
    991  
    992                     switch (PHP_VERSION < 5 ? $op['op2']['u.var'] /* u.constant */ : $ext) { 
     1033                        if ($opc == XC_ISSET_ISEMPTY_PROP_OBJ) { 
     1034                            if (preg_match($this->rQuotedName, $dim)) { 
     1035                                $rvalue = $container . "->" . substr($dim, 1, -1); 
     1036                            } 
     1037                            else { 
     1038                                $rvalue = $container . "->{" . $dim . "}"; 
     1039                            } 
     1040                        } 
     1041                        else { 
     1042                            $rvalue = $container . "[$dim]"; 
     1043                        } 
     1044                    } 
     1045 
     1046                    switch ((PHP_VERSION < 5 ? $op['op2']['var'] /* constant */ : $ext) & (ZEND_ISSET|ZEND_ISEMPTY)) { 
    9931047                    case ZEND_ISSET: 
    9941048                        $rvalue = "isset($rvalue)"; 
     
    9971051                        $rvalue = "empty($rvalue)"; 
    9981052                        break; 
    999                     default: 
    1000                         $this->dumpop($op, $EX); 
    1001                         die_error('1'); 
    10021053                    } 
    10031054                    $resvar = $rvalue; 
     
    10121063                    break; 
    10131064                    // }}} 
     1065                case XC_INIT_STATIC_METHOD_CALL: 
    10141066                case XC_INIT_METHOD_CALL: 
    10151067                case XC_INIT_FCALL_BY_FUNC: 
     
    10181070                        break; 
    10191071                    } 
    1020                     array_push($EX['arg_types_stack'], array($EX['object'], $EX['fbc'])); 
    1021                     if ($opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
     1072                    array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
     1073                    if ($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
    10221074                        $obj = $this->getOpVal($op1, $EX); 
    10231075                        if (!isset($obj)) { 
    10241076                            $obj = '$this'; 
    10251077                        } 
    1026                         $EX['object'] = $obj; 
     1078                        if ($opc == XC_INIT_STATIC_METHOD_CALL || /* PHP4 */ isset($op1['constant'])) { 
     1079                            $EX['object'] = null; 
     1080                            $EX['called_scope'] = $this->unquoteName($obj); 
     1081                        } 
     1082                        else { 
     1083                            $EX['object'] = $obj; 
     1084                            $EX['called_scope'] = null; 
     1085                        } 
    10271086                        if ($res['op_type'] != XC_IS_UNUSED) { 
    10281087                            $resvar = '$obj call$'; 
     
    10311090                    else { 
    10321091                        $EX['object'] = null; 
     1092                        $EX['called_scope'] = null; 
    10331093                    } 
    10341094 
    10351095                    if ($opc == XC_INIT_FCALL_BY_FUNC) { 
    1036                         $which = $op1['u.var']; 
     1096                        $which = $op1['var']; 
    10371097                        $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 
    10381098                    } 
     
    10431103                    // }}} 
    10441104                case XC_DO_FCALL_BY_FUNC: 
    1045                     $which = $op1['u.var']; 
     1105                    $which = $op1['var']; 
    10461106                    $fname = $EX['op_array']['funcs'][$which]['name']; 
    10471107                    $args = $this->popargs($EX, $ext); 
     
    10651125                    $resvar = 
    10661126                        (isset($object) ? $object . '->' : '' ) 
     1127                        . (isset($EX['called_scope']) ? $EX['called_scope'] . '::' : '' ) 
    10671128                        . $fname . "($args)"; 
    10681129                    unset($args); 
     
    10721133                        $resvar = null; 
    10731134                    } 
    1074                     list($EX['object'], $EX['fbc']) = array_pop($EX['arg_types_stack']); 
     1135                    list($EX['fbc'], $EX['object'], $EX['called_scope']) = array_pop($EX['arg_types_stack']); 
    10751136                    break; 
    10761137                    // }}} 
    10771138                case XC_VERIFY_ABSTRACT_CLASS: // {{{ 
    1078                     //unset($T[$op1['u.var']]); 
     1139                    //unset($T[$op1['var']]); 
    10791140                    break; 
    10801141                    // }}} 
    10811142                case XC_DECLARE_CLASS:  
    1082                 case XC_DECLARE_INHERITED_CLASS: // {{{ 
    1083                     $key = $op1['u.constant']; 
     1143                case XC_DECLARE_INHERITED_CLASS: 
     1144                case XC_DECLARE_INHERITED_CLASS_DELAYED: // {{{ 
     1145                    $key = $op1['constant']; 
     1146                    if (!isset($this->dc['class_table'][$key])) { 
     1147                        echo 'class not found: ', $key, 'existing classes are:', "\n"; 
     1148                        var_dump(array_keys($this->dc['class_table'])); 
     1149                        exit; 
     1150                    } 
    10841151                    $class = &$this->dc['class_table'][$key]; 
    1085                     if (!isset($class)) { 
    1086                         echo 'class not found: ' . $key; 
    1087                         exit; 
    1088                     } 
    10891152                    $class['name'] = $this->unquoteName($this->getOpVal($op2, $EX)); 
    1090                     if ($opc == XC_DECLARE_INHERITED_CLASS) { 
     1153                    if ($opc == XC_DECLARE_INHERITED_CLASS || $opc == XC_DECLARE_INHERITED_CLASS_DELAYED) { 
    10911154                        $ext /= XC_SIZEOF_TEMP_VARIABLE; 
    10921155                        $class['parent'] = $T[$ext]; 
     
    10991162                    while ($i + 2 < $ic 
    11001163                     && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 
    1101                      && $opcodes[$i + 2]['op1']['u.var'] == $res['u.var'] 
     1164                     && $opcodes[$i + 2]['op1']['var'] == $res['var'] 
    11021165                     && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 
    11031166                        $fetchop = &$opcodes[$i + 1]; 
     
    11651228                        $offset = $this->getOpVal($op2, $EX); 
    11661229                        if (isset($offset)) { 
    1167                             $T[$res['u.var']]->value[$offset] = $rvalue; 
     1230                            $T[$res['var']]->value[$offset] = $rvalue; 
    11681231                        } 
    11691232                        else { 
    1170                             $T[$res['u.var']]->value[] = $rvalue; 
     1233                            $T[$res['var']]->value[] = $rvalue; 
    11711234                        } 
    11721235                    } 
     
    12021265                    // }}} 
    12031266                case XC_INCLUDE_OR_EVAL: // {{{ 
    1204                     $type = $op2['u.var']; // hack 
     1267                    $type = $op2['var']; // hack 
    12051268                    $keyword = $this->includeTypes[$type]; 
    12061269                    $resvar = "$keyword(" . $this->getOpVal($op1, $EX) . ")"; 
     
    12151278                    $fe = new Decompiler_ForeachBox($op); 
    12161279                    $fe->iskey = false; 
    1217                     $T[$res['u.var']] = $fe; 
     1280                    $T[$res['var']] = $fe; 
    12181281 
    12191282                    ++ $i; 
     
    12231286 
    12241287                        $res = $opcodes[$i]['result']; 
    1225                         $T[$res['u.var']] = $fe; 
     1288                        $T[$res['var']] = $fe; 
    12261289                    } 
    12271290                    break; 
    12281291                    // }}} 
    12291292                case XC_SWITCH_FREE: // {{{ 
    1230                     // unset($T[$op1['u.var']]); 
     1293                    // unset($T[$op1['var']]); 
    12311294                    break; 
    12321295                    // }}} 
    12331296                case XC_FREE: // {{{ 
    1234                     $free = $T[$op1['u.var']]; 
     1297                    $free = $T[$op1['var']]; 
    12351298                    if (!is_a($free, 'Decompiler_Array') && !is_a($free, 'Decompiler_Box')) { 
    12361299                        $op['php'] = is_object($free) ? $free : $this->unquote($free, '(', ')'); 
    12371300                        $lastphpop = &$op; 
    12381301                    } 
    1239                     unset($T[$op1['u.var']], $free); 
     1302                    unset($T[$op1['var']], $free); 
    12401303                    break; 
    12411304                    // }}} 
     
    12601323                    } 
    12611324                    if (isset($op['cond_false'])) { 
     1325                        echo "TODO(cond_false):\n"; 
    12621326                        var_dump($op);// exit; 
    12631327                    } 
    12641328                    if ($opc == XC_JMPZ_EX || $opc == XC_JMPNZ_EX || $opc == XC_JMPZ) { 
    1265                         $targetop = &$EX['opcodes'][$op2['u.opline_num']]; 
     1329                        $targetop = &$EX['opcodes'][$op2['opline_num']]; 
    12661330                        if ($opc == XC_JMPNZ_EX) { 
    12671331                            $targetop['cond_true'][] = str($rvalue); 
     
    12911355                    $lvalue = $this->getOpVal($op['result'], $EX); 
    12921356                    if ($opc == XC_RECV_INIT) { 
    1293                         $default = value($op['op2']['u.constant']); 
     1357                        $default = value($op['op2']['constant']); 
    12941358                    } 
    12951359                    else { 
     
    13771441            if (isset($resvar)) { 
    13781442                if ($istmpres) { 
    1379                     $T[$res['u.var']] = $resvar; 
    1380                     $lastresvar = &$T[$res['u.var']]; 
     1443                    $T[$res['var']] = $resvar; 
     1444                    $lastresvar = &$T[$res['var']]; 
    13811445                } 
    13821446                else { 
     
    14241488            switch ($op[$k]['op_type']) { 
    14251489            case XC_IS_UNUSED: 
    1426                 $d[$kk] = '*UNUSED* ' . $op[$k]['u.opline_num']; 
     1490                $d[$kk] = '*UNUSED* ' . $op[$k]['opline_num']; 
    14271491                break; 
    14281492 
    14291493            case XC_IS_VAR: 
    1430                 $d[$kk] = '$' . $op[$k]['u.var']; 
     1494                $d[$kk] = '$' . $op[$k]['var']; 
    14311495                if ($kk != 'res') { 
    14321496                    $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX); 
     
    14351499 
    14361500            case XC_IS_TMP_VAR: 
    1437                 $d[$kk] = '#' . $op[$k]['u.var']; 
     1501                $d[$kk] = '#' . $op[$k]['var']; 
    14381502                if ($kk != 'res') { 
    14391503                    $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX); 
     
    16081672        if (!empty($class['default_properties'])) { 
    16091673            echo "\n"; 
    1610             $infos = empty($class['properties_info']) ? null : $class['properties_info']; 
    1611             foreach ($class['default_properties'] as $name => $v) { 
     1674            $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) { 
    16121676                $info = (isset($infos) && isset($infos[$name])) ? $infos[$name] : null; 
    16131677                if (isset($info)) { 
     
    16201684 
    16211685                echo $newindent; 
     1686                $static = false; 
     1687                if (isset($info)) { 
     1688                    if ($info['flags'] & ZEND_ACC_STATIC) { 
     1689                        $static = true; 
     1690                    } 
     1691                } 
     1692                else if (isset($class['default_static_members'][$name])) { 
     1693                    $static = true; 
     1694                } 
     1695 
     1696                if ($static) { 
     1697                    echo "static "; 
     1698                } 
     1699 
     1700                $mangled = false; 
    16221701                if (PHP_VERSION < 5) { 
    16231702                    echo 'var '; 
     
    16361715                    case ZEND_ACC_PRIVATE: 
    16371716                        echo "private "; 
     1717                        $mangled = true; 
    16381718                        break; 
    16391719                    case ZEND_ACC_PROTECTED: 
    16401720                        echo "protected "; 
     1721                        $mangled = true; 
    16411722                        break; 
    16421723                    } 
    1643                     if ($info['flags'] & ZEND_ACC_STATIC) { 
    1644                         echo "static "; 
    1645                     } 
    16461724                } 
    16471725 
    16481726                echo '$', $name; 
    1649                 if (isset($v)) { 
     1727 
     1728                $key = isset($info) ? $info['name'] . ($mangled ? "\000" : "") : $name; 
     1729 
     1730                $value = $class[$static ? 'default_static_members' : 'default_properties'][$key]; 
     1731                if (isset($value)) { 
    16501732                    echo ' = '; 
    1651                     echo str(value($v)); 
     1733                    echo str(value($value)); 
    16521734                } 
    16531735                echo ";\n"; 
     
    17871869define('ZEND_FETCH_CLASS_AUTO',       5); 
    17881870define('ZEND_FETCH_CLASS_INTERFACE',  6); 
     1871define('ZEND_FETCH_CLASS_STATIC',     7); 
    17891872 
    17901873define('ZEND_EVAL',               (1<<0)); 
     
    18521935    'XC_ISSET_ISEMPTY_PROP_OBJ' => -1, 
    18531936    'XC_ISSET_ISEMPTY_VAR' => -1, 
     1937    'XC_INIT_STATIC_METHOD_CALL' => -1, 
    18541938    'XC_INIT_METHOD_CALL' => -1, 
    18551939    'XC_VERIFY_ABSTRACT_CLASS' => -1, 
    18561940    'XC_DECLARE_CLASS' => -1, 
    18571941    'XC_DECLARE_INHERITED_CLASS' => -1, 
     1942    'XC_DECLARE_INHERITED_CLASS_DELAYED' => -1, 
    18581943    'XC_ADD_INTERFACE' => -1, 
    18591944    'XC_POST_DEC_OBJ' => -1, 
Note: See TracChangeset for help on using the changeset viewer.