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


Ignore:
Timestamp:
2014-05-27T15:48:37Z (15 months ago)
Author:
Xuefer
Message:

Decompiler PHP_5_6: updated support for zend_ast

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/Decompiler.class.php

    r1486 r1488  
    8888}
    8989// }}}
     90function decompileAst($ast, $EX) // {{{
     91{
     92    $kind = $ast['kind'];
     93    $children = $ast['children'];
     94    unset($ast['kind']);
     95    unset($ast['children']);
     96    switch ($kind) {
     97    case ZEND_CONST:
     98        return value($ast[0], $EX);
     99
     100    case XC_INIT_ARRAY:
     101        $array = new Decompiler_Array();
     102        for ($i = 0; $i < $children; $i += 2) {
     103            if (isset($ast[$i + 1])) {
     104                $key = decompileAst($ast[$i], $EX);
     105                $value = decompileAst($ast[$i + 1], $EX);
     106                $array->value[] = array($key, $value);
     107            }
     108            else {
     109                $array->value[] = array(null, decompileAst($ast[$i], $EX));
     110            }
     111        }
     112        return $array;
     113
     114    // ZEND_BOOL_AND: handled in binop
     115    // ZEND_BOOL_OR:  handled in binop
     116
     117    case ZEND_SELECT:
     118        return new Decompiler_TriOp(
     119                decompileAst($ast[0], $EX)
     120                , decompileAst($ast[1], $EX)
     121                , decompileAst($ast[2], $EX)
     122                );
     123
     124    case ZEND_UNARY_PLUS:
     125        return new Decompiler_Code('+' . str(decompileAst($ast[0], $EX)));
     126
     127    case ZEND_UNARY_MINUS:
     128        return new Decompiler_Code('-' . str(decompileAst($ast[0], $EX)));
     129
     130    default:
     131        $decompiler = $GLOBALS['__xcache_decompiler'];
     132        if (isset($decompiler->binops[$kind])) {
     133            return new Decompiler_Binop($decompiler
     134                    , decompileAst($ast[0], $EX)
     135                    , $kind
     136                    , decompileAst($ast[1], $EX)
     137                    );
     138        }
     139
     140        return "un-handled kind $kind in zend_ast";
     141    }
     142}
     143// }}}
    90144function value($value, &$EX) // {{{
    91145{
     146    if (ZEND_ENGINE_2_6 && (xcache_get_type($value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT_AST) {
     147        return decompileAst(xcache_dasm_ast($value), $EX);
     148    }
     149
    92150    $originalValue = xcache_get_special_value($value);
    93151    if (isset($originalValue)) {
     
    591649                XC_JMPZ_EX             => "&&",
    592650                XC_JMPNZ_EX            => "||",
     651
     652                // zend_ast
     653                ZEND_BOOL_AND          => '&&',
     654                ZEND_BOOL_OR           => '||',
    593655                );
    594656        // }}}
     
    29443006define('IS_LEXICAL_VAR',          0x20);
    29453007define('IS_LEXICAL_REF',          0x40);
     3008
     3009if (ZEND_ENGINE_2_6) {
     3010    define('ZEND_CONST',          256);
     3011    define('ZEND_BOOL_AND',       256 + 1);
     3012    define('ZEND_BOOL_OR',        256 + 2);
     3013    define('ZEND_SELECT',         256 + 3);
     3014    define('ZEND_UNARY_PLUS',     256 + 4);
     3015    define('ZEND_UNARY_MINUS',    256 + 5);
     3016}
    29463017
    29473018@define('XC_IS_CV', 16);
Note: See TracChangeset for help on using the changeset viewer.