Changeset 1488 in svn


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