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.