Ignore:
Timestamp:
2011-04-16T21:01:39+02:00 (4 years ago)
Author:
moo
Message:

decompiler: massive improvements for php 5 and 5.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Decompiler.class.php

    r746 r749  
    7171} 
    7272// }}} 
     73function unquoteProperty($str, $indent = '') // {{{ 
     74{ 
     75    $str = str($str, $indent); 
     76    if (preg_match("!^'[\\w_][\\w\\d_]*'\$!", $str)) { 
     77        return substr($str, 1, -1); 
     78    } 
     79    else { 
     80        return "{" . $str . "}"; 
     81    } 
     82} 
     83// }}} 
     84function unquoteName($str, $indent = '') // {{{ 
     85{ 
     86    $str = str($str, $indent); 
     87    if (preg_match("!^'[\\w_][\\w\\d_]*'\$!", $str)) { 
     88        return substr($str, 1, -1); 
     89    } 
     90    else { 
     91        return $str; 
     92    } 
     93} 
     94// }}} 
    7395class Decompiler_Object // {{{ 
    7496{ 
     
    154176            return '$' . substr($this->src, 1, -1); 
    155177        case ZEND_FETCH_STATIC: 
     178            if (ZEND_ENGINE_2_3) { 
     179                // closure local variable? 
     180                return str($this->src); 
     181            } 
    156182            die('static fetch cant to string'); 
    157183        case ZEND_FETCH_GLOBAL: 
     
    184210    var $offsets = array(); 
    185211    var $isLast = false; 
     212    var $isObject = false; 
    186213    var $assign = null; 
    187214 
     
    189216    { 
    190217        if (is_a($this->value, 'Decompiler_ListBox')) { 
    191             $exp = foldToCode($this->value->obj->src, $indent); 
     218            $exp = str($this->value->obj->src, $indent); 
    192219        } 
    193220        else { 
    194             $exp = foldToCode($this->value, $indent); 
    195         } 
    196         foreach ($this->offsets as $dim) { 
    197             $exp .= '[' . foldToCode($dim, $indent) . ']'; 
     221            $exp = str($this->value, $indent); 
     222        } 
     223        $last = count($this->offsets) - 1; 
     224        foreach ($this->offsets as $i => $dim) { 
     225            if ($this->isObject && $i == $last) { 
     226                $exp .= '->' . unquoteProperty($dim, $indent); 
     227            } 
     228            else { 
     229                $exp .= '[' . str($dim, $indent) . ']'; 
     230            } 
    198231        } 
    199232        return $exp; 
     
    220253                return foldToCode($dim, $indent); 
    221254            } 
    222             return foldToCode($this->dims[0]->assign, $indent) . ' = ' . foldToCode($dim, $indent); 
     255            return foldToCode($this->dims[0]->assign, $indent) . ' = ' . str($dim, $indent); 
    223256        } 
    224257        /* flatten dims */ 
     
    231264            $assign = foldToCode($dim->assign, $indent); 
    232265        } 
    233         return $this->toList($assigns) . ' = ' . foldToCode($this->src, $indent); 
     266        return $this->toList($assigns) . ' = ' . str($this->src, $indent); 
    234267    } 
    235268 
     
    377410{ 
    378411    var $rName = '!^[\\w_][\\w\\d_]*$!'; 
    379     var $rQuotedName = "!^'[\\w_][\\w\\d_]*'\$!"; 
    380412 
    381413    function Decompiler() 
     
    439471                    $curticks = $toticks; 
    440472                    if (!$curticks) { 
    441                         echo $origindent, "}\n"; 
     473                        echo $origindent, "}\n\n"; 
    442474                        $indent = $origindent; 
    443475                    } 
    444476                    else { 
    445477                        if ($oldticks) { 
    446                             echo $origindent, "}\n"; 
     478                            echo $origindent, "}\n\n"; 
    447479                        } 
    448480                        else if (!$oldticks) { 
     
    569601            $op['line'] = $i; 
    570602            switch ($op['opcode']) { 
     603            case XC_GOTO: 
    571604            case XC_JMP: 
    572605                $target = $op['op1']['var']; 
     
    587620            case XC_JMPZ_EX: 
    588621            case XC_JMPNZ_EX: 
     622            case XC_JMP_SET: 
    589623            // case XC_FE_RESET: 
    590624            case XC_FE_FETCH: 
     
    772806    } 
    773807    // }}} 
    774     function unquoteName($str) // {{{ 
    775     { 
    776         $str = str($str); 
    777         if (preg_match($this->rQuotedName, $str)) { 
    778             $str = substr($str, 1, -1); 
    779         } 
    780         return $str; 
    781     } 
    782     // }}} 
    783808    function dasmBasicBlock(&$EX, $opline, $last) // {{{ 
    784809    { 
     
    843868                    $EX['object'] = (int) $res['var']; 
    844869                    $EX['called_scope'] = null; 
    845                     $EX['fbc'] = 'new ' . $this->unquoteName($this->getOpVal($op1, $EX)); 
     870                    $EX['fbc'] = 'new ' . unquoteName($this->getOpVal($op1, $EX), $EX); 
    846871                    if (!ZEND_ENGINE_2) { 
    847872                        $resvar = '$new object$'; 
    848873                    } 
     874                    break; 
     875                    // }}} 
     876                case XC_THROW: // {{{ 
     877                    $resvar = 'throw ' . str($this->getOpVal($op1, $EX)); 
     878                    break; 
     879                    // }}} 
     880                case XC_CLONE: // {{{ 
     881                    $resvar = 'clone ' . str($this->getOpVal($op1, $EX)); 
     882                    break; 
     883                    // }}} 
     884                case XC_CATCH: // {{{ 
     885                    $resvar = 'catch (' . str($this->getOpVal($op1, $EX)) . ' ' . str($this->getOpVal($op2, $EX)) . ')'; 
     886                    break; 
     887                    // }}} 
     888                case XC_INSTANCEOF: // {{{ 
     889                    $resvar = str($this->getOpVal($op1, $EX)) . ' instanceof ' . str($this->getOpVal($op2, $EX)); 
    849890                    break; 
    850891                    // }}} 
     
    865906                    } 
    866907                    else { 
    867                         $class = $op2['constant']; 
    868                         if (is_object($class)) { 
    869                             $class = get_class($class); 
     908                        $class = $this->getOpVal($op2, $EX); 
     909                        if (isset($op2['constant'])) { 
     910                            $class = unquoteName($class); 
    870911                        } 
    871912                    } 
     
    874915                    // }}} 
    875916                case XC_FETCH_CONSTANT: // {{{ 
     917                    if ($op1['op_type'] == XC_IS_UNUSED) { 
     918                        $resvar = $op2['constant']; 
     919                        break; 
     920                    } 
     921 
    876922                    if ($op1['op_type'] == XC_IS_CONST) { 
    877923                        $resvar = $op1['constant']; 
    878924                    } 
    879                     else if ($op1['op_type'] == XC_IS_UNUSED) { 
    880                         $resvar = $op2['constant']; 
    881                     } 
    882925                    else { 
    883                         $class = $T[$op1['var']]; 
    884                         assert($class[0] == 'class'); 
    885                         $resvar = $class[1] . '::' . $op2['constant']; 
    886                     } 
     926                        $resvar = $this->getOpVal($op1, $EX); 
     927                    } 
     928 
     929                    $resvar = str($resvar) . '::' . unquoteName($this->getOpVal($op2, $EX)); 
    887930                    break; 
    888931                    // }}} 
     
    905948                    case ZEND_FETCH_STATIC_MEMBER: 
    906949                        $class = $this->getOpVal($op2, $EX); 
    907                         $rvalue = $class . '::$' . $this->unquoteName($rvalue); 
     950                        $rvalue = str($class) . '::$' . unquoteName($rvalue, $EX); 
    908951                        break; 
    909952                    default: 
    910                         $name = $this->unquoteName($rvalue); 
    911                         $globalname = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[$rvalue]"; 
     953                        $name = unquoteName($rvalue, $EX); 
     954                        $globalname = xcache_is_autoglobal($name) ? "\$$name" : "\$GLOBALS[" . str($rvalue) . "]"; 
    912955                        $rvalue = new Decompiler_Fetch($rvalue, $fetchtype, $globalname); 
    913956                        break; 
     
    931974                case XC_FETCH_DIM_IS: 
    932975                case XC_ASSIGN_DIM: 
     976                case XC_UNSET_DIM_OBJ: // PHP 4 only 
    933977                case XC_UNSET_DIM: 
    934                 case XC_UNSET_DIM_OBJ: 
     978                case XC_UNSET_OBJ: 
    935979                    $src = $this->getOpVal($op1, $EX, false); 
    936980                    if (is_a($src, "Decompiler_ForeachBox")) { 
     
    939983                        break; 
    940984                    } 
    941                     else if (is_a($src, "Decompiler_DimBox")) { 
     985 
     986                    if (is_a($src, "Decompiler_DimBox")) { 
    942987                        $dimbox = $src; 
    943988                    } 
    944989                    else { 
    945990                        if (!is_a($src, "Decompiler_ListBox")) { 
    946                             $list = new Decompiler_List($this->getOpVal($op1, $EX, false)); 
     991                            $op1val = $this->getOpVal($op1, $EX, false); 
     992                            $list = new Decompiler_List(isset($op1val) ? $op1val : '$this'); 
    947993 
    948994                            $src = new Decompiler_ListBox($list); 
     
    9681014                        $dim->isLast = true; 
    9691015                    } 
     1016                    if ($opc == XC_UNSET_OBJ) { 
     1017                        $dim->isObject = true; 
     1018                    } 
    9701019                    unset($dim); 
    9711020                    $rvalue = $dimbox; 
     1021                    unset($dimbox); 
    9721022 
    9731023                    if ($opc == XC_ASSIGN_DIM) { 
     
    9751025                        ++ $i; 
    9761026                        $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 
    977                         $resvar = str($lvalue, $EX) . ' = ' . $rvalue; 
    978                     } 
    979                     else if ($opc == XC_UNSET_DIM) { 
     1027                        $resvar = str($lvalue, $EX) . ' = ' . str($rvalue); 
     1028                    } 
     1029                    else if ($opc == XC_UNSET_DIM || $opc == XC_UNSET_OBJ) { 
    9801030                        $op['php'] = "unset(" . str($rvalue, $EX) . ")"; 
    9811031                        $lastphpop = &$op; 
     
    10111061                    $rvalue = $this->getOpVal($op2, $EX, false); 
    10121062                    if (is_a($rvalue, 'Decompiler_Fetch')) { 
    1013                         $src = foldToCode($rvalue->src, $EX); 
     1063                        $src = str($rvalue->src, $EX); 
    10141064                        if (substr($src, 1, -1) == substr($lvalue, 1)) { 
    10151065                            switch ($rvalue->fetchType) { 
     
    10501100                        $obj = '$this'; 
    10511101                    } 
    1052                     $prop = $this->getOpVal($op2, $EX); 
    1053                     if (preg_match($this->rQuotedName, $prop)) { 
    1054                         $prop = substr($prop, 1, -1);; 
    1055                         $rvalue = "{$obj}->$prop"; 
    1056                     } 
    1057                     else { 
    1058                         $rvalue = "{$obj}->{" . "$prop}"; 
    1059                     } 
     1102                    $rvalue = str($obj) . "->" . unquoteProperty($this->getOpVal($op2, $EX), $EX); 
    10601103                    if ($res['op_type'] != XC_IS_UNUSED) { 
    10611104                        $resvar = $rvalue; 
     
    10651108                        $lvalue = $rvalue; 
    10661109                        $rvalue = $this->getOpVal($opcodes[$i]['op1'], $EX); 
    1067                         $resvar = "$lvalue = $rvalue"; 
     1110                        $resvar = "$lvalue = " . str($rvalue); 
    10681111                    } 
    10691112                    break; 
     
    11251168                    // }}} 
    11261169                case XC_INIT_STATIC_METHOD_CALL: 
    1127                 case XC_INIT_METHOD_CALL: 
    1128                 case XC_INIT_FCALL_BY_FUNC: 
    1129                 case XC_INIT_FCALL_BY_NAME: // {{{ 
    1130                     if (($ext & ZEND_CTOR_CALL)) { 
    1131                         break; 
    1132                     } 
     1170                case XC_INIT_METHOD_CALL: // {{{ 
    11331171                    array_push($EX['arg_types_stack'], array($EX['fbc'], $EX['object'], $EX['called_scope'])); 
    11341172                    if ($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL || $op1['op_type'] != XC_IS_UNUSED) { 
     
    11391177                        if ($opc == XC_INIT_STATIC_METHOD_CALL || /* PHP4 */ isset($op1['constant'])) { 
    11401178                            $EX['object'] = null; 
    1141                             $EX['called_scope'] = $this->unquoteName($obj); 
     1179                            $EX['called_scope'] = unquoteName($obj, $EX); 
    11421180                        } 
    11431181                        else { 
     
    11541192                    } 
    11551193 
    1156                     if ($opc == XC_INIT_FCALL_BY_FUNC) { 
    1157                         $which = $op1['var']; 
    1158                         $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 
    1159                     } 
    1160                     else { 
    1161                         $EX['fbc'] = $this->getOpVal($op2, $EX, false); 
    1162                     } 
     1194                    $EX['fbc'] = $this->getOpVal($op2, $EX, false); 
     1195                    if (($opc == XC_INIT_STATIC_METHOD_CALL || $opc == XC_INIT_METHOD_CALL) && !isset($EX['fbc'])) { 
     1196                        $EX['fbc'] = '__construct'; 
     1197                    } 
     1198                    break; 
     1199                    // }}} 
     1200                case XC_INIT_FCALL_BY_NAME: // {{{ 
     1201                    if (!ZEND_ENGINE_2 && ($ext & ZEND_CTOR_CALL)) { 
     1202                        break; 
     1203                    } 
     1204                    $EX['object'] = null; 
     1205                    $EX['called_scope'] = null; 
     1206                    $EX['fbc'] = $this->getOpVal($op2, $EX); 
     1207                    break; 
     1208                    // }}} 
     1209                case XC_INIT_FCALL_BY_FUNC: // {{{ deprecated even in PHP 4? 
     1210                    $EX['object'] = null; 
     1211                    $EX['called_scope'] = null; 
     1212                    $which = $op1['var']; 
     1213                    $EX['fbc'] = $EX['op_array']['funcs'][$which]['name']; 
    11631214                    break; 
    11641215                    // }}} 
     
    11701221                    break; 
    11711222                case XC_DO_FCALL: 
    1172                     $fname = $this->unquoteName($this->getOpVal($op1, $EX, false)); 
     1223                    $fname = unquoteName($this->getOpVal($op1, $EX, false), $EX); 
    11731224                    $args = $this->popargs($EX, $ext); 
    11741225                    $resvar = $fname . "($args)"; 
     
    11771228                    $object = null; 
    11781229 
    1179                     $fname = $this->unquoteName($EX['fbc']); 
     1230                    $fname = unquoteName($EX['fbc'], $EX); 
    11801231                    if (!is_int($EX['object'])) { 
    11811232                        $object = $EX['object']; 
     
    12111262                    } 
    12121263                    $class = &$this->dc['class_table'][$key]; 
    1213                     $class['name'] = $this->unquoteName($this->getOpVal($op2, $EX)); 
     1264                    $class['name'] = unquoteName($this->getOpVal($op2, $EX), $EX); 
    12141265                    if ($opc == XC_DECLARE_INHERITED_CLASS || $opc == XC_DECLARE_INHERITED_CLASS_DELAYED) { 
    12151266                        $ext /= XC_SIZEOF_TEMP_VARIABLE; 
     
    12211272                    } 
    12221273 
    1223                     while ($i + 2 < $ic 
    1224                      && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 
    1225                      && $opcodes[$i + 2]['op1']['var'] == $res['var'] 
    1226                      && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 
     1274                    for (;;) { 
     1275                        if ($i + 1 < $ic 
     1276                         && $opcodes[$i + 1]['opcode'] == XC_ADD_INTERFACE 
     1277                         && $opcodes[$i + 1]['op1']['var'] == $res['var']) { 
     1278                            // continue 
     1279                        } 
     1280                        else if ($i + 2 < $ic 
     1281                         && $opcodes[$i + 2]['opcode'] == XC_ADD_INTERFACE 
     1282                         && $opcodes[$i + 2]['op1']['var'] == $res['var'] 
     1283                         && $opcodes[$i + 1]['opcode'] == XC_FETCH_CLASS) { 
     1284                            // continue 
     1285                        } 
     1286                        else { 
     1287                            break; 
     1288                        } 
     1289 
    12271290                        $fetchop = &$opcodes[$i + 1]; 
    1228                         $impl = $this->unquoteName($this->getOpVal($fetchop['op2'], $EX)); 
     1291                        $impl = unquoteName($this->getOpVal($fetchop['op2'], $EX), $EX); 
    12291292                        $addop = &$opcodes[$i + 2]; 
    12301293                        $class['interfaces'][$addop['extended_value']] = $impl; 
     
    12331296                    } 
    12341297                    $this->dclass($class); 
     1298                    echo "\n"; 
    12351299                    unset($class); 
    12361300                    break; 
     
    12471311                    switch ($opc) { 
    12481312                    case XC_ADD_CHAR: 
    1249                         $op2val = foldToCode(chr($op2val), $EX); 
     1313                        $op2val = value(chr(str($op2val))); 
    12501314                        break; 
    12511315                    case XC_ADD_STRING: 
    1252                         $op2val = foldToCode($op2val, $EX); 
    12531316                        break; 
    12541317                    case XC_ADD_VAR: 
    12551318                        break; 
    12561319                    } 
    1257                     if ($op1val == "''") { 
     1320                    if (str($op1val) == "''") { 
    12581321                        $rvalue = $op2val; 
    12591322                    } 
    1260                     else if ($op2val == "''") { 
     1323                    else if (str($op2val) == "''") { 
    12611324                        $rvalue = $op1val; 
    12621325                    } 
     
    13281391                    $type = $op2['var']; // hack 
    13291392                    $keyword = $this->includeTypes[$type]; 
    1330                     $resvar = "$keyword(" . str($this->getOpVal($op1, $EX)) . ")"; 
     1393                    $resvar = "$keyword " . str($this->getOpVal($op1, $EX)); 
    13311394                    break; 
    13321395                    // }}} 
     
    13661429                case XC_JMP_NO_CTOR: 
    13671430                    break; 
     1431                case XC_JMP_SET: // ?: 
    13681432                case XC_JMPNZ: // while 
    13691433                case XC_JMPZNZ: // for 
     
    14031467                    break; 
    14041468                    // }}} 
     1469                case XC_GOTO: 
    14051470                case XC_JMP: // {{{ 
    14061471                    $op['cond'] = null; 
     
    14371502                    $flags = array_flip(explode('_', $opname)); 
    14381503                    if (isset($flags['OBJ'])) { 
    1439                         $resvar = $this->getOpVal($op1, $EX); 
    1440                         $prop = $this->unquoteName($this->getOpVal($op2, $EX)); 
    1441                         if ($prop{0} == '$') { 
    1442                             $resvar = $resvar . "{" . $prop . "}"; 
    1443                         } 
    1444                         else { 
    1445                             $resvar = $resvar . "->" . $prop; 
    1446                         } 
     1504                        $resvar = $this->getOpVal($op1, $EX) . '->' . unquoteProperty($this->getOpVal($op2, $EX), $EX); 
    14471505                    } 
    14481506                    else { 
     
    14511509                    $opstr = isset($flags['DEC']) ? '--' : '++'; 
    14521510                    if (isset($flags['POST'])) { 
    1453                         $resvar .= ' ' . $opstr; 
     1511                        $resvar .= $opstr; 
    14541512                    } 
    14551513                    else { 
    1456                         $resvar = "$opstr $resvar"; 
     1514                        $resvar = "$opstr$resvar"; 
    14571515                    } 
    14581516                    break; 
     
    14921550                case XC_EXT_NOP: 
    14931551                    break; 
     1552                case XC_DECLARE_LAMBDA_FUNCTION: 
     1553                    ob_start(); 
     1554                    $this->dfunction($this->dc['function_table'][$op1['constant']], $EX['indent']); 
     1555                    $resvar = ob_get_clean(); 
     1556                    $istmpres = true; 
     1557                    break; 
    14941558                case XC_DECLARE_FUNCTION_OR_CLASS: 
    14951559                    /* always removed by compiler */ 
     
    14981562                    $lastphpop['ticks'] = $this->getOpVal($op1, $EX); 
    14991563                    // $EX['tickschanged'] = true; 
     1564                    break; 
     1565                case XC_RAISE_ABSTRACT_ERROR: 
     1566                    // abstract function body is empty, don't need this code 
     1567                    break; 
     1568                case XC_USER_OPCODE: 
     1569                    echo '// ZEND_USER_OPCODE, impossible to decompile'; 
     1570                    break; 
     1571                case XC_OP_DATA: 
    15001572                    break; 
    15011573                default: // {{{ 
     
    15591631                $d[$kk] = '$' . $op[$k]['var']; 
    15601632                if ($kk != 'res') { 
    1561                     $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX); 
     1633                    $d[$kk] .= ':' . str($this->getOpVal($op[$k], $EX)); 
    15621634                } 
    15631635                break; 
     
    15661638                $d[$kk] = '#' . $op[$k]['var']; 
    15671639                if ($kk != 'res') { 
    1568                     $d[$kk] .= ':' . $this->getOpVal($op[$k], $EX); 
     1640                    $d[$kk] .= ':' . str($this->getOpVal($op[$k], $EX)); 
    15691641                } 
    15701642                break; 
     
    16611733    { 
    16621734        if ($nobody) { 
    1663             $body = ";\n"; 
    16641735            $EX = array(); 
    16651736            $EX['op_array'] = &$func['op_array']; 
     
    16761747        } 
    16771748 
    1678         echo 'function ', $func['op_array']['function_name'], '('; 
     1749        $functionName = $func['op_array']['function_name']; 
     1750        if ($functionName == '{closure}') { 
     1751            $functionName = ''; 
     1752        } 
     1753        echo 'function ', $functionName, '('; 
    16791754        $this->dargs($EX, $indent); 
    1680         echo ")\n"; 
    1681         echo $indent, "{\n"; 
    1682         echo $body; 
    1683         echo "$indent}\n"; 
     1755        echo ")"; 
     1756        if ($nobody) { 
     1757            echo ";\n"; 
     1758        } 
     1759        else { 
     1760            if ($functionName !== '') { 
     1761                echo "\n"; 
     1762                echo $indent, "{\n"; 
     1763            } 
     1764            else { 
     1765                echo " {\n"; 
     1766            } 
     1767 
     1768            echo $body; 
     1769            echo "$indent}"; 
     1770            if ($functionName !== '') { 
     1771                echo "\n"; 
     1772            } 
     1773        } 
    16841774    } 
    16851775    // }}} 
     
    16951785        if (!empty($class['ce_flags'])) { 
    16961786            if ($class['ce_flags'] & ZEND_ACC_INTERFACE) { 
    1697                 echo 'interface '; 
    16981787                $isinterface = true; 
    16991788            } 
    17001789            else { 
    1701                 if ($class['ce_flags'] & ZEND_ACC_IMPLICIT_ABSTRACT) { 
     1790                if ($class['ce_flags'] & ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { 
    17021791                    echo "abstract "; 
    17031792                } 
    1704                 if ($class['ce_flags'] & ZEND_ACC_FINAL) { 
     1793                if ($class['ce_flags'] & ZEND_ACC_FINAL_CLASS) { 
    17051794                    echo "final "; 
    17061795                } 
    17071796            } 
    17081797        } 
    1709         echo 'class ', $class['name']; 
     1798        echo $isinterface ? 'interface ' : 'class ', $class['name']; 
    17101799        if ($class['parent']) { 
    17111800            echo ' extends ', $class['parent']; 
     
    18221911                    } 
    18231912                    echo $newindent; 
     1913                    $isAbstractMethod = false; 
    18241914                    if (isset($opa['fn_flags'])) { 
    1825                         if ($opa['fn_flags'] & ZEND_ACC_ABSTRACT) { 
     1915                        if (($opa['fn_flags'] & ZEND_ACC_ABSTRACT) && !$isinterface) { 
    18261916                            echo "abstract "; 
     1917                            $isAbstractMethod = true; 
    18271918                        } 
    18281919                        if ($opa['fn_flags'] & ZEND_ACC_FINAL) { 
     
    18481939                        } 
    18491940                    } 
    1850                     $this->dfunction($func, $newindent, $isinterface); 
     1941                    $this->dfunction($func, $newindent, $isinterface || $isAbstractMethod); 
    18511942                    if ($opa['function_name'] == 'Decompiler') { 
    18521943                        //exit; 
     
    18791970    function output() // {{{ 
    18801971    { 
    1881         echo "<?". "php\n"; 
     1972        echo "<?". "php\n\n"; 
    18821973        foreach ($this->dc['class_table'] as $key => $class) { 
    18831974            if ($key{0} != "\0") { 
     1975                $this->dclass($class); 
    18841976                echo "\n"; 
    1885                 $this->dclass($class); 
    18861977            } 
    18871978        } 
     
    18891980        foreach ($this->dc['function_table'] as $key => $func) { 
    18901981            if ($key{0} != "\0") { 
     1982                $this->dfunction($func); 
    18911983                echo "\n"; 
    1892                 $this->dfunction($func); 
    1893             } 
    1894         } 
    1895  
    1896         echo "\n"; 
     1984            } 
     1985        } 
     1986 
    18971987        $this->dop_array($this->dc['op_array']); 
    18981988        echo "\n?" . ">\n"; 
     
    19031993 
    19041994// {{{ defines 
    1905 define('ZEND_ACC_STATIC',         0x01); 
    1906 define('ZEND_ACC_ABSTRACT',       0x02); 
    1907 define('ZEND_ACC_FINAL',          0x04); 
    1908 define('ZEND_ACC_IMPLEMENTED_ABSTRACT',       0x08); 
    1909  
    1910 define('ZEND_ACC_IMPLICIT_ABSTRACT_CLASS',    0x10); 
    1911 define('ZEND_ACC_EXPLICIT_ABSTRACT_CLASS',    0x20); 
    1912 define('ZEND_ACC_FINAL_CLASS',                0x40); 
    1913 define('ZEND_ACC_INTERFACE',                  0x80); 
    1914 define('ZEND_ACC_PUBLIC',     0x100); 
    1915 define('ZEND_ACC_PROTECTED',  0x200); 
    1916 define('ZEND_ACC_PRIVATE',    0x400); 
    1917 define('ZEND_ACC_PPP_MASK',  (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)); 
    1918  
    1919 define('ZEND_ACC_CHANGED',    0x800); 
    1920 define('ZEND_ACC_IMPLICIT_PUBLIC',    0x1000); 
    1921  
    1922 define('ZEND_ACC_CTOR',       0x2000); 
    1923 define('ZEND_ACC_DTOR',       0x4000); 
    1924 define('ZEND_ACC_CLONE',      0x8000); 
    1925  
    1926 define('ZEND_ACC_ALLOW_STATIC',   0x10000); 
    1927  
    1928 define('ZEND_ACC_SHADOW', 0x2000); 
    1929  
    19301995define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.3.99"); 
    19311996define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3."); 
     
    19331998define('ZEND_ENGINE_2_1', ZEND_ENGINE_2_2 || PHP_VERSION >= "5.1."); 
    19341999define('ZEND_ENGINE_2',   ZEND_ENGINE_2_1 || PHP_VERSION >= "5.0."); 
     2000 
     2001define('ZEND_ACC_STATIC',         0x01); 
     2002define('ZEND_ACC_ABSTRACT',       0x02); 
     2003define('ZEND_ACC_FINAL',          0x04); 
     2004define('ZEND_ACC_IMPLEMENTED_ABSTRACT',       0x08); 
     2005 
     2006define('ZEND_ACC_IMPLICIT_ABSTRACT_CLASS',    0x10); 
     2007define('ZEND_ACC_EXPLICIT_ABSTRACT_CLASS',    0x20); 
     2008define('ZEND_ACC_FINAL_CLASS',                0x40); 
     2009define('ZEND_ACC_INTERFACE',                  0x80); 
     2010if (ZEND_ENGINE_2_4) { 
     2011    define('ZEND_ACC_TRAIT',                  0x120); 
     2012} 
     2013define('ZEND_ACC_PUBLIC',     0x100); 
     2014define('ZEND_ACC_PROTECTED',  0x200); 
     2015define('ZEND_ACC_PRIVATE',    0x400); 
     2016define('ZEND_ACC_PPP_MASK',  (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE)); 
     2017 
     2018define('ZEND_ACC_CHANGED',    0x800); 
     2019define('ZEND_ACC_IMPLICIT_PUBLIC',    0x1000); 
     2020 
     2021define('ZEND_ACC_CTOR',       0x2000); 
     2022define('ZEND_ACC_DTOR',       0x4000); 
     2023define('ZEND_ACC_CLONE',      0x8000); 
     2024 
     2025define('ZEND_ACC_ALLOW_STATIC',   0x10000); 
     2026 
     2027define('ZEND_ACC_SHADOW', 0x2000); 
    19352028 
    19362029if (ZEND_ENGINE_2_4) { 
     
    20312124    'XC_ASSIGN_DIM' => -1, 
    20322125    'XC_UNSET_DIM' => -1, 
    2033     'XC_FETCH_OBJ_' => -1, 
     2126    'XC_UNSET_OBJ' => -1, 
    20342127    'XC_ASSIGN_OBJ' => -1, 
    20352128    'XC_ISSET_ISEMPTY_DIM_OBJ' => -1, 
     
    20522145    'XC_FETCH_DIM_' => -1, 
    20532146    'XC_UNSET_DIM_OBJ' => -1, 
    2054     'XC_FETCH_OBJ_' => -1, 
    20552147    'XC_ISSET_ISEMPTY' => -1, 
    20562148    'XC_INIT_FCALL_BY_FUNC' => -1, 
    20572149    'XC_DO_FCALL_BY_FUNC' => -1, 
    20582150    'XC_DECLARE_FUNCTION_OR_CLASS' => -1, 
     2151    'XC_INIT_NS_FCALL_BY_NAME' => -1, 
     2152    'XC_GOTO' => -1, 
     2153    'XC_CATCH' => -1, 
     2154    'XC_THROW' => -1, 
     2155    'XC_INSTANCEOF' => -1, 
     2156    'XC_DECLARE_FUNCTION' => -1, 
     2157    'XC_RAISE_ABSTRACT_ERROR' => -1, 
     2158    'XC_DECLARE_CONST' => -1, 
     2159    'XC_USER_OPCODE' => -1, 
     2160    'XC_JMP_SET' => -1, 
     2161    'XC_DECLARE_LAMBDA_FUNCTION' => -1, 
    20592162) as $k => $v) { 
    20602163    if (!defined($k)) { 
     
    20632166} 
    20642167 
    2065 /* XC_UNDEF XC_OP_DATA 
     2168//* XC_UNDEF XC_OP_DATA 
    20662169$content = file_get_contents(__FILE__); 
    20672170for ($i = 0; $opname = xcache_get_opcode($i); $i ++) { 
Note: See TracChangeset for help on using the changeset viewer.