Changeset 822 in svn for trunk/processor/processor.m4


Ignore:
Timestamp:
2012-03-22T17:22:37+01:00 (3 years ago)
Author:
Xuefer
Message:

initial PHP_5_4 support

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/processor.m4

    r785 r822  
    486486undefine(`UNION_znode_op')
    487487define(`UNION_znode_op', `dnl {{{
    488     switch ((src->$1_type & ~EXT_TYPE_UNUSED)) {
     488#ifndef NDEBUG
     489    switch ((src->$1_type ifelse($1, `result', & ~EXT_TYPE_UNUSED))) {
    489490    case IS_CONST:
    490491    case IS_VAR:
     
    497498        assert(0);
    498499    }
     500#endif
    499501
    500502    dnl dirty dispatch
    501503    DISABLECHECK(`
    502     switch ((src->$1_type & ~EXT_TYPE_UNUSED)) {
     504    switch ((src->$1_type ifelse($1, `result', & ~EXT_TYPE_UNUSED))) {
    503505        case IS_CONST:
    504             dnl TODO: fix me, use literals
    505             IFDASM(`{
    506                 zval *zv;
    507                 ALLOC_INIT_ZVAL(zv);
    508                 *zv = ((zend_literal *) src->$1.ptr)->constant;
    509                 zval_copy_ctor(zv);
    510                 add_assoc_zval_ex(dst, ZEND_STRS("$1.constant"), zv);
     506            ifelse($1, `result', `
     507                DISPATCH(zend_uint, $1.constant)
     508            ', `
     509                IFDASM(`{
     510                    zval *zv;
     511                    ALLOC_INIT_ZVAL(zv);
     512                    *zv = src->$1.literal->constant;
     513                    zval_copy_ctor(zv);
     514                    add_assoc_zval_ex(dst, ZEND_STRS("$1.constant"), zv);
    511515                }
    512             ', `
    513                 DISPATCH(zend_uint, $1.constant)
     516                ', `
     517                    IFCOPY(`
     518                        dst->$1 = src->$1;
     519                    ', `
     520                        DISPATCH(zend_uint, $1.constant)
     521                    ')
     522                ')
    514523            ')
    515524            break;
     
    517526            IFNOTMEMCPY(`
    518527                default:
    519                     *dst = *src;
     528                    $1 = $2;
    520529            ')
    521530        ', `
     
    607616#endif
    608617    IFCOPY(`
     618        pushdef(`UNION_znode_op_literal', `
     619            if (dst->$1_type == IS_CONST) {
     620                IFSTORE(`
     621                    dst->$1.constant = src->$1.literal - processor->active_op_array_src->literals;
     622                    dst->$1.literal = &processor->active_op_array_dst->literals[dst->$1.constant];
     623                ')
     624            }
     625        ')
     626        UNION_znode_op_literal(op1)
     627        UNION_znode_op_literal(op2)
     628        popdef(`UNION_znode_op_literal')
    609629        switch (src->opcode) {
    610630#ifdef ZEND_GOTO
     
    659679    if (shallow_copy) {
    660680        zend_bool gc_arg_info = 0;
    661         int gc_opcodes        = 0;
     681        zend_bool gc_opcodes  = 0;
    662682        /* really fast shallow copy */
    663683        memcpy(dst, src, sizeof(src[0]));
     
    669689        gc_arg_info = 1;
    670690#endif
    671         IFRESTORE(`dst->filename = processor->entry_src->filepath;')
    672 #ifndef ZEND_ENGINE_2_4
     691        dst->filename = processor->entry_src->filepath;
     692#ifdef ZEND_ENGINE_2_4
     693        if (src->literals /* || op_array_info->literalsinfo_cnt */) {
     694            gc_opcodes = 1;
     695        }
     696#else
    673697        if (op_array_info->oplineinfo_cnt) {
     698            gc_opcodes = 1;
     699        }
     700#endif
     701        if (gc_opcodes) {
    674702            zend_op *opline, *end;
    675             gc_opcodes = 1;
    676703            COPY_N_EX(last, zend_op, opcodes)
    677704
    678705            for (opline = dst->opcodes, end = opline + src->last; opline < end; ++opline) {
     706#ifdef ZEND_ENGINE_2_4
     707                pushdef(`UNION_znode_op_literal', `
     708                    if (opline->$1_type == IS_CONST) {
     709                        opline->$1.constant = opline->$1.literal - src->literals;
     710                        opline->$1.literal = &dst->literals[opline->$1.constant];
     711                    }
     712                ')
     713                UNION_znode_op_literal(op1)
     714                UNION_znode_op_literal(op2)
     715                popdef(`UNION_znode_op_literal')
     716#endif
     717
    679718                switch (opline->opcode) {
    680719#ifdef ZEND_GOTO
     
    700739            }
    701740        }
    702 #endif
    703741        if (gc_arg_info || gc_opcodes) {
    704742            xc_gc_op_array_t gc_op_array;
     
    707745            gc_op_array.arg_info = gc_arg_info ? dst->arg_info : NULL;
    708746#endif
    709             gc_op_array.last     = gc_opcodes > 1 ? dst->last : 0;
    710747            gc_op_array.opcodes  = gc_opcodes ? dst->opcodes : NULL;
    711748            xc_gc_add_op_array(&gc_op_array TSRMLS_CC);
     
    771808    IFSTORE(`dst->refcount[0] = 1;')
    772809
     810#ifdef ZEND_ENGINE_2_4
     811    dnl before copying opcodes
     812    DISPATCH(int, last_literal)
     813    STRUCT_ARRAY(last_literal, zend_literal, literals)
     814#endif
     815
    773816    pushdef(`AFTER_ALLOC', `IFCOPY(`
    774817#ifndef NDEBUG
     
    857900#endif
    858901#ifdef ZEND_ENGINE_2_4
    859     DISPATCH(int, last_literal)
    860     IFRESTORE(`COPY(literals)', `STRUCT_ARRAY(last_literal, zend_literal, literals)')
    861 
    862902    COPYNULL(run_time_cache)
    863903    COPYNULL(last_cache_slot)
Note: See TracChangeset for help on using the changeset viewer.