Ignore:
Timestamp:
2014-05-27T17:48:37+02:00 (4 months ago)
Author:
moo
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.