Changeset 1488 for trunk


Ignore:
Timestamp:
2014-05-27T17:48:37+02:00 (8 weeks ago)
Author:
moo
Message:

Decompiler PHP_5_6: updated support for zend_ast

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/devel/sample.cpp.php

    r1485 r1488  
    4545    static public $static_const11 = array(self::CONST_VALUE => self::CONST_VALUE); 
    4646    static public $static_const12 = array(ClassName::CONST_VALUE => ClassName::CONST_VALUE); 
     47    static public $ast_binop = ClassName::CONST_VALUE + ClassName::CONST_VALUE; 
     48    static public $ast_and = ClassName::CONST_VALUE && 1; 
     49    static public $ast_or = ClassName::CONST_VALUE || 2; 
     50    static public $ast_select = ClassName::CONST_VALUE ? a : b; 
     51    static public $ast_unaryPlus = +ClassName::CONST_VALUE; 
     52    static public $ast_unaryMinus = -ClassName::CONST_VALUE; 
    4753    /** doc */ 
    4854    static public $public_static = array(2, 'str'); 
  • 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); 
  • trunk/mod_disassembler/xc_disassembler.c

    r1477 r1488  
    237237/* }}} */ 
    238238 
     239#ifdef IS_CONSTANT_AST 
     240/* {{{ proto array xcache_dasm_ast(mixed ast) 
     241   Disassemble zend_ast data into array */ 
     242#ifdef ZEND_BEGIN_ARG_INFO_EX 
     243ZEND_BEGIN_ARG_INFO_EX(arginfo_xcache_dasm_ast, 0, 0, 1) 
     244    ZEND_ARG_INFO(0, ast) 
     245ZEND_END_ARG_INFO() 
     246#else 
     247static unsigned char arginfo_xcache_dasm_ast[] = { 1, BYREF_NONE }; 
     248#endif 
     249 
     250PHP_FUNCTION(xcache_dasm_ast) 
     251{ 
     252    zval *ast; 
     253    xc_dasm_t dasm; 
     254 
     255    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &ast) == FAILURE) { 
     256        return; 
     257    } 
     258    if ((Z_TYPE_P(ast) & IS_CONSTANT_TYPE_MASK) != IS_CONSTANT_AST) { 
     259        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Data type is not zend_ast"); 
     260        return; 
     261    } 
     262    array_init(return_value); 
     263    xc_dasm_zend_ast(&dasm, return_value, ast->value.ast TSRMLS_CC); 
     264} 
     265/* }}} */ 
     266#endif 
     267 
    239268/* {{{ PHP_MINFO_FUNCTION(xcache_disassembler) */ 
    240269static PHP_MINFO_FUNCTION(xcache_disassembler) 
     
    251280    PHP_FE(xcache_dasm_file,         arginfo_xcache_dasm_file) 
    252281    PHP_FE(xcache_dasm_string,       arginfo_xcache_dasm_string) 
     282#ifdef IS_CONSTANT_AST 
     283    PHP_FE(xcache_dasm_ast,          arginfo_xcache_dasm_ast) 
     284#endif 
    253285    PHP_FE_END 
    254286}; 
  • trunk/processor/main.m4

    r1486 r1488  
    255255EXPORT_PROCESSOR(`dasm',   `zend_function') 
    256256EXPORT_PROCESSOR(`dasm',   `zend_class_entry') 
     257EXPORT_PROCESSOR(`dasm',   `zend_ast') 
    257258EXPORT_PROCESSOR(`dprint', `zval') 
    258259 
  • trunk/processor/processor.m4

    r1487 r1488  
    9797                    memcpy(DST()->u.val, SRC()->u.val, sizeof(zval)); 
    9898                ') 
    99                 STRUCT_P_EX(zval, DST()->u.val, SRC()->u.val, `', `', ` ') 
     99                STRUCT_P_EX(zval, DST()->u.val, SRC()->u.val, `[]', `', ` ') 
    100100                RELOCATE_EX(zval, DST()->u.val) 
    101101            } 
     
    106106                        ZEND_AST_HELPER(`src_ast', ` 
    107107                            ALLOC(`(&DST()->u.child)[i]', zend_ast) 
    108                             STRUCT_P_EX(zend_ast, (&DST()->u.child)[i], src_ast, `[i]', `', ` ') 
     108                            STRUCT_P_EX(zend_ast, (&DST()->u.child)[i], src_ast, `[]', `', ` ') 
    109109                        ') 
    110110                        RELOCATE_EX(zend_ast, (&DST()->u.child)[i]) 
  • trunk/processor/struct.m4

    r1475 r1488  
    158158ifdef(`DASM_STRUCT_DIRECT', `', ` 
    159159    IFDASM(` 
    160         add_assoc_zval_ex(DST(), XCACHE_STRS("$4"), zv); 
     160        ifelse(`$4', `[]', ` 
     161            add_next_index_zval(DST(), zv); 
     162        ', ` 
     163            add_assoc_zval_ex(DST(), XCACHE_STRS("$4"), zv); 
     164        ') 
    161165    } while (0); 
    162166    ') 
Note: See TracChangeset for help on using the changeset viewer.