Annotation of embedaddon/php/Zend/zend_vm_def.h, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | Zend Engine                                                          |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 2.00 of the Zend license,     |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.zend.com/license/2_00.txt.                                |
        !            11:    | If you did not receive a copy of the Zend license and are unable to  |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@zend.com so we can mail you a copy immediately.              |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Authors: Andi Gutmans <andi@zend.com>                                |
        !            16:    |          Zeev Suraski <zeev@zend.com>                                |
        !            17:    |          Dmitry Stogov <dmitry@zend.com>                             |
        !            18:    +----------------------------------------------------------------------+
        !            19: */
        !            20: 
        !            21: /* $Id: zend_vm_def.h 321634 2012-01-01 13:15:04Z felipe $ */
        !            22: 
        !            23: /* If you change this file, please regenerate the zend_vm_execute.h and
        !            24:  * zend_vm_opcodes.h files by running:
        !            25:  * php zend_vm_gen.php
        !            26:  */
        !            27: 
        !            28: ZEND_VM_HANDLER(1, ZEND_ADD, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            29: {
        !            30:        zend_op *opline = EX(opline);
        !            31:        zend_free_op free_op1, free_op2;
        !            32: 
        !            33:        add_function(&EX_T(opline->result.u.var).tmp_var,
        !            34:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !            35:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !            36:        FREE_OP1();
        !            37:        FREE_OP2();
        !            38:        ZEND_VM_NEXT_OPCODE();
        !            39: }
        !            40: 
        !            41: ZEND_VM_HANDLER(2, ZEND_SUB, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            42: {
        !            43:        zend_op *opline = EX(opline);
        !            44:        zend_free_op free_op1, free_op2;
        !            45: 
        !            46:        sub_function(&EX_T(opline->result.u.var).tmp_var,
        !            47:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !            48:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !            49:        FREE_OP1();
        !            50:        FREE_OP2();
        !            51:        ZEND_VM_NEXT_OPCODE();
        !            52: }
        !            53: 
        !            54: ZEND_VM_HANDLER(3, ZEND_MUL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            55: {
        !            56:        zend_op *opline = EX(opline);
        !            57:        zend_free_op free_op1, free_op2;
        !            58: 
        !            59:        mul_function(&EX_T(opline->result.u.var).tmp_var,
        !            60:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !            61:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !            62:        FREE_OP1();
        !            63:        FREE_OP2();
        !            64:        ZEND_VM_NEXT_OPCODE();
        !            65: }
        !            66: 
        !            67: ZEND_VM_HANDLER(4, ZEND_DIV, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            68: {
        !            69:        zend_op *opline = EX(opline);
        !            70:        zend_free_op free_op1, free_op2;
        !            71: 
        !            72:        div_function(&EX_T(opline->result.u.var).tmp_var,
        !            73:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !            74:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !            75:        FREE_OP1();
        !            76:        FREE_OP2();
        !            77:        ZEND_VM_NEXT_OPCODE();
        !            78: }
        !            79: 
        !            80: ZEND_VM_HANDLER(5, ZEND_MOD, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            81: {
        !            82:        zend_op *opline = EX(opline);
        !            83:        zend_free_op free_op1, free_op2;
        !            84: 
        !            85:        mod_function(&EX_T(opline->result.u.var).tmp_var,
        !            86:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !            87:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !            88:        FREE_OP1();
        !            89:        FREE_OP2();
        !            90:        ZEND_VM_NEXT_OPCODE();
        !            91: }
        !            92: 
        !            93: ZEND_VM_HANDLER(6, ZEND_SL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !            94: {
        !            95:        zend_op *opline = EX(opline);
        !            96:        zend_free_op free_op1, free_op2;
        !            97: 
        !            98:        shift_left_function(&EX_T(opline->result.u.var).tmp_var,
        !            99:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           100:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           101:        FREE_OP1();
        !           102:        FREE_OP2();
        !           103:        ZEND_VM_NEXT_OPCODE();
        !           104: }
        !           105: 
        !           106: ZEND_VM_HANDLER(7, ZEND_SR, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           107: {
        !           108:        zend_op *opline = EX(opline);
        !           109:        zend_free_op free_op1, free_op2;
        !           110: 
        !           111:        shift_right_function(&EX_T(opline->result.u.var).tmp_var,
        !           112:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           113:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           114:        FREE_OP1();
        !           115:        FREE_OP2();
        !           116:        ZEND_VM_NEXT_OPCODE();
        !           117: }
        !           118: 
        !           119: ZEND_VM_HANDLER(8, ZEND_CONCAT, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           120: {
        !           121:        zend_op *opline = EX(opline);
        !           122:        zend_free_op free_op1, free_op2;
        !           123: 
        !           124:        concat_function(&EX_T(opline->result.u.var).tmp_var,
        !           125:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           126:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           127:        FREE_OP1();
        !           128:        FREE_OP2();
        !           129:        ZEND_VM_NEXT_OPCODE();
        !           130: }
        !           131: 
        !           132: ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           133: {
        !           134:        zend_op *opline = EX(opline);
        !           135:        zend_free_op free_op1, free_op2;
        !           136: 
        !           137:        is_identical_function(&EX_T(opline->result.u.var).tmp_var,
        !           138:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           139:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           140:        FREE_OP1();
        !           141:        FREE_OP2();
        !           142:        ZEND_VM_NEXT_OPCODE();
        !           143: }
        !           144: 
        !           145: ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           146: {
        !           147:        zend_op *opline = EX(opline);
        !           148:        zend_free_op free_op1, free_op2;
        !           149:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !           150: 
        !           151:        is_identical_function(result,
        !           152:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           153:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           154:        Z_LVAL_P(result) = !Z_LVAL_P(result);
        !           155:        FREE_OP1();
        !           156:        FREE_OP2();
        !           157:        ZEND_VM_NEXT_OPCODE();
        !           158: }
        !           159: 
        !           160: ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           161: {
        !           162:        zend_op *opline = EX(opline);
        !           163:        zend_free_op free_op1, free_op2;
        !           164:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !           165: 
        !           166:        compare_function(result,
        !           167:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           168:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           169:        ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
        !           170:        FREE_OP1();
        !           171:        FREE_OP2();
        !           172:        ZEND_VM_NEXT_OPCODE();
        !           173: }
        !           174: 
        !           175: ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           176: {
        !           177:        zend_op *opline = EX(opline);
        !           178:        zend_free_op free_op1, free_op2;
        !           179:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !           180: 
        !           181:        compare_function(result,
        !           182:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           183:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           184:        ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
        !           185:        FREE_OP1();
        !           186:        FREE_OP2();
        !           187:        ZEND_VM_NEXT_OPCODE();
        !           188: }
        !           189: 
        !           190: ZEND_VM_HANDLER(19, ZEND_IS_SMALLER, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           191: {
        !           192:        zend_op *opline = EX(opline);
        !           193:        zend_free_op free_op1, free_op2;
        !           194:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !           195: 
        !           196:        compare_function(result,
        !           197:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           198:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           199:        ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
        !           200:        FREE_OP1();
        !           201:        FREE_OP2();
        !           202:        ZEND_VM_NEXT_OPCODE();
        !           203: }
        !           204: 
        !           205: ZEND_VM_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           206: {
        !           207:        zend_op *opline = EX(opline);
        !           208:        zend_free_op free_op1, free_op2;
        !           209:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !           210: 
        !           211:        compare_function(result,
        !           212:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           213:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           214:        ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
        !           215:        FREE_OP1();
        !           216:        FREE_OP2();
        !           217:        ZEND_VM_NEXT_OPCODE();
        !           218: }
        !           219: 
        !           220: ZEND_VM_HANDLER(9, ZEND_BW_OR, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           221: {
        !           222:        zend_op *opline = EX(opline);
        !           223:        zend_free_op free_op1, free_op2;
        !           224: 
        !           225:        bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
        !           226:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           227:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           228:        FREE_OP1();
        !           229:        FREE_OP2();
        !           230:        ZEND_VM_NEXT_OPCODE();
        !           231: }
        !           232: 
        !           233: ZEND_VM_HANDLER(10, ZEND_BW_AND, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           234: {
        !           235:        zend_op *opline = EX(opline);
        !           236:        zend_free_op free_op1, free_op2;
        !           237: 
        !           238:        bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
        !           239:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           240:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           241:        FREE_OP1();
        !           242:        FREE_OP2();
        !           243:        ZEND_VM_NEXT_OPCODE();
        !           244: }
        !           245: 
        !           246: ZEND_VM_HANDLER(11, ZEND_BW_XOR, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           247: {
        !           248:        zend_op *opline = EX(opline);
        !           249:        zend_free_op free_op1, free_op2;
        !           250: 
        !           251:        bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
        !           252:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           253:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           254:        FREE_OP1();
        !           255:        FREE_OP2();
        !           256:        ZEND_VM_NEXT_OPCODE();
        !           257: }
        !           258: 
        !           259: ZEND_VM_HANDLER(14, ZEND_BOOL_XOR, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !           260: {
        !           261:        zend_op *opline = EX(opline);
        !           262:        zend_free_op free_op1, free_op2;
        !           263: 
        !           264:        boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
        !           265:                GET_OP1_ZVAL_PTR(BP_VAR_R),
        !           266:                GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           267:        FREE_OP1();
        !           268:        FREE_OP2();
        !           269:        ZEND_VM_NEXT_OPCODE();
        !           270: }
        !           271: 
        !           272: ZEND_VM_HANDLER(12, ZEND_BW_NOT, CONST|TMP|VAR|CV, ANY)
        !           273: {
        !           274:        zend_op *opline = EX(opline);
        !           275:        zend_free_op free_op1;
        !           276: 
        !           277:        bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
        !           278:                GET_OP1_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           279:        FREE_OP1();
        !           280:        ZEND_VM_NEXT_OPCODE();
        !           281: }
        !           282: 
        !           283: ZEND_VM_HANDLER(13, ZEND_BOOL_NOT, CONST|TMP|VAR|CV, ANY)
        !           284: {
        !           285:        zend_op *opline = EX(opline);
        !           286:        zend_free_op free_op1;
        !           287: 
        !           288:        boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
        !           289:                GET_OP1_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !           290:        FREE_OP1();
        !           291:        ZEND_VM_NEXT_OPCODE();
        !           292: }
        !           293: 
        !           294: ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV, int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC))
        !           295: {
        !           296:        zend_op *opline = EX(opline);
        !           297:        zend_op *op_data = opline+1;
        !           298:        zend_free_op free_op1, free_op2, free_op_data1;
        !           299:        zval **object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !           300:        zval *object;
        !           301:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !           302:        zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
        !           303:        znode *result = &opline->result;
        !           304:        int have_get_ptr = 0;
        !           305: 
        !           306:        if (OP1_TYPE == IS_VAR && !object_ptr) {
        !           307:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
        !           308:        }
        !           309: 
        !           310:        EX_T(result->u.var).var.ptr_ptr = NULL;
        !           311:        make_real_object(object_ptr TSRMLS_CC);
        !           312:        object = *object_ptr;
        !           313: 
        !           314:        if (Z_TYPE_P(object) != IS_OBJECT) {
        !           315:                zend_error(E_WARNING, "Attempt to assign property of non-object");
        !           316:                FREE_OP2();
        !           317:                FREE_OP(free_op_data1);
        !           318: 
        !           319:                if (!RETURN_VALUE_UNUSED(result)) {
        !           320:                        EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
        !           321:                        EX_T(result->u.var).var.ptr_ptr = NULL;
        !           322:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !           323:                }
        !           324:        } else {
        !           325:                /* here we are sure we are dealing with an object */
        !           326:                if (IS_OP2_TMP_FREE()) {
        !           327:                        MAKE_REAL_ZVAL_PTR(property);
        !           328:                }
        !           329: 
        !           330:                /* here property is a string */
        !           331:                if (opline->extended_value == ZEND_ASSIGN_OBJ
        !           332:                        && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
        !           333:                        zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
        !           334:                        if (zptr != NULL) {                     /* NULL means no success in getting PTR */
        !           335:                                SEPARATE_ZVAL_IF_NOT_REF(zptr);
        !           336: 
        !           337:                                have_get_ptr = 1;
        !           338:                                binary_op(*zptr, *zptr, value TSRMLS_CC);
        !           339:                                if (!RETURN_VALUE_UNUSED(result)) {
        !           340:                                        EX_T(result->u.var).var.ptr = *zptr;
        !           341:                                        EX_T(result->u.var).var.ptr_ptr = NULL;
        !           342:                                        PZVAL_LOCK(*zptr);
        !           343:                                }
        !           344:                        }
        !           345:                }
        !           346: 
        !           347:                if (!have_get_ptr) {
        !           348:                        zval *z = NULL;
        !           349: 
        !           350:                        if (opline->extended_value == ZEND_ASSIGN_OBJ) {
        !           351:                                if (Z_OBJ_HT_P(object)->read_property) {
        !           352:                                        z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
        !           353:                                }
        !           354:                        } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
        !           355:                                if (Z_OBJ_HT_P(object)->read_dimension) {
        !           356:                                        z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
        !           357:                                }
        !           358:                        }
        !           359:                        if (z) {
        !           360:                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
        !           361:                                        zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
        !           362: 
        !           363:                                        if (Z_REFCOUNT_P(z) == 0) {
        !           364:                                                GC_REMOVE_ZVAL_FROM_BUFFER(z);
        !           365:                                                zval_dtor(z);
        !           366:                                                FREE_ZVAL(z);
        !           367:                                        }
        !           368:                                        z = value;
        !           369:                                }
        !           370:                                Z_ADDREF_P(z);
        !           371:                                SEPARATE_ZVAL_IF_NOT_REF(&z);
        !           372:                                binary_op(z, z, value TSRMLS_CC);
        !           373:                                if (opline->extended_value == ZEND_ASSIGN_OBJ) {
        !           374:                                        Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
        !           375:                                } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
        !           376:                                        Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
        !           377:                                }
        !           378:                                if (!RETURN_VALUE_UNUSED(result)) {
        !           379:                                        EX_T(result->u.var).var.ptr = z;
        !           380:                                        EX_T(result->u.var).var.ptr_ptr = NULL;
        !           381:                                        PZVAL_LOCK(z);
        !           382:                                }
        !           383:                                zval_ptr_dtor(&z);
        !           384:                        } else {
        !           385:                                zend_error(E_WARNING, "Attempt to assign property of non-object");
        !           386:                                if (!RETURN_VALUE_UNUSED(result)) {
        !           387:                                        EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
        !           388:                                        EX_T(result->u.var).var.ptr_ptr = NULL;
        !           389:                                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !           390:                                }
        !           391:                        }
        !           392:                }
        !           393: 
        !           394:                if (IS_OP2_TMP_FREE()) {
        !           395:                        zval_ptr_dtor(&property);
        !           396:                } else {
        !           397:                        FREE_OP2();
        !           398:                }
        !           399:                FREE_OP(free_op_data1);
        !           400:        }
        !           401: 
        !           402:        FREE_OP1_VAR_PTR();
        !           403:        /* assign_obj has two opcodes! */
        !           404:        ZEND_VM_INC_OPCODE();
        !           405:        ZEND_VM_NEXT_OPCODE();
        !           406: }
        !           407: 
        !           408: ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV, int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC))
        !           409: {
        !           410:        zend_op *opline = EX(opline);
        !           411:        zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
        !           412:        zval **var_ptr;
        !           413:        zval *value;
        !           414: 
        !           415:        switch (opline->extended_value) {
        !           416:                case ZEND_ASSIGN_OBJ:
        !           417:                        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_obj_helper, binary_op, binary_op);
        !           418:                        break;
        !           419:                case ZEND_ASSIGN_DIM: {
        !           420:                                zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
        !           421: 
        !           422:                                if (OP1_TYPE == IS_VAR && !container) {
        !           423:                                        zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !           424:                                } else if (Z_TYPE_PP(container) == IS_OBJECT) {
        !           425:                                        if (OP1_TYPE == IS_VAR && !OP1_FREE) {
        !           426:                                                Z_ADDREF_PP(container);  /* undo the effect of get_obj_zval_ptr_ptr() */
        !           427:                                        }
        !           428:                                        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_obj_helper, binary_op, binary_op);
        !           429:                                } else {
        !           430:                                        zend_op *op_data = opline+1;
        !           431:                                        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !           432: 
        !           433:                                        zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_RW TSRMLS_CC);
        !           434:                                        value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
        !           435:                                        var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
        !           436:                                        ZEND_VM_INC_OPCODE();
        !           437:                                }
        !           438:                        }
        !           439:                        break;
        !           440:                default:
        !           441:                        value = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !           442:                        var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !           443:                        /* do nothing */
        !           444:                        break;
        !           445:        }
        !           446: 
        !           447:        if (!var_ptr) {
        !           448:                zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
        !           449:        }
        !           450: 
        !           451:        if (*var_ptr == EG(error_zval_ptr)) {
        !           452:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           453:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !           454:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !           455:                }
        !           456:                FREE_OP2();
        !           457:                FREE_OP1_VAR_PTR();
        !           458:                ZEND_VM_NEXT_OPCODE();
        !           459:        }
        !           460: 
        !           461:        SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
        !           462: 
        !           463:        if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
        !           464:           && Z_OBJ_HANDLER_PP(var_ptr, set)) {
        !           465:                /* proxy object */
        !           466:                zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
        !           467:                Z_ADDREF_P(objval);
        !           468:                binary_op(objval, objval, value TSRMLS_CC);
        !           469:                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
        !           470:                zval_ptr_dtor(&objval);
        !           471:        } else {
        !           472:                binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
        !           473:        }
        !           474: 
        !           475:        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           476:                AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
        !           477:                PZVAL_LOCK(*var_ptr);
        !           478:        }
        !           479:        FREE_OP2();
        !           480: 
        !           481:        if (opline->extended_value == ZEND_ASSIGN_DIM) {
        !           482:                FREE_OP(free_op_data1);
        !           483:                FREE_OP_VAR_PTR(free_op_data2);
        !           484:        }
        !           485:        FREE_OP1_VAR_PTR();
        !           486:        ZEND_VM_NEXT_OPCODE();
        !           487: }
        !           488: 
        !           489: ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           490: {
        !           491:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, add_function);
        !           492: }
        !           493: 
        !           494: ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           495: {
        !           496:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, sub_function);
        !           497: }
        !           498: 
        !           499: ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           500: {
        !           501:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, mul_function);
        !           502: }
        !           503: 
        !           504: ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           505: {
        !           506:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, div_function);
        !           507: }
        !           508: 
        !           509: ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           510: {
        !           511:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, mod_function);
        !           512: }
        !           513: 
        !           514: ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           515: {
        !           516:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, shift_left_function);
        !           517: }
        !           518: 
        !           519: ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           520: {
        !           521:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, shift_right_function);
        !           522: }
        !           523: 
        !           524: ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           525: {
        !           526:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, concat_function);
        !           527: }
        !           528: 
        !           529: ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           530: {
        !           531:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, bitwise_or_function);
        !           532: }
        !           533: 
        !           534: ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           535: {
        !           536:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, bitwise_and_function);
        !           537: }
        !           538: 
        !           539: ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !           540: {
        !           541:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_binary_assign_op_helper, binary_op, bitwise_xor_function);
        !           542: }
        !           543: 
        !           544: ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|CV, incdec_t incdec_op)
        !           545: {
        !           546:        zend_op *opline = EX(opline);
        !           547:        zend_free_op free_op1, free_op2;
        !           548:        zval **object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !           549:        zval *object;
        !           550:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !           551:        zval **retval = &EX_T(opline->result.u.var).var.ptr;
        !           552:        int have_get_ptr = 0;
        !           553: 
        !           554:        if (OP1_TYPE == IS_VAR && !object_ptr) {
        !           555:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           556:        }
        !           557: 
        !           558:        make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
        !           559:        object = *object_ptr;
        !           560: 
        !           561:        if (Z_TYPE_P(object) != IS_OBJECT) {
        !           562:                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
        !           563:                FREE_OP2();
        !           564:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           565:                        *retval = EG(uninitialized_zval_ptr);
        !           566:                        PZVAL_LOCK(*retval);
        !           567:                }
        !           568:                FREE_OP1_VAR_PTR();
        !           569:                ZEND_VM_NEXT_OPCODE();
        !           570:        }
        !           571: 
        !           572:        /* here we are sure we are dealing with an object */
        !           573: 
        !           574:        if (IS_OP2_TMP_FREE()) {
        !           575:                MAKE_REAL_ZVAL_PTR(property);
        !           576:        }
        !           577: 
        !           578:        if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
        !           579:                zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
        !           580:                if (zptr != NULL) {                     /* NULL means no success in getting PTR */
        !           581:                        SEPARATE_ZVAL_IF_NOT_REF(zptr);
        !           582: 
        !           583:                        have_get_ptr = 1;
        !           584:                        incdec_op(*zptr);
        !           585:                        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           586:                                *retval = *zptr;
        !           587:                                PZVAL_LOCK(*retval);
        !           588:                        }
        !           589:                }
        !           590:        }
        !           591: 
        !           592:        if (!have_get_ptr) {
        !           593:                if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
        !           594:                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
        !           595: 
        !           596:                        if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
        !           597:                                zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
        !           598: 
        !           599:                                if (Z_REFCOUNT_P(z) == 0) {
        !           600:                                        GC_REMOVE_ZVAL_FROM_BUFFER(z);
        !           601:                                        zval_dtor(z);
        !           602:                                        FREE_ZVAL(z);
        !           603:                                }
        !           604:                                z = value;
        !           605:                        }
        !           606:                        Z_ADDREF_P(z);
        !           607:                        SEPARATE_ZVAL_IF_NOT_REF(&z);
        !           608:                        incdec_op(z);
        !           609:                        *retval = z;
        !           610:                        Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
        !           611:                        SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
        !           612:                        zval_ptr_dtor(&z);
        !           613:                } else {
        !           614:                        zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
        !           615:                        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           616:                                *retval = EG(uninitialized_zval_ptr);
        !           617:                                PZVAL_LOCK(*retval);
        !           618:                        }
        !           619:                }
        !           620:        }
        !           621: 
        !           622:        if (IS_OP2_TMP_FREE()) {
        !           623:                zval_ptr_dtor(&property);
        !           624:        } else {
        !           625:                FREE_OP2();
        !           626:        }
        !           627:        FREE_OP1_VAR_PTR();
        !           628:        ZEND_VM_NEXT_OPCODE();
        !           629: }
        !           630: 
        !           631: ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !           632: {
        !           633:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, incdec_op, increment_function);
        !           634: }
        !           635: 
        !           636: ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !           637: {
        !           638:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, incdec_op, decrement_function);
        !           639: }
        !           640: 
        !           641: ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|CV, incdec_t incdec_op)
        !           642: {
        !           643:        zend_op *opline = EX(opline);
        !           644:        zend_free_op free_op1, free_op2;
        !           645:        zval **object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !           646:        zval *object;
        !           647:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !           648:        zval *retval = &EX_T(opline->result.u.var).tmp_var;
        !           649:        int have_get_ptr = 0;
        !           650: 
        !           651:        if (OP1_TYPE == IS_VAR && !object_ptr) {
        !           652:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           653:        }
        !           654: 
        !           655:        make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
        !           656:        object = *object_ptr;
        !           657: 
        !           658:        if (Z_TYPE_P(object) != IS_OBJECT) {
        !           659:                zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
        !           660:                FREE_OP2();
        !           661:                *retval = *EG(uninitialized_zval_ptr);
        !           662:                FREE_OP1_VAR_PTR();
        !           663:                ZEND_VM_NEXT_OPCODE();
        !           664:        }
        !           665: 
        !           666:        /* here we are sure we are dealing with an object */
        !           667: 
        !           668:        if (IS_OP2_TMP_FREE()) {
        !           669:                MAKE_REAL_ZVAL_PTR(property);
        !           670:        }
        !           671: 
        !           672:        if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
        !           673:                zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
        !           674:                if (zptr != NULL) {                     /* NULL means no success in getting PTR */
        !           675:                        have_get_ptr = 1;
        !           676:                        SEPARATE_ZVAL_IF_NOT_REF(zptr);
        !           677: 
        !           678:                        *retval = **zptr;
        !           679:                        zendi_zval_copy_ctor(*retval);
        !           680: 
        !           681:                        incdec_op(*zptr);
        !           682: 
        !           683:                }
        !           684:        }
        !           685: 
        !           686:        if (!have_get_ptr) {
        !           687:                if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
        !           688:                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
        !           689:                        zval *z_copy;
        !           690: 
        !           691:                        if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
        !           692:                                zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
        !           693: 
        !           694:                                if (Z_REFCOUNT_P(z) == 0) {
        !           695:                                        GC_REMOVE_ZVAL_FROM_BUFFER(z);
        !           696:                                        zval_dtor(z);
        !           697:                                        FREE_ZVAL(z);
        !           698:                                }
        !           699:                                z = value;
        !           700:                        }
        !           701:                        *retval = *z;
        !           702:                        zendi_zval_copy_ctor(*retval);
        !           703:                        ALLOC_ZVAL(z_copy);
        !           704:                        *z_copy = *z;
        !           705:                        zendi_zval_copy_ctor(*z_copy);
        !           706:                        INIT_PZVAL(z_copy);
        !           707:                        incdec_op(z_copy);
        !           708:                        Z_ADDREF_P(z);
        !           709:                        Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
        !           710:                        zval_ptr_dtor(&z_copy);
        !           711:                        zval_ptr_dtor(&z);
        !           712:                } else {
        !           713:                        zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
        !           714:                        *retval = *EG(uninitialized_zval_ptr);
        !           715:                }
        !           716:        }
        !           717: 
        !           718:        if (IS_OP2_TMP_FREE()) {
        !           719:                zval_ptr_dtor(&property);
        !           720:        } else {
        !           721:                FREE_OP2();
        !           722:        }
        !           723:        FREE_OP1_VAR_PTR();
        !           724:        ZEND_VM_NEXT_OPCODE();
        !           725: }
        !           726: 
        !           727: ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !           728: {
        !           729:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, incdec_op, increment_function);
        !           730: }
        !           731: 
        !           732: ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !           733: {
        !           734:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, incdec_op, decrement_function);
        !           735: }
        !           736: 
        !           737: ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
        !           738: {
        !           739:        zend_op *opline = EX(opline);
        !           740:        zend_free_op free_op1;
        !           741:        zval **var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !           742: 
        !           743:        if (OP1_TYPE == IS_VAR && !var_ptr) {
        !           744:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           745:        }
        !           746:        if (OP1_TYPE == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
        !           747:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           748:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !           749:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !           750:                }
        !           751:                FREE_OP1_VAR_PTR();
        !           752:                ZEND_VM_NEXT_OPCODE();
        !           753:        }
        !           754: 
        !           755:        SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
        !           756: 
        !           757:        if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
        !           758:           && Z_OBJ_HANDLER_PP(var_ptr, set)) {
        !           759:                /* proxy object */
        !           760:                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
        !           761:                Z_ADDREF_P(val);
        !           762:                increment_function(val);
        !           763:                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
        !           764:                zval_ptr_dtor(&val);
        !           765:        } else {
        !           766:                increment_function(*var_ptr);
        !           767:        }
        !           768: 
        !           769:        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           770:                AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
        !           771:                PZVAL_LOCK(*var_ptr);
        !           772:        }
        !           773: 
        !           774:        FREE_OP1_VAR_PTR();
        !           775:        ZEND_VM_NEXT_OPCODE();
        !           776: }
        !           777: 
        !           778: ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
        !           779: {
        !           780:        zend_op *opline = EX(opline);
        !           781:        zend_free_op free_op1;
        !           782:        zval **var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !           783: 
        !           784:        if (OP1_TYPE == IS_VAR && !var_ptr) {
        !           785:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           786:        }
        !           787:        if (OP1_TYPE == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
        !           788:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           789:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !           790:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !           791:                }
        !           792:                FREE_OP1_VAR_PTR();
        !           793:                ZEND_VM_NEXT_OPCODE();
        !           794:        }
        !           795: 
        !           796:        SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
        !           797: 
        !           798:        if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
        !           799:           && Z_OBJ_HANDLER_PP(var_ptr, set)) {
        !           800:                /* proxy object */
        !           801:                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
        !           802:                Z_ADDREF_P(val);
        !           803:                decrement_function(val);
        !           804:                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
        !           805:                zval_ptr_dtor(&val);
        !           806:        } else {
        !           807:                decrement_function(*var_ptr);
        !           808:        }
        !           809: 
        !           810:        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           811:                AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
        !           812:                PZVAL_LOCK(*var_ptr);
        !           813:        }
        !           814: 
        !           815:        FREE_OP1_VAR_PTR();
        !           816:        ZEND_VM_NEXT_OPCODE();
        !           817: }
        !           818: 
        !           819: ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
        !           820: {
        !           821:        zend_op *opline = EX(opline);
        !           822:        zend_free_op free_op1;
        !           823:        zval **var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !           824: 
        !           825:        if (OP1_TYPE == IS_VAR && !var_ptr) {
        !           826:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           827:        }
        !           828:        if (OP1_TYPE == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
        !           829:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           830:                        EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
        !           831:                }
        !           832:                FREE_OP1_VAR_PTR();
        !           833:                ZEND_VM_NEXT_OPCODE();
        !           834:        }
        !           835: 
        !           836:        EX_T(opline->result.u.var).tmp_var = **var_ptr;
        !           837:        zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
        !           838: 
        !           839:        SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
        !           840: 
        !           841:        if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
        !           842:           && Z_OBJ_HANDLER_PP(var_ptr, set)) {
        !           843:                /* proxy object */
        !           844:                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
        !           845:                Z_ADDREF_P(val);
        !           846:                increment_function(val);
        !           847:                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
        !           848:                zval_ptr_dtor(&val);
        !           849:        } else {
        !           850:                increment_function(*var_ptr);
        !           851:        }
        !           852: 
        !           853:        FREE_OP1_VAR_PTR();
        !           854:        ZEND_VM_NEXT_OPCODE();
        !           855: }
        !           856: 
        !           857: ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
        !           858: {
        !           859:        zend_op *opline = EX(opline);
        !           860:        zend_free_op free_op1;
        !           861:        zval **var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !           862: 
        !           863:        if (OP1_TYPE == IS_VAR && !var_ptr) {
        !           864:                zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
        !           865:        }
        !           866:        if (OP1_TYPE == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
        !           867:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !           868:                        EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
        !           869:                }
        !           870:                FREE_OP1_VAR_PTR();
        !           871:                ZEND_VM_NEXT_OPCODE();
        !           872:        }
        !           873: 
        !           874:        EX_T(opline->result.u.var).tmp_var = **var_ptr;
        !           875:        zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
        !           876: 
        !           877:        SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
        !           878: 
        !           879:        if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
        !           880:           && Z_OBJ_HANDLER_PP(var_ptr, set)) {
        !           881:                /* proxy object */
        !           882:                zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
        !           883:                Z_ADDREF_P(val);
        !           884:                decrement_function(val);
        !           885:                Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
        !           886:                zval_ptr_dtor(&val);
        !           887:        } else {
        !           888:                decrement_function(*var_ptr);
        !           889:        }
        !           890: 
        !           891:        FREE_OP1_VAR_PTR();
        !           892:        ZEND_VM_NEXT_OPCODE();
        !           893: }
        !           894: 
        !           895: ZEND_VM_HANDLER(40, ZEND_ECHO, CONST|TMP|VAR|CV, ANY)
        !           896: {
        !           897:        zend_op *opline = EX(opline);
        !           898:        zend_free_op free_op1;
        !           899:        zval z_copy;
        !           900:        zval *z = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !           901: 
        !           902:        if (OP1_TYPE != IS_CONST &&
        !           903:            Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL) {
        !           904:            if (OP1_TYPE == IS_TMP_VAR) {
        !           905:                INIT_PZVAL(z);
        !           906:            }
        !           907:                if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
        !           908:                        zend_print_variable(&z_copy);
        !           909:                        zval_dtor(&z_copy);
        !           910:                } else {
        !           911:                        zend_print_variable(z);
        !           912:                }
        !           913:        } else {
        !           914:                zend_print_variable(z);
        !           915:        }
        !           916: 
        !           917:        FREE_OP1();
        !           918:        ZEND_VM_NEXT_OPCODE();
        !           919: }
        !           920: 
        !           921: ZEND_VM_HANDLER(41, ZEND_PRINT, CONST|TMP|VAR|CV, ANY)
        !           922: {
        !           923:        zend_op *opline = EX(opline);
        !           924: 
        !           925:        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
        !           926:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
        !           927: 
        !           928:        ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ECHO);
        !           929: }
        !           930: 
        !           931: ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, ANY, int type)
        !           932: {
        !           933:        zend_op *opline = EX(opline);
        !           934:        zend_free_op free_op1;
        !           935:        zval *varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !           936:        zval **retval;
        !           937:        zval tmp_varname;
        !           938:        HashTable *target_symbol_table;
        !           939: 
        !           940:        if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
        !           941:                tmp_varname = *varname;
        !           942:                zval_copy_ctor(&tmp_varname);
        !           943:                convert_to_string(&tmp_varname);
        !           944:                varname = &tmp_varname;
        !           945:        }
        !           946: 
        !           947:        if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
        !           948:                retval = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0 TSRMLS_CC);
        !           949:                FREE_OP1();
        !           950:        } else {
        !           951:                target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
        !           952: /*
        !           953:                if (!target_symbol_table) {
        !           954:                        ZEND_VM_NEXT_OPCODE();
        !           955:                }
        !           956: */
        !           957:                if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) {
        !           958:                        switch (type) {
        !           959:                                case BP_VAR_R:
        !           960:                                case BP_VAR_UNSET:
        !           961:                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
        !           962:                                        /* break missing intentionally */
        !           963:                                case BP_VAR_IS:
        !           964:                                        retval = &EG(uninitialized_zval_ptr);
        !           965:                                        break;
        !           966:                                case BP_VAR_RW:
        !           967:                                        zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
        !           968:                                        /* break missing intentionally */
        !           969:                                case BP_VAR_W: {
        !           970:                                                zval *new_zval = &EG(uninitialized_zval);
        !           971: 
        !           972:                                                Z_ADDREF_P(new_zval);
        !           973:                                                zend_hash_update(target_symbol_table, varname->value.str.val, varname->value.str.len+1, &new_zval, sizeof(zval *), (void **) &retval);
        !           974:                                        }
        !           975:                                        break;
        !           976:                                EMPTY_SWITCH_DEFAULT_CASE()
        !           977:                        }
        !           978:                }
        !           979:                switch (opline->op2.u.EA.type) {
        !           980:                        case ZEND_FETCH_GLOBAL:
        !           981:                                if (OP1_TYPE != IS_TMP_VAR) {
        !           982:                                        FREE_OP1();
        !           983:                                }
        !           984:                                break;
        !           985:                        case ZEND_FETCH_LOCAL:
        !           986:                                FREE_OP1();
        !           987:                                break;
        !           988:                        case ZEND_FETCH_STATIC:
        !           989:                                zval_update_constant(retval, (void*) 1 TSRMLS_CC);
        !           990:                                break;
        !           991:                        case ZEND_FETCH_GLOBAL_LOCK:
        !           992:                                if (OP1_TYPE == IS_VAR && !free_op1.var) {
        !           993:                                        PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
        !           994:                                }
        !           995:                                break;
        !           996:                }
        !           997:        }
        !           998: 
        !           999: 
        !          1000:        if (OP1_TYPE != IS_CONST && varname == &tmp_varname) {
        !          1001:                zval_dtor(varname);
        !          1002:        }
        !          1003:        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1004:                if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
        !          1005:                        SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
        !          1006:                }
        !          1007:                PZVAL_LOCK(*retval);
        !          1008:                switch (type) {
        !          1009:                        case BP_VAR_R:
        !          1010:                        case BP_VAR_IS:
        !          1011:                                AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
        !          1012:                                break;
        !          1013:                        case BP_VAR_UNSET: {
        !          1014:                                zend_free_op free_res;
        !          1015: 
        !          1016:                                EX_T(opline->result.u.var).var.ptr_ptr = retval;
        !          1017:                                PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
        !          1018:                                if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
        !          1019:                                        SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1020:                                }
        !          1021:                                PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
        !          1022:                                FREE_OP_VAR_PTR(free_res);
        !          1023:                                break;
        !          1024:                        default:
        !          1025:                                EX_T(opline->result.u.var).var.ptr_ptr = retval;
        !          1026:                                break;
        !          1027:                        }
        !          1028:                }
        !          1029:        }
        !          1030:        ZEND_VM_NEXT_OPCODE();
        !          1031: }
        !          1032: 
        !          1033: ZEND_VM_HANDLER(80, ZEND_FETCH_R, CONST|TMP|VAR|CV, ANY)
        !          1034: {
        !          1035:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_R);
        !          1036: }
        !          1037: 
        !          1038: ZEND_VM_HANDLER(83, ZEND_FETCH_W, CONST|TMP|VAR|CV, ANY)
        !          1039: {
        !          1040:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_W);
        !          1041: }
        !          1042: 
        !          1043: ZEND_VM_HANDLER(86, ZEND_FETCH_RW, CONST|TMP|VAR|CV, ANY)
        !          1044: {
        !          1045:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_RW);
        !          1046: }
        !          1047: 
        !          1048: ZEND_VM_HANDLER(92, ZEND_FETCH_FUNC_ARG, CONST|TMP|VAR|CV, ANY)
        !          1049: {
        !          1050:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type,
        !          1051:                ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R);
        !          1052: }
        !          1053: 
        !          1054: ZEND_VM_HANDLER(95, ZEND_FETCH_UNSET, CONST|TMP|VAR|CV, ANY)
        !          1055: {
        !          1056:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_UNSET);
        !          1057: }
        !          1058: 
        !          1059: ZEND_VM_HANDLER(89, ZEND_FETCH_IS, CONST|TMP|VAR|CV, ANY)
        !          1060: {
        !          1061:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_var_address_helper, type, BP_VAR_IS);
        !          1062: }
        !          1063: 
        !          1064: ZEND_VM_HANDLER(81, ZEND_FETCH_DIM_R, VAR|CV, CONST|TMP|VAR|CV)
        !          1065: {
        !          1066:        zend_op *opline = EX(opline);
        !          1067:        zend_free_op free_op1, free_op2;
        !          1068:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1069:        zval **container;
        !          1070: 
        !          1071:        if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
        !          1072:            OP1_TYPE != IS_CV &&
        !          1073:            EX_T(opline->op1.u.var).var.ptr_ptr) {
        !          1074:                PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
        !          1075:        }
        !          1076:        container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
        !          1077:        if (OP1_TYPE == IS_VAR && !container) {
        !          1078:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1079:        }
        !          1080:        zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_R TSRMLS_CC);
        !          1081:        FREE_OP2();
        !          1082:        FREE_OP1_VAR_PTR();
        !          1083:        ZEND_VM_NEXT_OPCODE();
        !          1084: }
        !          1085: 
        !          1086: ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        !          1087: {
        !          1088:        zend_op *opline = EX(opline);
        !          1089:        zend_free_op free_op1, free_op2;
        !          1090:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1091:        zval **container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          1092: 
        !          1093:        if (OP1_TYPE == IS_VAR && !container) {
        !          1094:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1095:        }
        !          1096:        zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);
        !          1097:        FREE_OP2();
        !          1098:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1099:            READY_TO_DESTROY(free_op1.var)) {
        !          1100:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1101:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1102:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1103:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1104:                }
        !          1105:        }
        !          1106:        FREE_OP1_VAR_PTR();
        !          1107: 
        !          1108:        /* We are going to assign the result by reference */
        !          1109:        if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
        !          1110:                Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1111:                SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1112:                Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1113:        }
        !          1114: 
        !          1115:        ZEND_VM_NEXT_OPCODE();
        !          1116: }
        !          1117: 
        !          1118: ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        !          1119: {
        !          1120:        zend_op *opline = EX(opline);
        !          1121:        zend_free_op free_op1, free_op2;
        !          1122:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1123:        zval **container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
        !          1124: 
        !          1125:        if (OP1_TYPE == IS_VAR && !container) {
        !          1126:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1127:        }
        !          1128:        zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_RW TSRMLS_CC);
        !          1129:        FREE_OP2();
        !          1130:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1131:            READY_TO_DESTROY(free_op1.var)) {
        !          1132:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1133:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1134:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1135:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1136:                }
        !          1137:        }
        !          1138:        FREE_OP1_VAR_PTR();
        !          1139:        ZEND_VM_NEXT_OPCODE();
        !          1140: }
        !          1141: 
        !          1142: ZEND_VM_HANDLER(90, ZEND_FETCH_DIM_IS, VAR|CV, CONST|TMP|VAR|CV)
        !          1143: {
        !          1144:        zend_op *opline = EX(opline);
        !          1145:        zend_free_op free_op1, free_op2;
        !          1146:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1147:        zval **container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_IS);
        !          1148: 
        !          1149:        if (OP1_TYPE == IS_VAR && !container) {
        !          1150:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1151:        }
        !          1152:        zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_IS TSRMLS_CC);
        !          1153:        FREE_OP2();
        !          1154:        FREE_OP1_VAR_PTR();
        !          1155:        ZEND_VM_NEXT_OPCODE();
        !          1156: }
        !          1157: 
        !          1158: ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        !          1159: {
        !          1160:        zend_op *opline = EX(opline);
        !          1161:        zend_free_op free_op1, free_op2;
        !          1162:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1163:        zval **container;
        !          1164: 
        !          1165:        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
        !          1166:                container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          1167:                if (OP1_TYPE == IS_VAR && !container) {
        !          1168:                        zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1169:                }
        !          1170:                zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);
        !          1171:                if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1172:                    READY_TO_DESTROY(free_op1.var)) {
        !          1173:                        AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1174:                        if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1175:                            Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1176:                                SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1177:                        }
        !          1178:                }
        !          1179:        } else {
        !          1180:                if (OP2_TYPE == IS_UNUSED) {
        !          1181:                        zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
        !          1182:                }
        !          1183:                container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
        !          1184:                if (OP1_TYPE == IS_VAR && !container) {
        !          1185:                        zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1186:                }
        !          1187:                zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_R TSRMLS_CC);
        !          1188:        }
        !          1189:        FREE_OP2();
        !          1190:        FREE_OP1_VAR_PTR();
        !          1191:        ZEND_VM_NEXT_OPCODE();
        !          1192: }
        !          1193: 
        !          1194: ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMP|VAR|CV)
        !          1195: {
        !          1196:        zend_op *opline = EX(opline);
        !          1197:        zend_free_op free_op1, free_op2;
        !          1198:        zval **container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_UNSET);
        !          1199:        zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1200: 
        !          1201:        /* Not needed in DIM_UNSET
        !          1202:        if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
        !          1203:                PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
        !          1204:        }
        !          1205:        */
        !          1206:        if (OP1_TYPE == IS_CV) {
        !          1207:                if (container != &EG(uninitialized_zval_ptr)) {
        !          1208:                        SEPARATE_ZVAL_IF_NOT_REF(container);
        !          1209:                }
        !          1210:        }
        !          1211:        if (OP1_TYPE == IS_VAR && !container) {
        !          1212:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1213:        }
        !          1214:        zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, IS_OP2_TMP_FREE(), BP_VAR_UNSET TSRMLS_CC);
        !          1215:        FREE_OP2();
        !          1216:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1217:            READY_TO_DESTROY(free_op1.var)) {
        !          1218:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1219:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1220:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1221:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1222:                }
        !          1223:        }
        !          1224:        FREE_OP1_VAR_PTR();
        !          1225:        if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
        !          1226:                zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
        !          1227:        } else {
        !          1228:                zend_free_op free_res;
        !          1229: 
        !          1230:                PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
        !          1231:                if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
        !          1232:                        SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1233:                }
        !          1234:                PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
        !          1235:                FREE_OP_VAR_PTR(free_res);
        !          1236:        }
        !          1237:        ZEND_VM_NEXT_OPCODE();
        !          1238: }
        !          1239: 
        !          1240: ZEND_VM_HELPER_EX(zend_fetch_property_address_read_helper, VAR|UNUSED|CV, CONST|TMP|VAR|CV, int type)
        !          1241: {
        !          1242:        zend_op *opline = EX(opline);
        !          1243:        zend_free_op free_op1;
        !          1244:        zval *container = GET_OP1_OBJ_ZVAL_PTR(type);
        !          1245:        zend_free_op free_op2;
        !          1246:        zval *offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1247: 
        !          1248:        if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
        !          1249:                if (type != BP_VAR_IS) {
        !          1250:                        zend_error(E_NOTICE, "Trying to get property of non-object");
        !          1251:                }
        !          1252:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1253:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !          1254:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !          1255:                }
        !          1256:                FREE_OP2();
        !          1257:        } else {
        !          1258:                zval *retval;
        !          1259: 
        !          1260:                if (IS_OP2_TMP_FREE()) {
        !          1261:                        MAKE_REAL_ZVAL_PTR(offset);
        !          1262:                }
        !          1263: 
        !          1264:                /* here we are sure we are dealing with an object */
        !          1265:                retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
        !          1266: 
        !          1267:                if (RETURN_VALUE_UNUSED(&opline->result)) {
        !          1268:                        if (Z_REFCOUNT_P(retval) == 0) {
        !          1269:                                GC_REMOVE_ZVAL_FROM_BUFFER(retval);
        !          1270:                                zval_dtor(retval);
        !          1271:                                FREE_ZVAL(retval);
        !          1272:                        }
        !          1273:                } else {
        !          1274:                        AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
        !          1275:                        PZVAL_LOCK(retval);
        !          1276:                }
        !          1277: 
        !          1278:                if (IS_OP2_TMP_FREE()) {
        !          1279:                        zval_ptr_dtor(&offset);
        !          1280:                } else {
        !          1281:                        FREE_OP2();
        !          1282:                }
        !          1283:        }
        !          1284: 
        !          1285:        FREE_OP1();
        !          1286:        ZEND_VM_NEXT_OPCODE();
        !          1287: }
        !          1288: 
        !          1289: ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1290: {
        !          1291:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_property_address_read_helper, type, BP_VAR_R);
        !          1292: }
        !          1293: 
        !          1294: ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1295: {
        !          1296:        zend_op *opline = EX(opline);
        !          1297:        zend_free_op free_op1, free_op2;
        !          1298:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1299:        zval **container;
        !          1300: 
        !          1301:        if (OP1_TYPE == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
        !          1302:                PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
        !          1303:                EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
        !          1304:        }
        !          1305: 
        !          1306:        if (IS_OP2_TMP_FREE()) {
        !          1307:                MAKE_REAL_ZVAL_PTR(property);
        !          1308:        }
        !          1309:        container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !          1310:        if (OP1_TYPE == IS_VAR && !container) {
        !          1311:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
        !          1312:        }
        !          1313:        zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
        !          1314:        if (IS_OP2_TMP_FREE()) {
        !          1315:                zval_ptr_dtor(&property);
        !          1316:        } else {
        !          1317:                FREE_OP2();
        !          1318:        }
        !          1319:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1320:            READY_TO_DESTROY(free_op1.var)) {
        !          1321:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1322:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1323:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1324:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1325:                }
        !          1326:        }
        !          1327:        FREE_OP1_VAR_PTR();
        !          1328: 
        !          1329:        /* We are going to assign the result by reference */
        !          1330:        if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
        !          1331:                Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1332:                SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1333:                Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1334:        }
        !          1335:        
        !          1336:        ZEND_VM_NEXT_OPCODE();
        !          1337: }
        !          1338: 
        !          1339: ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1340: {
        !          1341:        zend_op *opline = EX(opline);
        !          1342:        zend_free_op free_op1, free_op2;
        !          1343:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1344:        zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_RW);
        !          1345: 
        !          1346:        if (IS_OP2_TMP_FREE()) {
        !          1347:                MAKE_REAL_ZVAL_PTR(property);
        !          1348:        }
        !          1349:        if (OP1_TYPE == IS_VAR && !container) {
        !          1350:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
        !          1351:        }
        !          1352:        zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
        !          1353:        if (IS_OP2_TMP_FREE()) {
        !          1354:                zval_ptr_dtor(&property);
        !          1355:        } else {
        !          1356:                FREE_OP2();
        !          1357:        }
        !          1358:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1359:            READY_TO_DESTROY(free_op1.var)) {
        !          1360:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1361:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1362:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1363:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1364:                }
        !          1365:        }
        !          1366:        FREE_OP1_VAR_PTR();
        !          1367:        ZEND_VM_NEXT_OPCODE();
        !          1368: }
        !          1369: 
        !          1370: ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1371: {
        !          1372:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_property_address_read_helper, type, BP_VAR_IS);
        !          1373: }
        !          1374: 
        !          1375: ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1376: {
        !          1377:        zend_op *opline = EX(opline);
        !          1378: 
        !          1379:        if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
        !          1380:                /* Behave like FETCH_OBJ_W */
        !          1381:                zend_free_op free_op1, free_op2;
        !          1382:                zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1383:                zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !          1384: 
        !          1385:                if (IS_OP2_TMP_FREE()) {
        !          1386:                        MAKE_REAL_ZVAL_PTR(property);
        !          1387:                }
        !          1388:                if (OP1_TYPE == IS_VAR && !container) {
        !          1389:                        zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
        !          1390:                }
        !          1391:                zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
        !          1392:                if (IS_OP2_TMP_FREE()) {
        !          1393:                        zval_ptr_dtor(&property);
        !          1394:                } else {
        !          1395:                        FREE_OP2();
        !          1396:                }
        !          1397:                if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1398:                    READY_TO_DESTROY(free_op1.var)) {
        !          1399:                        AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1400:                        if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1401:                            Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1402:                                SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1403:                        }
        !          1404:                }
        !          1405:                FREE_OP1_VAR_PTR();
        !          1406:                ZEND_VM_NEXT_OPCODE();
        !          1407:        } else {
        !          1408:                ZEND_VM_DISPATCH_TO_HELPER_EX(zend_fetch_property_address_read_helper, type, BP_VAR_R);
        !          1409:        }
        !          1410: }
        !          1411: 
        !          1412: ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1413: {
        !          1414:        zend_op *opline = EX(opline);
        !          1415:        zend_free_op free_op1, free_op2, free_res;
        !          1416:        zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_R);
        !          1417:        zval *property = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1418: 
        !          1419:        if (OP1_TYPE == IS_CV) {
        !          1420:                if (container != &EG(uninitialized_zval_ptr)) {
        !          1421:                        SEPARATE_ZVAL_IF_NOT_REF(container);
        !          1422:                }
        !          1423:        }
        !          1424:        if (IS_OP2_TMP_FREE()) {
        !          1425:                MAKE_REAL_ZVAL_PTR(property);
        !          1426:        }
        !          1427:        if (OP1_TYPE == IS_VAR && !container) {
        !          1428:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
        !          1429:        }
        !          1430:        zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
        !          1431:        if (IS_OP2_TMP_FREE()) {
        !          1432:                zval_ptr_dtor(&property);
        !          1433:        } else {
        !          1434:                FREE_OP2();
        !          1435:        }
        !          1436:        if (OP1_TYPE == IS_VAR && OP1_FREE &&
        !          1437:            READY_TO_DESTROY(free_op1.var)) {
        !          1438:                AI_USE_PTR(EX_T(opline->result.u.var).var);
        !          1439:                if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
        !          1440:                    Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
        !          1441:                        SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1442:                }
        !          1443:        }
        !          1444:        FREE_OP1_VAR_PTR();
        !          1445: 
        !          1446:        PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
        !          1447:        if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
        !          1448:                SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
        !          1449:        }
        !          1450:        PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
        !          1451:        FREE_OP_VAR_PTR(free_res);
        !          1452:        ZEND_VM_NEXT_OPCODE();
        !          1453: }
        !          1454: 
        !          1455: ZEND_VM_HANDLER(98, ZEND_FETCH_DIM_TMP_VAR, CONST|TMP, CONST)
        !          1456: {
        !          1457:        zend_op *opline = EX(opline);
        !          1458:        zend_free_op free_op1;
        !          1459:        zval *container = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1460: 
        !          1461:        if (Z_TYPE_P(container) != IS_ARRAY) {
        !          1462:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1463:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !          1464:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !          1465:                }
        !          1466:        } else {
        !          1467:                zend_free_op free_op2;
        !          1468:                zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1469: 
        !          1470:                AI_SET_PTR(EX_T(opline->result.u.var).var, *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), dim, BP_VAR_R TSRMLS_CC));
        !          1471:                SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
        !          1472:                FREE_OP2();
        !          1473:        }
        !          1474:        ZEND_VM_NEXT_OPCODE();
        !          1475: }
        !          1476: 
        !          1477: ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1478: {
        !          1479:        zend_op *opline = EX(opline);
        !          1480:        zend_op *op_data = opline+1;
        !          1481:        zend_free_op free_op1, free_op2;
        !          1482:        zval **object_ptr = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_W);
        !          1483:        zval *property_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1484: 
        !          1485:        if (IS_OP2_TMP_FREE()) {
        !          1486:                MAKE_REAL_ZVAL_PTR(property_name);
        !          1487:        }
        !          1488:        if (OP1_TYPE == IS_VAR && !object_ptr) {
        !          1489:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1490:        }
        !          1491:        zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
        !          1492:        if (IS_OP2_TMP_FREE()) {
        !          1493:                zval_ptr_dtor(&property_name);
        !          1494:        } else {
        !          1495:                FREE_OP2();
        !          1496:        }
        !          1497:        FREE_OP1_VAR_PTR();
        !          1498:        /* assign_obj has two opcodes! */
        !          1499:        ZEND_VM_INC_OPCODE();
        !          1500:        ZEND_VM_NEXT_OPCODE();
        !          1501: }
        !          1502: 
        !          1503: ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        !          1504: {
        !          1505:        zend_op *opline = EX(opline);
        !          1506:        zend_op *op_data = opline+1;
        !          1507:        zend_free_op free_op1;
        !          1508:        zval **object_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          1509: 
        !          1510:        if (OP1_TYPE == IS_VAR && !object_ptr) {
        !          1511:                zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
        !          1512:        }
        !          1513:        if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
        !          1514:                zend_free_op free_op2;
        !          1515:                zval *property_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1516: 
        !          1517:                if (IS_OP2_TMP_FREE()) {
        !          1518:                        MAKE_REAL_ZVAL_PTR(property_name);
        !          1519:                }
        !          1520:                zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
        !          1521:                if (IS_OP2_TMP_FREE()) {
        !          1522:                        zval_ptr_dtor(&property_name);
        !          1523:                } else {
        !          1524:                        FREE_OP2();
        !          1525:                }
        !          1526:        } else {
        !          1527:                zend_free_op free_op2, free_op_data1, free_op_data2;
        !          1528:                zval *value;
        !          1529:                zval *dim = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1530:                zval **variable_ptr_ptr;
        !          1531: 
        !          1532:                zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, IS_OP2_TMP_FREE(), BP_VAR_W TSRMLS_CC);
        !          1533:                FREE_OP2();
        !          1534: 
        !          1535:                value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
        !          1536:                variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
        !          1537:                if (!variable_ptr_ptr) {
        !          1538:                        if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
        !          1539:                                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1540:                                        EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          1541:                                        ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          1542:                                        INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
        !          1543:                                        ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(op_data->op2.u.var).str_offset.str)+EX_T(op_data->op2.u.var).str_offset.offset, 1, 1);
        !          1544:                                }
        !          1545:                        } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1546:                                AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !          1547:                                PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !          1548:                        }
        !          1549:                } else {
        !          1550:                        value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
        !          1551:                        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1552:                                AI_SET_PTR(EX_T(opline->result.u.var).var, value);
        !          1553:                                PZVAL_LOCK(value);
        !          1554:                        }
        !          1555:                }
        !          1556:                FREE_OP_VAR_PTR(free_op_data2);
        !          1557:                FREE_OP_IF_VAR(free_op_data1);
        !          1558:        }
        !          1559:        FREE_OP1_VAR_PTR();
        !          1560:        /* assign_dim has two opcodes! */
        !          1561:        ZEND_VM_INC_OPCODE();
        !          1562:        ZEND_VM_NEXT_OPCODE();
        !          1563: }
        !          1564: 
        !          1565: ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV)
        !          1566: {
        !          1567:        zend_op *opline = EX(opline);
        !          1568:        zend_free_op free_op1, free_op2;
        !          1569:        zval *value = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1570:        zval **variable_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          1571: 
        !          1572:        if (OP1_TYPE == IS_VAR && !variable_ptr_ptr) {
        !          1573:                if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, OP2_TYPE TSRMLS_CC)) {
        !          1574:                        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1575:                                EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          1576:                                ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          1577:                                INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
        !          1578:                                ZVAL_STRINGL(EX_T(opline->result.u.var).var.ptr, Z_STRVAL_P(EX_T(opline->op1.u.var).str_offset.str)+EX_T(opline->op1.u.var).str_offset.offset, 1, 1);
        !          1579:                        }
        !          1580:                } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1581:                        AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
        !          1582:                        PZVAL_LOCK(EG(uninitialized_zval_ptr));
        !          1583:                }
        !          1584:        } else {
        !          1585:                value = zend_assign_to_variable(variable_ptr_ptr, value, IS_OP2_TMP_FREE() TSRMLS_CC);
        !          1586:                if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1587:                        AI_SET_PTR(EX_T(opline->result.u.var).var, value);
        !          1588:                        PZVAL_LOCK(value);
        !          1589:                }
        !          1590:        }
        !          1591: 
        !          1592:        FREE_OP1_VAR_PTR();
        !          1593: 
        !          1594:        /* zend_assign_to_variable() always takes care of op2, never free it! */
        !          1595:        FREE_OP2_IF_VAR();
        !          1596: 
        !          1597:        ZEND_VM_NEXT_OPCODE();
        !          1598: }
        !          1599: 
        !          1600: ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
        !          1601: {
        !          1602:        zend_op *opline = EX(opline);
        !          1603:        zend_free_op free_op1, free_op2;
        !          1604:        zval **variable_ptr_ptr;
        !          1605:        zval **value_ptr_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W);
        !          1606: 
        !          1607:        if (OP2_TYPE == IS_VAR &&
        !          1608:            value_ptr_ptr &&
        !          1609:            !Z_ISREF_PP(value_ptr_ptr) &&
        !          1610:            opline->extended_value == ZEND_RETURNS_FUNCTION &&
        !          1611:            !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
        !          1612:                if (free_op2.var == NULL) {
        !          1613:                        PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
        !          1614:                }
        !          1615:                zend_error(E_STRICT, "Only variables should be assigned by reference");
        !          1616:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1617:                        FREE_OP2_VAR_PTR();
        !          1618:                        ZEND_VM_NEXT_OPCODE();
        !          1619:                }
        !          1620:                ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN);
        !          1621:        } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
        !          1622:                PZVAL_LOCK(*value_ptr_ptr);
        !          1623:        }
        !          1624:        if (OP1_TYPE == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
        !          1625:                zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
        !          1626:        }
        !          1627: 
        !          1628:        variable_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          1629:        if ((OP2_TYPE == IS_VAR && !value_ptr_ptr) ||
        !          1630:            (OP1_TYPE == IS_VAR && !variable_ptr_ptr)) {
        !          1631:                zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
        !          1632:        }
        !          1633:        zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
        !          1634: 
        !          1635:        if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
        !          1636:                Z_DELREF_PP(variable_ptr_ptr);
        !          1637:        }
        !          1638: 
        !          1639:        if (!RETURN_VALUE_UNUSED(&opline->result)) {
        !          1640:                AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
        !          1641:                PZVAL_LOCK(*variable_ptr_ptr);
        !          1642:        }
        !          1643: 
        !          1644:        FREE_OP1_VAR_PTR();
        !          1645:        FREE_OP2_VAR_PTR();
        !          1646: 
        !          1647:        ZEND_VM_NEXT_OPCODE();
        !          1648: }
        !          1649: 
        !          1650: ZEND_VM_HANDLER(42, ZEND_JMP, ANY, ANY)
        !          1651: {
        !          1652: #if DEBUG_ZEND>=2
        !          1653:        printf("Jumping to %d\n", EX(opline)->op1.u.opline_num);
        !          1654: #endif
        !          1655:        ZEND_VM_SET_OPCODE(EX(opline)->op1.u.jmp_addr);
        !          1656:        ZEND_VM_CONTINUE(); /* CHECK_ME */
        !          1657: }
        !          1658: 
        !          1659: ZEND_VM_HANDLER(43, ZEND_JMPZ, CONST|TMP|VAR|CV, ANY)
        !          1660: {
        !          1661:        zend_op *opline = EX(opline);
        !          1662:        zend_free_op free_op1;
        !          1663:        zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1664:        int ret;
        !          1665: 
        !          1666:        if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
        !          1667:                ret = Z_LVAL_P(val);
        !          1668:        } else {
        !          1669:                ret = i_zend_is_true(val);
        !          1670:                FREE_OP1();
        !          1671:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1672:                        ZEND_VM_CONTINUE();
        !          1673:                }
        !          1674:        }
        !          1675:        if (!ret) {
        !          1676: #if DEBUG_ZEND>=2
        !          1677:                printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
        !          1678: #endif
        !          1679:                ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
        !          1680:                ZEND_VM_CONTINUE();
        !          1681:        }
        !          1682: 
        !          1683:        ZEND_VM_NEXT_OPCODE();
        !          1684: }
        !          1685: 
        !          1686: ZEND_VM_HANDLER(44, ZEND_JMPNZ, CONST|TMP|VAR|CV, ANY)
        !          1687: {
        !          1688:        zend_op *opline = EX(opline);
        !          1689:        zend_free_op free_op1;
        !          1690:        zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1691:        int ret;
        !          1692: 
        !          1693:        if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
        !          1694:                ret = Z_LVAL_P(val);
        !          1695:        } else {
        !          1696:                ret = i_zend_is_true(val);
        !          1697:                FREE_OP1();
        !          1698:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1699:                        ZEND_VM_CONTINUE();
        !          1700:                }
        !          1701:        }
        !          1702:        if (ret) {
        !          1703: #if DEBUG_ZEND>=2
        !          1704:                printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
        !          1705: #endif
        !          1706:                ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
        !          1707:                ZEND_VM_CONTINUE();
        !          1708:        }
        !          1709: 
        !          1710:        ZEND_VM_NEXT_OPCODE();
        !          1711: }
        !          1712: 
        !          1713: ZEND_VM_HANDLER(45, ZEND_JMPZNZ, CONST|TMP|VAR|CV, ANY)
        !          1714: {
        !          1715:        zend_op *opline = EX(opline);
        !          1716:        zend_free_op free_op1;
        !          1717:        zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1718:        int retval;
        !          1719: 
        !          1720:        if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
        !          1721:                retval = Z_LVAL_P(val);
        !          1722:        } else {
        !          1723:                retval = i_zend_is_true(val);
        !          1724:                FREE_OP1();
        !          1725:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1726:                        ZEND_VM_CONTINUE();
        !          1727:                }
        !          1728:        }
        !          1729:        if (EXPECTED(retval != 0)) {
        !          1730: #if DEBUG_ZEND>=2
        !          1731:                printf("Conditional jmp on true to %d\n", opline->extended_value);
        !          1732: #endif
        !          1733:                ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
        !          1734:                ZEND_VM_CONTINUE(); /* CHECK_ME */
        !          1735:        } else {
        !          1736: #if DEBUG_ZEND>=2
        !          1737:                printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
        !          1738: #endif
        !          1739:                ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
        !          1740:                ZEND_VM_CONTINUE(); /* CHECK_ME */
        !          1741:        }
        !          1742: }
        !          1743: 
        !          1744: ZEND_VM_HANDLER(46, ZEND_JMPZ_EX, CONST|TMP|VAR|CV, ANY)
        !          1745: {
        !          1746:        zend_op *opline = EX(opline);
        !          1747:        zend_free_op free_op1;
        !          1748:        zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1749:        int retval;
        !          1750: 
        !          1751:        if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
        !          1752:                retval = Z_LVAL_P(val);
        !          1753:        } else {
        !          1754:                retval = i_zend_is_true(val);
        !          1755:                FREE_OP1();
        !          1756:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1757:                        ZEND_VM_CONTINUE();
        !          1758:                }
        !          1759:        }
        !          1760:        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
        !          1761:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
        !          1762:        if (!retval) {
        !          1763: #if DEBUG_ZEND>=2
        !          1764:                printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
        !          1765: #endif
        !          1766:                ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
        !          1767:                ZEND_VM_CONTINUE();
        !          1768:        }
        !          1769:        ZEND_VM_NEXT_OPCODE();
        !          1770: }
        !          1771: 
        !          1772: ZEND_VM_HANDLER(47, ZEND_JMPNZ_EX, CONST|TMP|VAR|CV, ANY)
        !          1773: {
        !          1774:        zend_op *opline = EX(opline);
        !          1775:        zend_free_op free_op1;
        !          1776:        zval *val = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          1777:        int retval;
        !          1778: 
        !          1779:        if (OP1_TYPE == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
        !          1780:                retval = Z_LVAL_P(val);
        !          1781:        } else {
        !          1782:                retval = i_zend_is_true(val);
        !          1783:                FREE_OP1();
        !          1784:                if (UNEXPECTED(EG(exception) != NULL)) {
        !          1785:                        ZEND_VM_CONTINUE();
        !          1786:                }
        !          1787:        }
        !          1788:        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
        !          1789:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
        !          1790:        if (retval) {
        !          1791: #if DEBUG_ZEND>=2
        !          1792:                printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
        !          1793: #endif
        !          1794:                ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
        !          1795:                ZEND_VM_CONTINUE();
        !          1796:        }
        !          1797:        ZEND_VM_NEXT_OPCODE();
        !          1798: }
        !          1799: 
        !          1800: ZEND_VM_HANDLER(70, ZEND_FREE, TMP, ANY)
        !          1801: {
        !          1802:        zendi_zval_dtor(EX_T(EX(opline)->op1.u.var).tmp_var);
        !          1803:        ZEND_VM_NEXT_OPCODE();
        !          1804: }
        !          1805: 
        !          1806: ZEND_VM_HANDLER(53, ZEND_INIT_STRING, ANY, ANY)
        !          1807: {
        !          1808:        zval *tmp = &EX_T(EX(opline)->result.u.var).tmp_var;
        !          1809: 
        !          1810:        tmp->value.str.val = emalloc(1);
        !          1811:        tmp->value.str.val[0] = 0;
        !          1812:        tmp->value.str.len = 0;
        !          1813:        Z_SET_REFCOUNT_P(tmp, 1);
        !          1814:        tmp->type = IS_STRING;
        !          1815:        Z_UNSET_ISREF_P(tmp);
        !          1816:        ZEND_VM_NEXT_OPCODE();
        !          1817: }
        !          1818: 
        !          1819: ZEND_VM_HANDLER(54, ZEND_ADD_CHAR, TMP|UNUSED, CONST)
        !          1820: {
        !          1821:        zend_op *opline = EX(opline);
        !          1822:        zval *str = &EX_T(opline->result.u.var).tmp_var;
        !          1823: 
        !          1824:        if (OP1_TYPE == IS_UNUSED) {
        !          1825:                /* Initialize for erealloc in add_char_to_string */
        !          1826:                Z_STRVAL_P(str) = NULL;
        !          1827:                Z_STRLEN_P(str) = 0;
        !          1828:                Z_TYPE_P(str) = IS_STRING;
        !          1829: 
        !          1830:                INIT_PZVAL(str);
        !          1831:        }
        !          1832: 
        !          1833:        add_char_to_string(str, str, &opline->op2.u.constant);
        !          1834: 
        !          1835:        /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
        !          1836:        ZEND_VM_NEXT_OPCODE();
        !          1837: }
        !          1838: 
        !          1839: ZEND_VM_HANDLER(55, ZEND_ADD_STRING, TMP|UNUSED, CONST)
        !          1840: {
        !          1841:        zend_op *opline = EX(opline);
        !          1842:        zval *str = &EX_T(opline->result.u.var).tmp_var;
        !          1843: 
        !          1844:        if (OP1_TYPE == IS_UNUSED) {
        !          1845:                /* Initialize for erealloc in add_string_to_string */
        !          1846:                Z_STRVAL_P(str) = NULL;
        !          1847:                Z_STRLEN_P(str) = 0;
        !          1848:                Z_TYPE_P(str) = IS_STRING;
        !          1849: 
        !          1850:                INIT_PZVAL(str);
        !          1851:        }
        !          1852: 
        !          1853:        add_string_to_string(str, str, &opline->op2.u.constant);
        !          1854: 
        !          1855:        /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
        !          1856:        ZEND_VM_NEXT_OPCODE();
        !          1857: }
        !          1858: 
        !          1859: ZEND_VM_HANDLER(56, ZEND_ADD_VAR, TMP|UNUSED, TMP|VAR|CV)
        !          1860: {
        !          1861:        zend_op *opline = EX(opline);
        !          1862:        zend_free_op free_op2;
        !          1863:        zval *str = &EX_T(opline->result.u.var).tmp_var;
        !          1864:        zval *var = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1865:        zval var_copy;
        !          1866:        int use_copy = 0;
        !          1867: 
        !          1868:        if (OP1_TYPE == IS_UNUSED) {
        !          1869:                /* Initialize for erealloc in add_string_to_string */
        !          1870:                Z_STRVAL_P(str) = NULL;
        !          1871:                Z_STRLEN_P(str) = 0;
        !          1872:                Z_TYPE_P(str) = IS_STRING;
        !          1873: 
        !          1874:                INIT_PZVAL(str);
        !          1875:        }
        !          1876: 
        !          1877:        if (Z_TYPE_P(var) != IS_STRING) {
        !          1878:                zend_make_printable_zval(var, &var_copy, &use_copy);
        !          1879: 
        !          1880:                if (use_copy) {
        !          1881:                        var = &var_copy;
        !          1882:                }
        !          1883:        }
        !          1884:        add_string_to_string(str, str, var);
        !          1885: 
        !          1886:        if (use_copy) {
        !          1887:                zval_dtor(var);
        !          1888:        }
        !          1889:        /* original comment, possibly problematic:
        !          1890:         * FREE_OP is missing intentionally here - we're always working on the same temporary variable
        !          1891:         * (Zeev):  I don't think it's problematic, we only use variables
        !          1892:         * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
        !          1893:         * string offsets or overloaded objects
        !          1894:         */
        !          1895:        FREE_OP2();
        !          1896: 
        !          1897:        ZEND_VM_NEXT_OPCODE();
        !          1898: }
        !          1899: 
        !          1900: ZEND_VM_HANDLER(109, ZEND_FETCH_CLASS, ANY, CONST|TMP|VAR|UNUSED|CV)
        !          1901: {
        !          1902:        zend_op *opline = EX(opline);
        !          1903: 
        !          1904: 
        !          1905:        if (OP2_TYPE == IS_UNUSED) {
        !          1906:                EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
        !          1907:                ZEND_VM_NEXT_OPCODE();
        !          1908:        } else {
        !          1909:                zend_free_op free_op2;
        !          1910:                zval *class_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1911: 
        !          1912:                if (OP2_TYPE != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
        !          1913:                        EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
        !          1914:                } else if (Z_TYPE_P(class_name) == IS_STRING) {
        !          1915:                        EX_T(opline->result.u.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
        !          1916:                } else {
        !          1917:                        zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
        !          1918:                }
        !          1919: 
        !          1920:                FREE_OP2();
        !          1921:                ZEND_VM_NEXT_OPCODE();
        !          1922:        }
        !          1923: }
        !          1924: 
        !          1925: ZEND_VM_HANDLER(112, ZEND_INIT_METHOD_CALL, TMP|VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          1926: {
        !          1927:        zend_op *opline = EX(opline);
        !          1928:        zval *function_name;
        !          1929:        char *function_name_strval;
        !          1930:        int function_name_strlen;
        !          1931:        zend_free_op free_op1, free_op2;
        !          1932: 
        !          1933:        zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
        !          1934: 
        !          1935:        function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          1936: 
        !          1937:        if (Z_TYPE_P(function_name)!=IS_STRING) {
        !          1938:                zend_error_noreturn(E_ERROR, "Method name must be a string");
        !          1939:        }
        !          1940: 
        !          1941:        function_name_strval = Z_STRVAL_P(function_name);
        !          1942:        function_name_strlen = Z_STRLEN_P(function_name);
        !          1943: 
        !          1944:        EX(object) = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
        !          1945: 
        !          1946:        if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
        !          1947:                if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
        !          1948:                        zend_error_noreturn(E_ERROR, "Object does not support method calls");
        !          1949:                }
        !          1950: 
        !          1951:                /* First, locate the function. */
        !          1952:                EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
        !          1953:                if (!EX(fbc)) {
        !          1954:                        zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
        !          1955:                }
        !          1956:                
        !          1957:                EX(called_scope) = Z_OBJCE_P(EX(object));
        !          1958:        } else {
        !          1959:                zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
        !          1960:        }
        !          1961:        
        !          1962:        if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
        !          1963:                EX(object) = NULL;
        !          1964:        } else {                
        !          1965:                if (!PZVAL_IS_REF(EX(object))) {
        !          1966:                        Z_ADDREF_P(EX(object)); /* For $this pointer */
        !          1967:                } else {
        !          1968:                        zval *this_ptr;
        !          1969:                        ALLOC_ZVAL(this_ptr);
        !          1970:                        INIT_PZVAL_COPY(this_ptr, EX(object));
        !          1971:                        zval_copy_ctor(this_ptr);
        !          1972:                        EX(object) = this_ptr;
        !          1973:                }
        !          1974:        }
        !          1975: 
        !          1976:        FREE_OP2();
        !          1977:        FREE_OP1_IF_VAR();
        !          1978: 
        !          1979:        ZEND_VM_NEXT_OPCODE();
        !          1980: }
        !          1981: 
        !          1982: ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUSED|CV)
        !          1983: {
        !          1984:        zend_op *opline = EX(opline);
        !          1985:        zval *function_name;
        !          1986:        zend_class_entry *ce;
        !          1987: 
        !          1988:        zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
        !          1989: 
        !          1990:        if (OP1_TYPE == IS_CONST) {
        !          1991:                /* no function found. try a static method in class */
        !          1992:                ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
        !          1993:                if (!ce) {
        !          1994:                        zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
        !          1995:                }
        !          1996:                EX(called_scope) = ce;
        !          1997:        } else {
        !          1998:                ce = EX_T(opline->op1.u.var).class_entry;
        !          1999:                
        !          2000:                if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
        !          2001:                        EX(called_scope) = EG(called_scope);
        !          2002:                } else {
        !          2003:                        EX(called_scope) = ce;
        !          2004:                }
        !          2005:        }
        !          2006:        if(OP2_TYPE != IS_UNUSED) {
        !          2007:                char *function_name_strval = NULL;
        !          2008:                int function_name_strlen = 0;
        !          2009:                zend_free_op free_op2;
        !          2010: 
        !          2011:                if (OP2_TYPE == IS_CONST) {
        !          2012:                        function_name_strval = Z_STRVAL(opline->op2.u.constant);
        !          2013:                        function_name_strlen = Z_STRLEN(opline->op2.u.constant);
        !          2014:                } else {
        !          2015:                        function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          2016: 
        !          2017:                        if (Z_TYPE_P(function_name) != IS_STRING) {
        !          2018:                                zend_error_noreturn(E_ERROR, "Function name must be a string");
        !          2019:                        } else {
        !          2020:                                function_name_strval = Z_STRVAL_P(function_name);
        !          2021:                                function_name_strlen = Z_STRLEN_P(function_name);
        !          2022:                        }
        !          2023:                }
        !          2024: 
        !          2025:                if (function_name_strval) {
        !          2026:                        if (ce->get_static_method) {
        !          2027:                                EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
        !          2028:                        } else {
        !          2029:                                EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
        !          2030:                        }
        !          2031:                        if (!EX(fbc)) {
        !          2032:                                zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
        !          2033:                        }
        !          2034:                }
        !          2035: 
        !          2036:                if (OP2_TYPE != IS_CONST) {
        !          2037:                        FREE_OP2();
        !          2038:                }
        !          2039:        } else {
        !          2040:                if(!ce->constructor) {
        !          2041:                        zend_error_noreturn(E_ERROR, "Cannot call constructor");
        !          2042:                }
        !          2043:                if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
        !          2044:                        zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
        !          2045:                }
        !          2046:                EX(fbc) = ce->constructor;
        !          2047:        }
        !          2048: 
        !          2049:        if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
        !          2050:                EX(object) = NULL;
        !          2051:        } else {
        !          2052:                if (EG(This) &&
        !          2053:                    Z_OBJ_HT_P(EG(This))->get_class_entry &&
        !          2054:                    !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
        !          2055:                    /* We are calling method of the other (incompatible) class,
        !          2056:                       but passing $this. This is done for compatibility with php-4. */
        !          2057:                        int severity;
        !          2058:                        char *verb;
        !          2059:                        if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
        !          2060:                                severity = E_STRICT;
        !          2061:                                verb = "should not";
        !          2062:                        } else {
        !          2063:                                /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
        !          2064:                                severity = E_ERROR;
        !          2065:                                verb = "cannot";
        !          2066:                        }
        !          2067:                        zend_error(severity, "Non-static method %s::%s() %s be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name, verb);
        !          2068: 
        !          2069:                }
        !          2070:                if ((EX(object) = EG(This))) {
        !          2071:                        Z_ADDREF_P(EX(object));
        !          2072:                        EX(called_scope) = Z_OBJCE_P(EX(object));
        !          2073:                }
        !          2074:        }
        !          2075: 
        !          2076:        ZEND_VM_NEXT_OPCODE();
        !          2077: }
        !          2078: 
        !          2079: ZEND_VM_HANDLER(59, ZEND_INIT_FCALL_BY_NAME, ANY, CONST|TMP|VAR|CV)
        !          2080: {
        !          2081:        zend_op *opline = EX(opline);
        !          2082:        zval *function_name;
        !          2083:        char *function_name_strval, *lcname;
        !          2084:        int function_name_strlen;
        !          2085:        zend_free_op free_op2;
        !          2086: 
        !          2087:        zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
        !          2088: 
        !          2089:        if (OP2_TYPE == IS_CONST) {
        !          2090:                if (zend_hash_quick_find(EG(function_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc)) == FAILURE) {
        !          2091:                        zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
        !          2092:                }
        !          2093:        } else {
        !          2094:                function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          2095: 
        !          2096:                if (OP2_TYPE != IS_CONST && OP2_TYPE != IS_TMP_VAR &&
        !          2097:                    Z_TYPE_P(function_name) == IS_OBJECT &&
        !          2098:                        Z_OBJ_HANDLER_P(function_name, get_closure) &&
        !          2099:                        Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
        !          2100:                        if (EX(object)) {
        !          2101:                                Z_ADDREF_P(EX(object));
        !          2102:                        }
        !          2103:                        if (OP2_TYPE == IS_VAR && OP2_FREE &&
        !          2104:                            EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
        !          2105:                                /* Delay closure destruction until its invocation */
        !          2106:                                EX(fbc)->common.prototype = (zend_function*)function_name;
        !          2107:                        } else {
        !          2108:                                FREE_OP2();
        !          2109:                        }
        !          2110:                        ZEND_VM_NEXT_OPCODE();
        !          2111:                }
        !          2112: 
        !          2113:                if (Z_TYPE_P(function_name) != IS_STRING) {
        !          2114:                        zend_error_noreturn(E_ERROR, "Function name must be a string");
        !          2115:                }
        !          2116:                function_name_strval = Z_STRVAL_P(function_name);
        !          2117:                function_name_strlen = Z_STRLEN_P(function_name);
        !          2118:                if (function_name_strval[0] == '\\') {
        !          2119: 
        !          2120:                    function_name_strlen -= 1;
        !          2121:                        lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
        !          2122:                } else {
        !          2123:                        lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
        !          2124:                }
        !          2125:                if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE) {
        !          2126:                        zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
        !          2127:                }
        !          2128:                efree(lcname);
        !          2129:                FREE_OP2();
        !          2130:        }
        !          2131: 
        !          2132:        EX(object) = NULL;
        !          2133:        ZEND_VM_NEXT_OPCODE();
        !          2134: }
        !          2135: 
        !          2136: 
        !          2137: ZEND_VM_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST)
        !          2138: {
        !          2139:        zend_op *opline = EX(opline);
        !          2140:        zend_op *op_data = opline + 1;
        !          2141: 
        !          2142:        ZEND_VM_INC_OPCODE();
        !          2143:        zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
        !          2144: 
        !          2145:        if (zend_hash_quick_find(EG(function_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant)+1, opline->extended_value, (void **) &EX(fbc))==FAILURE) {
        !          2146:                char *short_name = Z_STRVAL(opline->op1.u.constant)+Z_LVAL(op_data->op1.u.constant);
        !          2147:                if (zend_hash_quick_find(EG(function_table), short_name, Z_STRLEN(opline->op1.u.constant)-Z_LVAL(op_data->op1.u.constant)+1, op_data->extended_value, (void **) &EX(fbc))==FAILURE) {
        !          2148:                        zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
        !          2149:                }
        !          2150:        }
        !          2151: 
        !          2152:        EX(object) = NULL;
        !          2153:        ZEND_VM_NEXT_OPCODE();
        !          2154: }
        !          2155: 
        !          2156: ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
        !          2157: {
        !          2158:        zend_bool nested;
        !          2159:        zend_op_array *op_array = EX(op_array);
        !          2160: 
        !          2161:        EG(current_execute_data) = EX(prev_execute_data);
        !          2162:        EG(opline_ptr) = NULL;
        !          2163:        if (!EG(active_symbol_table)) {
        !          2164:                zval ***cv = EX(CVs);
        !          2165:                zval ***end = cv + EX(op_array)->last_var;
        !          2166:                while (cv != end) {
        !          2167:                        if (*cv) {
        !          2168:                                zval_ptr_dtor(*cv);
        !          2169:                        }
        !          2170:                        cv++;
        !          2171:                }
        !          2172:        }
        !          2173:        
        !          2174:        if ((op_array->fn_flags & ZEND_ACC_CLOSURE) && op_array->prototype) {
        !          2175:                zval_ptr_dtor((zval**)&op_array->prototype);
        !          2176:        }
        !          2177: 
        !          2178:        nested = EX(nested);
        !          2179:        
        !          2180:        zend_vm_stack_free(execute_data TSRMLS_CC);
        !          2181: 
        !          2182:        if (nested) {
        !          2183:                execute_data = EG(current_execute_data);
        !          2184: 
        !          2185:                if (EX(call_opline)->opcode == ZEND_INCLUDE_OR_EVAL) {
        !          2186: 
        !          2187:                        EX(function_state).function = (zend_function *) EX(op_array);
        !          2188:                        EX(function_state).arguments = NULL;
        !          2189:                        EX(object) = EX(current_object);
        !          2190: 
        !          2191:                        if (RETURN_VALUE_USED(EX(call_opline))) {
        !          2192:                                if (!EX_T(EX(call_opline)->result.u.var).var.ptr) { /* there was no return statement */
        !          2193:                                        ALLOC_ZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
        !          2194:                                        INIT_PZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
        !          2195:                                        Z_LVAL_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = 1;
        !          2196:                                        Z_TYPE_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = IS_BOOL;
        !          2197:                                }
        !          2198:                        }
        !          2199: 
        !          2200:                        EG(opline_ptr) = &EX(opline);
        !          2201:                        EG(active_op_array) = EX(op_array);
        !          2202:                        EG(return_value_ptr_ptr) = EX(original_return_value);
        !          2203:                        destroy_op_array(op_array TSRMLS_CC);
        !          2204:                        efree(op_array);
        !          2205:                        if (EG(exception)) {
        !          2206:                                zend_throw_exception_internal(NULL TSRMLS_CC);
        !          2207:                        }
        !          2208: 
        !          2209:                        EX(opline)++;
        !          2210:                        ZEND_VM_LEAVE();
        !          2211:                } else {
        !          2212: 
        !          2213:                        EG(opline_ptr) = &EX(opline);
        !          2214:                        EG(active_op_array) = EX(op_array);
        !          2215:                        EG(return_value_ptr_ptr) = EX(original_return_value);
        !          2216:                        if (EG(active_symbol_table)) {
        !          2217:                                if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
        !          2218:                                        zend_hash_destroy(EG(active_symbol_table));
        !          2219:                                        FREE_HASHTABLE(EG(active_symbol_table));
        !          2220:                                } else {
        !          2221:                                        /* clean before putting into the cache, since clean
        !          2222:                                           could call dtors, which could use cached hash */
        !          2223:                                        zend_hash_clean(EG(active_symbol_table));
        !          2224:                                        *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
        !          2225:                                }
        !          2226:                        }
        !          2227:                        EG(active_symbol_table) = EX(symbol_table);
        !          2228: 
        !          2229:                        EX(function_state).function = (zend_function *) EX(op_array);
        !          2230:                        EX(function_state).arguments = NULL;
        !          2231: 
        !          2232:                        if (EG(This)) {
        !          2233:                                if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
        !          2234:                                        if (IS_CTOR_USED(EX(called_scope))) {
        !          2235:                                                Z_DELREF_P(EG(This));
        !          2236:                                        }
        !          2237:                                        if (Z_REFCOUNT_P(EG(This)) == 1) {
        !          2238:                                                zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
        !          2239:                                        }
        !          2240:                                }
        !          2241:                                zval_ptr_dtor(&EG(This));
        !          2242:                        }
        !          2243:                        EG(This) = EX(current_this);
        !          2244:                        EG(scope) = EX(current_scope);
        !          2245:                        EG(called_scope) = EX(current_called_scope);
        !          2246: 
        !          2247:                        EX(object) = EX(current_object);
        !          2248:                        EX(called_scope) = DECODE_CTOR(EX(called_scope));
        !          2249: 
        !          2250:                        zend_vm_stack_clear_multiple(TSRMLS_C);
        !          2251: 
        !          2252:                        if (EG(exception)) {
        !          2253:                                zend_throw_exception_internal(NULL TSRMLS_CC);
        !          2254:                                if (RETURN_VALUE_USED(EX(call_opline)) && EX_T(EX(call_opline)->result.u.var).var.ptr) {
        !          2255:                                        zval_ptr_dtor(&EX_T(EX(call_opline)->result.u.var).var.ptr);
        !          2256:                                }
        !          2257:                        }
        !          2258: 
        !          2259:                        EX(opline)++;
        !          2260:                        ZEND_VM_LEAVE();
        !          2261:                }
        !          2262:        }
        !          2263:        ZEND_VM_RETURN();
        !          2264: }
        !          2265: 
        !          2266: ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
        !          2267: {
        !          2268:        zend_op *opline = EX(opline);
        !          2269:        zend_bool should_change_scope = 0;
        !          2270: 
        !          2271:        if (EX(function_state).function->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
        !          2272:                if (EX(function_state).function->common.fn_flags & ZEND_ACC_ABSTRACT) {
        !          2273:                        zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
        !          2274:                        ZEND_VM_NEXT_OPCODE(); /* Never reached */
        !          2275:                }
        !          2276:                if (EX(function_state).function->common.fn_flags & ZEND_ACC_DEPRECATED) {
        !          2277:                        zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
        !          2278:                                EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name : "",
        !          2279:                                EX(function_state).function->common.scope ? "::" : "",
        !          2280:                                EX(function_state).function->common.function_name);
        !          2281:                }
        !          2282:        }
        !          2283:        if (EX(function_state).function->common.scope &&
        !          2284:                !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC) &&
        !          2285:                !EX(object)) {
        !          2286: 
        !          2287:                if (EX(function_state).function->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
        !          2288:                        /* FIXME: output identifiers properly */
        !          2289:                        zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
        !          2290:                } else {
        !          2291:                        /* FIXME: output identifiers properly */
        !          2292:                        /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
        !          2293:                        zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically", EX(function_state).function->common.scope->name, EX(function_state).function->common.function_name);
        !          2294:                }
        !          2295:        }
        !          2296: 
        !          2297:        if (EX(function_state).function->type == ZEND_USER_FUNCTION ||
        !          2298:            EX(function_state).function->common.scope) {
        !          2299:                should_change_scope = 1;
        !          2300:                EX(current_this) = EG(This);
        !          2301:                EX(current_scope) = EG(scope);
        !          2302:                EX(current_called_scope) = EG(called_scope);
        !          2303:                EG(This) = EX(object);
        !          2304:                EG(scope) = (EX(function_state).function->type == ZEND_USER_FUNCTION || !EX(object)) ? EX(function_state).function->common.scope : NULL;
        !          2305:                EG(called_scope) = EX(called_scope);
        !          2306:        }
        !          2307: 
        !          2308:        zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
        !          2309:        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
        !          2310: 
        !          2311:        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
        !          2312:                ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          2313:                EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          2314:                EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
        !          2315: 
        !          2316:                if (EX(function_state).function->common.arg_info) {
        !          2317:                        zend_uint i=0;
        !          2318:                        zval **p = (zval**)EX(function_state).arguments;
        !          2319:                        ulong arg_count = opline->extended_value;
        !          2320: 
        !          2321:                        while (arg_count>0) {
        !          2322:                                zend_verify_arg_type(EX(function_state).function, ++i, *(p-arg_count), 0 TSRMLS_CC);
        !          2323:                                arg_count--;
        !          2324:                        }
        !          2325:                }
        !          2326:                if (!zend_execute_internal) {
        !          2327:                        /* saves one function call if zend_execute_internal is not used */
        !          2328:                        ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
        !          2329:                } else {
        !          2330:                        zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
        !          2331:                }
        !          2332: 
        !          2333:                if (!RETURN_VALUE_USED(opline)) {
        !          2334:                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
        !          2335:                }
        !          2336:        } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
        !          2337:                EX(original_return_value) = EG(return_value_ptr_ptr);
        !          2338:                EG(active_symbol_table) = NULL;
        !          2339:                EG(active_op_array) = &EX(function_state).function->op_array;
        !          2340:                EG(return_value_ptr_ptr) = NULL;
        !          2341:                if (RETURN_VALUE_USED(opline)) {                        
        !          2342:                        EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
        !          2343:                        EX_T(opline->result.u.var).var.ptr = NULL;
        !          2344:                        EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          2345:                        EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
        !          2346:                }
        !          2347: 
        !          2348:                if (zend_execute == execute && !EG(exception)) {
        !          2349:                        EX(call_opline) = opline;
        !          2350:                        ZEND_VM_ENTER();
        !          2351:                } else {
        !          2352:                        zend_execute(EG(active_op_array) TSRMLS_CC);
        !          2353:                }
        !          2354: 
        !          2355:                EG(opline_ptr) = &EX(opline);
        !          2356:                EG(active_op_array) = EX(op_array);
        !          2357:                EG(return_value_ptr_ptr) = EX(original_return_value);
        !          2358:                if (EG(active_symbol_table)) {
        !          2359:                        if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
        !          2360:                                zend_hash_destroy(EG(active_symbol_table));
        !          2361:                                FREE_HASHTABLE(EG(active_symbol_table));
        !          2362:                        } else {
        !          2363:                                /* clean before putting into the cache, since clean
        !          2364:                                   could call dtors, which could use cached hash */
        !          2365:                                zend_hash_clean(EG(active_symbol_table));
        !          2366:                                *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
        !          2367:                        }
        !          2368:                }
        !          2369:                EG(active_symbol_table) = EX(symbol_table);
        !          2370:        } else { /* ZEND_OVERLOADED_FUNCTION */
        !          2371:                ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          2372: 
        !          2373:                        /* Not sure what should be done here if it's a static method */
        !          2374:                if (EX(object)) {
        !          2375:                        Z_OBJ_HT_P(EX(object))->call_method(EX(function_state).function->common.function_name, opline->extended_value, EX_T(opline->result.u.var).var.ptr, &EX_T(opline->result.u.var).var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
        !          2376:                } else {
        !          2377:                        zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
        !          2378:                }
        !          2379: 
        !          2380:                if (EX(function_state).function->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
        !          2381:                        efree(EX(function_state).function->common.function_name);
        !          2382:                }
        !          2383:                efree(EX(function_state).function);
        !          2384: 
        !          2385:                if (!RETURN_VALUE_USED(opline)) {
        !          2386:                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
        !          2387:                } else {
        !          2388:                        Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
        !          2389:                        Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
        !          2390:                        EX_T(opline->result.u.var).var.fcall_returned_reference = 0;
        !          2391:                        EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          2392:                }
        !          2393:        }
        !          2394: 
        !          2395:        EX(function_state).function = (zend_function *) EX(op_array);
        !          2396:        EX(function_state).arguments = NULL;
        !          2397: 
        !          2398:        if (should_change_scope) {
        !          2399:                if (EG(This)) {
        !          2400:                        if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
        !          2401:                                if (IS_CTOR_USED(EX(called_scope))) {
        !          2402:                                        Z_DELREF_P(EG(This));
        !          2403:                                }
        !          2404:                                if (Z_REFCOUNT_P(EG(This)) == 1) {
        !          2405:                                        zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
        !          2406:                                }
        !          2407:                        }
        !          2408:                        zval_ptr_dtor(&EG(This));
        !          2409:                }
        !          2410:                EG(This) = EX(current_this);
        !          2411:                EG(scope) = EX(current_scope);
        !          2412:                EG(called_scope) = EX(current_called_scope);
        !          2413:        }
        !          2414: 
        !          2415:        EX(object) = EX(current_object);
        !          2416:        EX(called_scope) = DECODE_CTOR(EX(called_scope));
        !          2417: 
        !          2418:        zend_vm_stack_clear_multiple(TSRMLS_C);
        !          2419: 
        !          2420:        if (EG(exception)) {
        !          2421:                zend_throw_exception_internal(NULL TSRMLS_CC);
        !          2422:                if (RETURN_VALUE_USED(opline) && EX_T(opline->result.u.var).var.ptr) {
        !          2423:                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
        !          2424:                }
        !          2425:        }
        !          2426: 
        !          2427:        ZEND_VM_NEXT_OPCODE();
        !          2428: }
        !          2429: 
        !          2430: ZEND_VM_HANDLER(61, ZEND_DO_FCALL_BY_NAME, ANY, ANY)
        !          2431: {
        !          2432:        EX(function_state).function = EX(fbc);
        !          2433:        ZEND_VM_DISPATCH_TO_HELPER(zend_do_fcall_common_helper);
        !          2434: }
        !          2435: 
        !          2436: ZEND_VM_HANDLER(60, ZEND_DO_FCALL, CONST, ANY)
        !          2437: {
        !          2438:        zend_op *opline = EX(opline);
        !          2439:        zend_free_op free_op1;
        !          2440:        zval *fname = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2441: 
        !          2442:        zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
        !          2443: 
        !          2444:        if (zend_hash_quick_find(EG(function_table), fname->value.str.val, fname->value.str.len+1, Z_LVAL(opline->op2.u.constant), (void **) &EX(function_state).function)==FAILURE) {
        !          2445:                zend_error_noreturn(E_ERROR, "Call to undefined function %s()", fname->value.str.val);
        !          2446:        }
        !          2447:        EX(object) = NULL;
        !          2448: 
        !          2449:        FREE_OP1();
        !          2450: 
        !          2451:        ZEND_VM_DISPATCH_TO_HELPER(zend_do_fcall_common_helper);
        !          2452: }
        !          2453: 
        !          2454: ZEND_VM_HANDLER(62, ZEND_RETURN, CONST|TMP|VAR|CV, ANY)
        !          2455: {
        !          2456:        zend_op *opline = EX(opline);
        !          2457:        zval *retval_ptr;
        !          2458:        zval **retval_ptr_ptr;
        !          2459:        zend_free_op free_op1;
        !          2460: 
        !          2461:        if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
        !          2462: 
        !          2463:                if (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) {
        !          2464:                        /* Not supposed to happen, but we'll allow it */
        !          2465:                        zend_error(E_NOTICE, "Only variable references should be returned by reference");
        !          2466:                        ZEND_VM_C_GOTO(return_by_value);
        !          2467:                }
        !          2468: 
        !          2469:                retval_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          2470: 
        !          2471:                if (OP1_TYPE == IS_VAR && !retval_ptr_ptr) {
        !          2472:                        zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
        !          2473:                }
        !          2474: 
        !          2475:                if (OP1_TYPE == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
        !          2476:                        if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
        !          2477:                            EX_T(opline->op1.u.var).var.fcall_returned_reference) {
        !          2478:                        } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
        !          2479:                                if (OP1_TYPE == IS_VAR && !OP1_FREE) {
        !          2480:                                        PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
        !          2481:                                }
        !          2482:                                zend_error(E_NOTICE, "Only variable references should be returned by reference");
        !          2483:                                ZEND_VM_C_GOTO(return_by_value);
        !          2484:                        }
        !          2485:                }
        !          2486: 
        !          2487:                if (EG(return_value_ptr_ptr)) {
        !          2488:                        SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
        !          2489:                        Z_ADDREF_PP(retval_ptr_ptr);
        !          2490: 
        !          2491:                        (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
        !          2492:                }
        !          2493:        } else {
        !          2494: ZEND_VM_C_LABEL(return_by_value):
        !          2495: 
        !          2496:                retval_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2497: 
        !          2498:                if (!EG(return_value_ptr_ptr)) {
        !          2499:                        if (OP1_TYPE == IS_TMP_VAR) {
        !          2500:                                FREE_OP1();
        !          2501:                        }
        !          2502:                } else if (!IS_OP1_TMP_FREE()) { /* Not a temp var */
        !          2503:                        if (OP1_TYPE == IS_CONST ||
        !          2504:                            EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
        !          2505:                            (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
        !          2506:                                zval *ret;
        !          2507: 
        !          2508:                                ALLOC_ZVAL(ret);
        !          2509:                                INIT_PZVAL_COPY(ret, retval_ptr);
        !          2510:                                zval_copy_ctor(ret);
        !          2511:                                *EG(return_value_ptr_ptr) = ret;
        !          2512:                        } else if ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
        !          2513:                                   retval_ptr == &EG(uninitialized_zval)) {
        !          2514:                                zval *ret;
        !          2515: 
        !          2516:                                ALLOC_INIT_ZVAL(ret);
        !          2517:                                *EG(return_value_ptr_ptr) = ret;
        !          2518:                        } else {
        !          2519:                                *EG(return_value_ptr_ptr) = retval_ptr;
        !          2520:                                Z_ADDREF_P(retval_ptr);
        !          2521:                        }
        !          2522:                } else {
        !          2523:                        zval *ret;
        !          2524: 
        !          2525:                        ALLOC_ZVAL(ret);
        !          2526:                        INIT_PZVAL_COPY(ret, retval_ptr);
        !          2527:                        *EG(return_value_ptr_ptr) = ret;
        !          2528:                }
        !          2529:        }
        !          2530:        FREE_OP1_IF_VAR();
        !          2531:        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
        !          2532: }
        !          2533: 
        !          2534: ZEND_VM_HANDLER(108, ZEND_THROW, CONST|TMP|VAR|CV, ANY)
        !          2535: {
        !          2536:        zend_op *opline = EX(opline);
        !          2537:        zval *value;
        !          2538:        zval *exception;
        !          2539:        zend_free_op free_op1;
        !          2540: 
        !          2541:        value = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2542: 
        !          2543:        if (OP1_TYPE == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
        !          2544:                zend_error_noreturn(E_ERROR, "Can only throw objects");
        !          2545:        }
        !          2546:        zend_exception_save(TSRMLS_C);
        !          2547:        /* Not sure if a complete copy is what we want here */
        !          2548:        ALLOC_ZVAL(exception);
        !          2549:        INIT_PZVAL_COPY(exception, value);
        !          2550:        if (!IS_OP1_TMP_FREE()) {
        !          2551:                zval_copy_ctor(exception);
        !          2552:        }
        !          2553: 
        !          2554:        zend_throw_exception_object(exception TSRMLS_CC);
        !          2555:        zend_exception_restore(TSRMLS_C);
        !          2556:        FREE_OP1_IF_VAR();
        !          2557:        ZEND_VM_NEXT_OPCODE();
        !          2558: }
        !          2559: 
        !          2560: ZEND_VM_HANDLER(107, ZEND_CATCH, ANY, CV)
        !          2561: {
        !          2562:        zend_op *opline = EX(opline);
        !          2563:        zend_class_entry *ce;
        !          2564: 
        !          2565:        /* Check whether an exception has been thrown, if not, jump over code */
        !          2566:        zend_exception_restore(TSRMLS_C);
        !          2567:        if (EG(exception) == NULL) {
        !          2568:                ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
        !          2569:                ZEND_VM_CONTINUE(); /* CHECK_ME */
        !          2570:        }
        !          2571:        ce = Z_OBJCE_P(EG(exception));
        !          2572:        if (ce != EX_T(opline->op1.u.var).class_entry) {
        !          2573:                if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) {
        !          2574:                        if (opline->op1.u.EA.type) {
        !          2575:                                zend_throw_exception_internal(NULL TSRMLS_CC);
        !          2576:                                ZEND_VM_NEXT_OPCODE();
        !          2577:                        }
        !          2578:                        ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
        !          2579:                        ZEND_VM_CONTINUE(); /* CHECK_ME */
        !          2580:                }
        !          2581:        }
        !          2582: 
        !          2583:        if (!EG(active_symbol_table)) {
        !          2584:                if (EX(CVs)[opline->op2.u.var]) {
        !          2585:                        zval_ptr_dtor(EX(CVs)[opline->op2.u.var]);
        !          2586:                }
        !          2587:                EX(CVs)[opline->op2.u.var] = (zval**)EX(CVs) + (EX(op_array)->last_var + opline->op2.u.var);
        !          2588:                *EX(CVs)[opline->op2.u.var] = EG(exception);
        !          2589:        } else {
        !          2590:                zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.u.var);
        !          2591:                zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value,
        !          2592:                    &EG(exception), sizeof(zval *), (void**)&EX(CVs)[opline->op2.u.var]);
        !          2593:        }
        !          2594:        EG(exception) = NULL;
        !          2595:        ZEND_VM_NEXT_OPCODE();
        !          2596: }
        !          2597: 
        !          2598: ZEND_VM_HANDLER(65, ZEND_SEND_VAL, CONST|TMP|VAR|CV, ANY)
        !          2599: {
        !          2600:        zend_op *opline = EX(opline);
        !          2601:        if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
        !          2602:                && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
        !          2603:                        zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
        !          2604:        }
        !          2605:        {
        !          2606:                zval *valptr;
        !          2607:                zval *value;
        !          2608:                zend_free_op free_op1;
        !          2609: 
        !          2610:                value = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2611: 
        !          2612:                ALLOC_ZVAL(valptr);
        !          2613:                INIT_PZVAL_COPY(valptr, value);
        !          2614:                if (!IS_OP1_TMP_FREE()) {
        !          2615:                        zval_copy_ctor(valptr);
        !          2616:                }
        !          2617:                zend_vm_stack_push(valptr TSRMLS_CC);
        !          2618:                FREE_OP1_IF_VAR();
        !          2619:        }
        !          2620:        ZEND_VM_NEXT_OPCODE();
        !          2621: }
        !          2622: 
        !          2623: ZEND_VM_HELPER(zend_send_by_var_helper, VAR|CV, ANY)
        !          2624: {
        !          2625:        zend_op *opline = EX(opline);
        !          2626:        zval *varptr;
        !          2627:        zend_free_op free_op1;
        !          2628:        varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2629: 
        !          2630:        if (varptr == &EG(uninitialized_zval)) {
        !          2631:                ALLOC_ZVAL(varptr);
        !          2632:                INIT_ZVAL(*varptr);
        !          2633:                Z_SET_REFCOUNT_P(varptr, 0);
        !          2634:        } else if (PZVAL_IS_REF(varptr)) {
        !          2635:                zval *original_var = varptr;
        !          2636: 
        !          2637:                ALLOC_ZVAL(varptr);
        !          2638:                *varptr = *original_var;
        !          2639:                Z_UNSET_ISREF_P(varptr);
        !          2640:                Z_SET_REFCOUNT_P(varptr, 0);
        !          2641:                zval_copy_ctor(varptr);
        !          2642:        }
        !          2643:        Z_ADDREF_P(varptr);
        !          2644:        zend_vm_stack_push(varptr TSRMLS_CC);
        !          2645:        FREE_OP1();  /* for string offsets */
        !          2646: 
        !          2647:        ZEND_VM_NEXT_OPCODE();
        !          2648: }
        !          2649: 
        !          2650: ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
        !          2651: {
        !          2652:        zend_op *opline = EX(opline);
        !          2653:        zend_free_op free_op1;
        !          2654:        zval *varptr;
        !          2655: 
        !          2656:        if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
        !          2657:                if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
        !          2658:                        ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
        !          2659:                }
        !          2660:        } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
        !          2661:                ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
        !          2662:        }
        !          2663: 
        !          2664:        if (OP1_TYPE == IS_VAR &&
        !          2665:                (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
        !          2666:                EX_T(opline->op1.u.var).var.fcall_returned_reference &&
        !          2667:                EX_T(opline->op1.u.var).var.ptr) {
        !          2668:                varptr = EX_T(opline->op1.u.var).var.ptr;
        !          2669:                PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
        !          2670:        } else {
        !          2671:                varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          2672:        }
        !          2673:        if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
        !          2674:             EX_T(opline->op1.u.var).var.fcall_returned_reference) &&
        !          2675:            varptr != &EG(uninitialized_zval) &&
        !          2676:            (PZVAL_IS_REF(varptr) ||
        !          2677:             (Z_REFCOUNT_P(varptr) == 1 && (OP1_TYPE == IS_CV || free_op1.var)))) {
        !          2678:                Z_SET_ISREF_P(varptr);
        !          2679:                Z_ADDREF_P(varptr);
        !          2680:                zend_vm_stack_push(varptr TSRMLS_CC);
        !          2681:        } else {
        !          2682:                zval *valptr;
        !          2683: 
        !          2684:                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
        !          2685:                        !(opline->extended_value & ZEND_ARG_SEND_SILENT) :
        !          2686:                        !ARG_MAY_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
        !          2687:                        zend_error(E_STRICT, "Only variables should be passed by reference");
        !          2688:                }
        !          2689:                ALLOC_ZVAL(valptr);
        !          2690:                INIT_PZVAL_COPY(valptr, varptr);
        !          2691:                if (!IS_OP1_TMP_FREE()) {
        !          2692:                        zval_copy_ctor(valptr);
        !          2693:                }
        !          2694:                zend_vm_stack_push(valptr TSRMLS_CC);
        !          2695:        }
        !          2696:        FREE_OP1_IF_VAR();
        !          2697:        ZEND_VM_NEXT_OPCODE();
        !          2698: }
        !          2699: 
        !          2700: ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, ANY)
        !          2701: {
        !          2702:        zend_op *opline = EX(opline);
        !          2703:        zend_free_op free_op1;
        !          2704:        zval **varptr_ptr;
        !          2705:        zval *varptr;
        !          2706:        varptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          2707: 
        !          2708:        if (OP1_TYPE == IS_VAR && !varptr_ptr) {
        !          2709:                zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
        !          2710:        }
        !          2711: 
        !          2712:        if (OP1_TYPE == IS_VAR && *varptr_ptr == EG(error_zval_ptr)) {
        !          2713:                ALLOC_INIT_ZVAL(varptr);
        !          2714:                zend_vm_stack_push(varptr TSRMLS_CC);
        !          2715:                ZEND_VM_NEXT_OPCODE();
        !          2716:        }
        !          2717: 
        !          2718:        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
        !          2719:                ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
        !          2720:        }
        !          2721: 
        !          2722:        SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr);
        !          2723:        varptr = *varptr_ptr;
        !          2724:        Z_ADDREF_P(varptr);
        !          2725:        zend_vm_stack_push(varptr TSRMLS_CC);
        !          2726: 
        !          2727:        FREE_OP1_VAR_PTR();
        !          2728:        ZEND_VM_NEXT_OPCODE();
        !          2729: }
        !          2730: 
        !          2731: ZEND_VM_HANDLER(66, ZEND_SEND_VAR, VAR|CV, ANY)
        !          2732: {
        !          2733:        zend_op *opline = EX(opline);
        !          2734: 
        !          2735:        if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME)
        !          2736:                && ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
        !          2737:                ZEND_VM_DISPATCH_TO_HANDLER(ZEND_SEND_REF);
        !          2738:        }
        !          2739:        ZEND_VM_DISPATCH_TO_HELPER(zend_send_by_var_helper);
        !          2740: }
        !          2741: 
        !          2742: ZEND_VM_HANDLER(63, ZEND_RECV, ANY, ANY)
        !          2743: {
        !          2744:        zend_op *opline = EX(opline);
        !          2745:        zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
        !          2746:        zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
        !          2747: 
        !          2748:        if (param == NULL) {
        !          2749:                char *space;
        !          2750:                char *class_name = get_active_class_name(&space TSRMLS_CC);
        !          2751:                zend_execute_data *ptr = EX(prev_execute_data);
        !          2752: 
        !          2753:                if (zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL, opline->extended_value TSRMLS_CC)) {
        !          2754:                        if(ptr && ptr->op_array) {
        !          2755:                                zend_error(E_WARNING, "Missing argument %ld for %s%s%s(), called in %s on line %d and defined", opline->op1.u.constant.value.lval, class_name, space, get_active_function_name(TSRMLS_C), ptr->op_array->filename, ptr->opline->lineno);
        !          2756:                        } else {
        !          2757:                                zend_error(E_WARNING, "Missing argument %ld for %s%s%s()", opline->op1.u.constant.value.lval, class_name, space, get_active_function_name(TSRMLS_C));
        !          2758:                        }
        !          2759:                }
        !          2760:                if (opline->result.op_type == IS_VAR) {
        !          2761:                        PZVAL_UNLOCK_FREE(*EX_T(opline->result.u.var).var.ptr_ptr);
        !          2762:                }
        !          2763:        } else {
        !          2764:                zend_free_op free_res;
        !          2765:                zval **var_ptr;
        !          2766: 
        !          2767:                zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC);
        !          2768:                var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
        !          2769:                Z_DELREF_PP(var_ptr);
        !          2770:                *var_ptr = *param;
        !          2771:                Z_ADDREF_PP(var_ptr);
        !          2772:        }
        !          2773: 
        !          2774:        ZEND_VM_NEXT_OPCODE();
        !          2775: }
        !          2776: 
        !          2777: ZEND_VM_HANDLER(64, ZEND_RECV_INIT, ANY, CONST)
        !          2778: {
        !          2779:        zend_op *opline = EX(opline);
        !          2780:        zval *assignment_value;
        !          2781:        zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
        !          2782:        zend_free_op free_res;
        !          2783:        zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
        !          2784:        zval **var_ptr;
        !          2785: 
        !          2786:        if (param == NULL) {
        !          2787:                ALLOC_ZVAL(assignment_value);
        !          2788:                *assignment_value = opline->op2.u.constant;
        !          2789:                if ((Z_TYPE(opline->op2.u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) {
        !          2790:                        Z_SET_REFCOUNT_P(assignment_value, 1);
        !          2791:                        zval_update_constant(&assignment_value, 0 TSRMLS_CC);
        !          2792:                } else {
        !          2793:                        zval_copy_ctor(assignment_value);
        !          2794:                }
        !          2795:                INIT_PZVAL(assignment_value);
        !          2796:        } else {
        !          2797:                assignment_value = *param;
        !          2798:                Z_ADDREF_P(assignment_value);
        !          2799:        }
        !          2800: 
        !          2801:        zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
        !          2802:        var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
        !          2803:        Z_DELREF_PP(var_ptr);
        !          2804:        *var_ptr = assignment_value;
        !          2805: 
        !          2806:        ZEND_VM_NEXT_OPCODE();
        !          2807: }
        !          2808: 
        !          2809: ZEND_VM_HANDLER(52, ZEND_BOOL, CONST|TMP|VAR|CV, ANY)
        !          2810: {
        !          2811:        zend_op *opline = EX(opline);
        !          2812:        zend_free_op free_op1;
        !          2813: 
        !          2814:        /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
        !          2815:        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(GET_OP1_ZVAL_PTR(BP_VAR_R));
        !          2816:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
        !          2817:        FREE_OP1();
        !          2818: 
        !          2819:        ZEND_VM_NEXT_OPCODE();
        !          2820: }
        !          2821: 
        !          2822: ZEND_VM_HANDLER(50, ZEND_BRK, ANY, CONST|TMP|VAR|CV)
        !          2823: {
        !          2824:        zend_op *opline = EX(opline);
        !          2825:        zend_free_op free_op2;
        !          2826:        zend_brk_cont_element *el;
        !          2827: 
        !          2828:        el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num,
        !          2829:                           EX(op_array), EX(Ts) TSRMLS_CC);
        !          2830:        FREE_OP2();
        !          2831:        ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
        !          2832: }
        !          2833: 
        !          2834: ZEND_VM_HANDLER(51, ZEND_CONT, ANY, CONST|TMP|VAR|CV)
        !          2835: {
        !          2836:        zend_op *opline = EX(opline);
        !          2837:        zend_free_op free_op2;
        !          2838:        zend_brk_cont_element *el;
        !          2839: 
        !          2840:        el = zend_brk_cont(GET_OP2_ZVAL_PTR(BP_VAR_R), opline->op1.u.opline_num,
        !          2841:                           EX(op_array), EX(Ts) TSRMLS_CC);
        !          2842:        FREE_OP2();
        !          2843:        ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
        !          2844: }
        !          2845: 
        !          2846: ZEND_VM_HANDLER(100, ZEND_GOTO, ANY, CONST)
        !          2847: {
        !          2848:        zend_op *brk_opline;
        !          2849:        zend_op *opline = EX(opline);
        !          2850:        zend_brk_cont_element *el;
        !          2851: 
        !          2852:        el = zend_brk_cont(&opline->op2.u.constant, opline->extended_value,
        !          2853:                           EX(op_array), EX(Ts) TSRMLS_CC);
        !          2854: 
        !          2855:        brk_opline = EX(op_array)->opcodes + el->brk;
        !          2856: 
        !          2857:        switch (brk_opline->opcode) {
        !          2858:                case ZEND_SWITCH_FREE:
        !          2859:                        if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
        !          2860:                                zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
        !          2861:                        }
        !          2862:                        break;
        !          2863:                case ZEND_FREE:
        !          2864:                        if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
        !          2865:                                zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
        !          2866:                        }
        !          2867:                        break;
        !          2868:        }
        !          2869:        ZEND_VM_JMP(opline->op1.u.jmp_addr);
        !          2870: }
        !          2871: 
        !          2872: ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
        !          2873: {
        !          2874:        zend_op *opline = EX(opline);
        !          2875:        int switch_expr_is_overloaded=0;
        !          2876:        zend_free_op free_op1, free_op2;
        !          2877: 
        !          2878:        if (OP1_TYPE==IS_VAR) {
        !          2879:                if (EX_T(opline->op1.u.var).var.ptr_ptr) {
        !          2880:                        PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
        !          2881:                } else {
        !          2882:                        switch_expr_is_overloaded = 1;
        !          2883:                        Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
        !          2884:                }
        !          2885:        }
        !          2886:        is_equal_function(&EX_T(opline->result.u.var).tmp_var,
        !          2887:                                 GET_OP1_ZVAL_PTR(BP_VAR_R),
        !          2888:                                 GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
        !          2889: 
        !          2890:        FREE_OP2();
        !          2891:        if (switch_expr_is_overloaded) {
        !          2892:                /* We only free op1 if this is a string offset,
        !          2893:                 * Since if it is a TMP_VAR, it'll be reused by
        !          2894:                 * other CASE opcodes (whereas string offsets
        !          2895:                 * are allocated at each get_zval_ptr())
        !          2896:                 */
        !          2897:                FREE_OP1();
        !          2898:                EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
        !          2899:                EX_T(opline->op1.u.var).var.ptr = NULL;
        !          2900:        }
        !          2901:        ZEND_VM_NEXT_OPCODE();
        !          2902: }
        !          2903: 
        !          2904: ZEND_VM_HANDLER(49, ZEND_SWITCH_FREE, VAR, ANY)
        !          2905: {
        !          2906:        zend_op *opline = EX(opline);
        !          2907: 
        !          2908:        zend_switch_free(&EX_T(opline->op1.u.var), opline->extended_value TSRMLS_CC);
        !          2909:        ZEND_VM_NEXT_OPCODE();
        !          2910: }
        !          2911: 
        !          2912: ZEND_VM_HANDLER(68, ZEND_NEW, ANY, ANY)
        !          2913: {
        !          2914:        zend_op *opline = EX(opline);
        !          2915:        zval *object_zval;
        !          2916:        zend_function *constructor;
        !          2917: 
        !          2918:        if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
        !          2919:                char *class_type;
        !          2920: 
        !          2921:                if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
        !          2922:                        class_type = "interface";
        !          2923:                } else {
        !          2924:                        class_type = "abstract class";
        !          2925:                }
        !          2926:                zend_error_noreturn(E_ERROR, "Cannot instantiate %s %s", class_type,  EX_T(opline->op1.u.var).class_entry->name);
        !          2927:        }
        !          2928:        ALLOC_ZVAL(object_zval);
        !          2929:        object_init_ex(object_zval, EX_T(opline->op1.u.var).class_entry);
        !          2930:        INIT_PZVAL(object_zval);
        !          2931: 
        !          2932:        constructor = Z_OBJ_HT_P(object_zval)->get_constructor(object_zval TSRMLS_CC);
        !          2933: 
        !          2934:        if (constructor == NULL) {
        !          2935:                if (RETURN_VALUE_USED(opline)) {
        !          2936:                        AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
        !          2937:                } else {
        !          2938:                        zval_ptr_dtor(&object_zval);
        !          2939:                }
        !          2940:                ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num);
        !          2941:        } else {
        !          2942:                if (RETURN_VALUE_USED(opline)) {
        !          2943:                        AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
        !          2944:                        PZVAL_LOCK(object_zval);
        !          2945:                }
        !          2946: 
        !          2947:                zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), ENCODE_CTOR(EX(called_scope), RETURN_VALUE_USED(opline)));
        !          2948: 
        !          2949:                /* We are not handling overloaded classes right now */
        !          2950:                EX(object) = object_zval;
        !          2951:                EX(fbc) = constructor;
        !          2952:                EX(called_scope) = EX_T(opline->op1.u.var).class_entry;
        !          2953: 
        !          2954:                ZEND_VM_NEXT_OPCODE();
        !          2955:        }
        !          2956: }
        !          2957: 
        !          2958: ZEND_VM_HANDLER(110, ZEND_CLONE, CONST|TMP|VAR|UNUSED|CV, ANY)
        !          2959: {
        !          2960:        zend_op *opline = EX(opline);
        !          2961:        zend_free_op free_op1;
        !          2962:        zval *obj = GET_OP1_OBJ_ZVAL_PTR(BP_VAR_R);
        !          2963:        zend_class_entry *ce;
        !          2964:        zend_function *clone;
        !          2965:        zend_object_clone_obj_t clone_call;
        !          2966: 
        !          2967:        if (OP1_TYPE == IS_CONST ||
        !          2968:            (OP1_TYPE == IS_VAR && !obj) ||
        !          2969:            Z_TYPE_P(obj) != IS_OBJECT) {
        !          2970:                zend_error_noreturn(E_ERROR, "__clone method called on non-object");
        !          2971:        }
        !          2972: 
        !          2973:        ce = Z_OBJCE_P(obj);
        !          2974:        clone = ce ? ce->clone : NULL;
        !          2975:        clone_call =  Z_OBJ_HT_P(obj)->clone_obj;
        !          2976:        if (!clone_call) {
        !          2977:                if (ce) {
        !          2978:                        zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
        !          2979:                } else {
        !          2980:                        zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
        !          2981:                }
        !          2982:        }
        !          2983: 
        !          2984:        if (ce && clone) {
        !          2985:                if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
        !          2986:                        /* Ensure that if we're calling a private function, we're allowed to do so.
        !          2987:                         */
        !          2988:                        if (ce != EG(scope)) {
        !          2989:                                zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
        !          2990:                        }
        !          2991:                } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
        !          2992:                        /* Ensure that if we're calling a protected function, we're allowed to do so.
        !          2993:                         */
        !          2994:                        if (!zend_check_protected(clone->common.scope, EG(scope))) {
        !          2995:                                zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
        !          2996:                        }
        !          2997:                }
        !          2998:        }
        !          2999: 
        !          3000:        EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          3001:        if (!EG(exception)) {
        !          3002:                ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          3003:                Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
        !          3004:                Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
        !          3005:                Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
        !          3006:                Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
        !          3007:                if (!RETURN_VALUE_USED(opline) || EG(exception)) {
        !          3008:                        zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
        !          3009:                }
        !          3010:        }
        !          3011:        FREE_OP1_IF_VAR();
        !          3012:        ZEND_VM_NEXT_OPCODE();
        !          3013: }
        !          3014: 
        !          3015: ZEND_VM_HANDLER(99, ZEND_FETCH_CONSTANT, VAR|CONST|UNUSED, CONST)
        !          3016: {
        !          3017:        zend_op *opline = EX(opline);
        !          3018: 
        !          3019:        if (OP1_TYPE == IS_UNUSED) {
        !          3020:                /* namespaced constant */
        !          3021:                if (!zend_get_constant_ex(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant), &EX_T(opline->result.u.var).tmp_var, NULL, opline->extended_value TSRMLS_CC)) {
        !          3022:                        if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
        !          3023:                                char *actual = (char *)zend_memrchr(Z_STRVAL(opline->op2.u.constant), '\\', Z_STRLEN(opline->op2.u.constant));
        !          3024:                                if(!actual) {
        !          3025:                                        actual = Z_STRVAL(opline->op2.u.constant);
        !          3026:                                } else {
        !          3027:                                        actual++;
        !          3028:                                }
        !          3029:                                /* non-qualified constant - allow text substitution */
        !          3030:                                zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
        !          3031:                                ZVAL_STRINGL(&EX_T(opline->result.u.var).tmp_var, actual, Z_STRLEN(opline->op2.u.constant)-(actual - Z_STRVAL(opline->op2.u.constant)), 1);
        !          3032:                        } else {
        !          3033:                                zend_error_noreturn(E_ERROR, "Undefined constant '%s'",
        !          3034:                                                        Z_STRVAL(opline->op2.u.constant), Z_STRVAL(opline->op2.u.constant));
        !          3035:                        }
        !          3036:                }
        !          3037:                ZEND_VM_NEXT_OPCODE();
        !          3038:        } else {
        !          3039:                /* class constant */
        !          3040:                zend_class_entry *ce;
        !          3041:                zval **value;
        !          3042: 
        !          3043:                if (OP1_TYPE == IS_CONST) {
        !          3044: 
        !          3045:                        ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
        !          3046:                        if (!ce) {
        !          3047:                                zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
        !          3048:                        }
        !          3049:                } else {
        !          3050:                        ce = EX_T(opline->op1.u.var).class_entry;
        !          3051:                }
        !          3052: 
        !          3053:                if (zend_hash_find(&ce->constants_table, Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void **) &value) == SUCCESS) {
        !          3054:                        if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
        !          3055:                            (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
        !          3056:                                zend_class_entry *old_scope = EG(scope);
        !          3057: 
        !          3058:                                EG(scope) = ce;
        !          3059:                                zval_update_constant(value, (void *) 1 TSRMLS_CC);
        !          3060:                                EG(scope) = old_scope;
        !          3061:                        }
        !          3062:                        EX_T(opline->result.u.var).tmp_var = **value;
        !          3063:                        zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
        !          3064:                } else {
        !          3065:                        zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
        !          3066:                }
        !          3067: 
        !          3068:                ZEND_VM_NEXT_OPCODE();
        !          3069:        }
        !          3070: }
        !          3071: 
        !          3072: ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUSED|CV)
        !          3073: {
        !          3074:        zend_op *opline = EX(opline);
        !          3075:        zend_free_op free_op1, free_op2;
        !          3076:        zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
        !          3077:        zval *expr_ptr;
        !          3078:        zval *offset=GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          3079: 
        !          3080: #if !defined(ZEND_VM_SPEC) || OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV
        !          3081:        zval **expr_ptr_ptr = NULL;
        !          3082: 
        !          3083:        if (opline->extended_value) {
        !          3084:                expr_ptr_ptr=GET_OP1_ZVAL_PTR_PTR(BP_VAR_W);
        !          3085:                expr_ptr = *expr_ptr_ptr;
        !          3086:        } else {
        !          3087:                expr_ptr=GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3088:        }
        !          3089: #else
        !          3090:        expr_ptr=GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3091: #endif
        !          3092: 
        !          3093:        if (IS_OP1_TMP_FREE()) { /* temporary variable */
        !          3094:                zval *new_expr;
        !          3095: 
        !          3096:                ALLOC_ZVAL(new_expr);
        !          3097:                INIT_PZVAL_COPY(new_expr, expr_ptr);
        !          3098:                expr_ptr = new_expr;
        !          3099:        } else {
        !          3100: #if !defined(ZEND_VM_SPEC) || OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV
        !          3101:                if (opline->extended_value) {
        !          3102:                        SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
        !          3103:                        expr_ptr = *expr_ptr_ptr;
        !          3104:                        Z_ADDREF_P(expr_ptr);
        !          3105:                } else
        !          3106: #endif
        !          3107:                if (OP1_TYPE == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
        !          3108:                        zval *new_expr;
        !          3109: 
        !          3110:                        ALLOC_ZVAL(new_expr);
        !          3111:                        INIT_PZVAL_COPY(new_expr, expr_ptr);
        !          3112:                        expr_ptr = new_expr;
        !          3113:                        zendi_zval_copy_ctor(*expr_ptr);
        !          3114:                } else {
        !          3115:                        Z_ADDREF_P(expr_ptr);
        !          3116:                }
        !          3117:        }
        !          3118:        if (offset) {
        !          3119:                switch (Z_TYPE_P(offset)) {
        !          3120:                        case IS_DOUBLE:
        !          3121:                                zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
        !          3122:                                break;
        !          3123:                        case IS_LONG:
        !          3124:                        case IS_BOOL:
        !          3125:                                zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
        !          3126:                                break;
        !          3127:                        case IS_STRING:
        !          3128:                                zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
        !          3129:                                break;
        !          3130:                        case IS_NULL:
        !          3131:                                zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
        !          3132:                                break;
        !          3133:                        default:
        !          3134:                                zend_error(E_WARNING, "Illegal offset type");
        !          3135:                                zval_ptr_dtor(&expr_ptr);
        !          3136:                                /* do nothing */
        !          3137:                                break;
        !          3138:                }
        !          3139:                FREE_OP2();
        !          3140:        } else {
        !          3141:                zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
        !          3142:        }
        !          3143:        if (opline->extended_value) {
        !          3144:                FREE_OP1_VAR_PTR();
        !          3145:        } else {
        !          3146:                FREE_OP1_IF_VAR();
        !          3147:        }
        !          3148:        ZEND_VM_NEXT_OPCODE();
        !          3149: }
        !          3150: 
        !          3151: ZEND_VM_HANDLER(71, ZEND_INIT_ARRAY, CONST|TMP|VAR|UNUSED|CV, CONST|TMP|VAR|UNUSED|CV)
        !          3152: {
        !          3153:        zend_op *opline = EX(opline);
        !          3154: 
        !          3155:        array_init(&EX_T(opline->result.u.var).tmp_var);
        !          3156:        if (OP1_TYPE == IS_UNUSED) {
        !          3157:                ZEND_VM_NEXT_OPCODE();
        !          3158: #if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED
        !          3159:        } else {
        !          3160:                ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ADD_ARRAY_ELEMENT);
        !          3161: #endif
        !          3162:        }
        !          3163: }
        !          3164: 
        !          3165: ZEND_VM_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY)
        !          3166: {
        !          3167:        zend_op *opline = EX(opline);
        !          3168:        zend_free_op free_op1;
        !          3169:        zval *expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3170:        zval *result = &EX_T(opline->result.u.var).tmp_var;
        !          3171: 
        !          3172:        if (opline->extended_value != IS_STRING) {
        !          3173:                *result = *expr;
        !          3174:                if (!IS_OP1_TMP_FREE()) {
        !          3175:                        zendi_zval_copy_ctor(*result);
        !          3176:                }
        !          3177:        }
        !          3178:        switch (opline->extended_value) {
        !          3179:                case IS_NULL:
        !          3180:                        convert_to_null(result);
        !          3181:                        break;
        !          3182:                case IS_BOOL:
        !          3183:                        convert_to_boolean(result);
        !          3184:                        break;
        !          3185:                case IS_LONG:
        !          3186:                        convert_to_long(result);
        !          3187:                        break;
        !          3188:                case IS_DOUBLE:
        !          3189:                        convert_to_double(result);
        !          3190:                        break;
        !          3191:                case IS_STRING: {
        !          3192:                        zval var_copy;
        !          3193:                        int use_copy;
        !          3194: 
        !          3195:                        zend_make_printable_zval(expr, &var_copy, &use_copy);
        !          3196:                        if (use_copy) {
        !          3197:                                *result = var_copy;
        !          3198:                                if (IS_OP1_TMP_FREE()) {
        !          3199:                                        FREE_OP1();
        !          3200:                                }
        !          3201:                        } else {
        !          3202:                                *result = *expr;
        !          3203:                                if (!IS_OP1_TMP_FREE()) {
        !          3204:                                        zendi_zval_copy_ctor(*result);
        !          3205:                                }
        !          3206:                        }
        !          3207:                        break;
        !          3208:                }
        !          3209:                case IS_ARRAY:
        !          3210:                        convert_to_array(result);
        !          3211:                        break;
        !          3212:                case IS_OBJECT:
        !          3213:                        convert_to_object(result);
        !          3214:                        break;
        !          3215:        }
        !          3216:        FREE_OP1_IF_VAR();
        !          3217:        ZEND_VM_NEXT_OPCODE();
        !          3218: }
        !          3219: 
        !          3220: ZEND_VM_HANDLER(73, ZEND_INCLUDE_OR_EVAL, CONST|TMP|VAR|CV, ANY)
        !          3221: {
        !          3222:        zend_op *opline = EX(opline);
        !          3223:        zend_op_array *new_op_array=NULL;
        !          3224:        int return_value_used;
        !          3225:        zend_free_op free_op1;
        !          3226:        zval *inc_filename = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3227:        zval tmp_inc_filename;
        !          3228:        zend_bool failure_retval=0;
        !          3229: 
        !          3230:        if (inc_filename->type!=IS_STRING) {
        !          3231:                tmp_inc_filename = *inc_filename;
        !          3232:                zval_copy_ctor(&tmp_inc_filename);
        !          3233:                convert_to_string(&tmp_inc_filename);
        !          3234:                inc_filename = &tmp_inc_filename;
        !          3235:        }
        !          3236: 
        !          3237:        return_value_used = RETURN_VALUE_USED(opline);
        !          3238:        
        !          3239:        if (Z_LVAL(opline->op2.u.constant) != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
        !          3240:                if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE || Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE) {
        !          3241:                        zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
        !          3242:                } else {
        !          3243:                        zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
        !          3244:                }
        !          3245:        } else {
        !          3246:                switch (Z_LVAL(opline->op2.u.constant)) {
        !          3247:                        case ZEND_INCLUDE_ONCE:
        !          3248:                        case ZEND_REQUIRE_ONCE: {
        !          3249:                                        zend_file_handle file_handle;
        !          3250:                                        char *resolved_path;
        !          3251: 
        !          3252:                                        resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
        !          3253:                                        if (resolved_path) {
        !          3254:                                                failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
        !          3255:                                        } else {
        !          3256:                                                resolved_path = Z_STRVAL_P(inc_filename);
        !          3257:                                        }
        !          3258: 
        !          3259:                                        if (failure_retval) {
        !          3260:                                                /* do nothing, file already included */
        !          3261:                                        } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
        !          3262: 
        !          3263:                                                if (!file_handle.opened_path) {
        !          3264:                                                        file_handle.opened_path = estrdup(resolved_path);
        !          3265:                                                }
        !          3266: 
        !          3267:                                                if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
        !          3268:                                                        new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
        !          3269:                                                        zend_destroy_file_handle(&file_handle TSRMLS_CC);
        !          3270:                                                } else {
        !          3271:                                                        zend_file_handle_dtor(&file_handle TSRMLS_CC);
        !          3272:                                                        failure_retval=1;
        !          3273:                                                }
        !          3274:                                        } else {
        !          3275:                                                if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
        !          3276:                                                        zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
        !          3277:                                                } else {
        !          3278:                                                        zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
        !          3279:                                                }
        !          3280:                                        }
        !          3281:                                        if (resolved_path != Z_STRVAL_P(inc_filename)) {
        !          3282:                                                efree(resolved_path);
        !          3283:                                        }
        !          3284:                                }
        !          3285:                                break;
        !          3286:                        case ZEND_INCLUDE:
        !          3287:                        case ZEND_REQUIRE:
        !          3288:                                new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
        !          3289:                                break;
        !          3290:                        case ZEND_EVAL: {
        !          3291:                                        char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
        !          3292: 
        !          3293:                                        new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
        !          3294:                                        efree(eval_desc);
        !          3295:                                }
        !          3296:                                break;
        !          3297:                        EMPTY_SWITCH_DEFAULT_CASE()
        !          3298:                }
        !          3299:        }
        !          3300:        if (inc_filename==&tmp_inc_filename) {
        !          3301:                zval_dtor(&tmp_inc_filename);
        !          3302:        }
        !          3303:        FREE_OP1();
        !          3304:        EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
        !          3305:        if (new_op_array && !EG(exception)) {
        !          3306:                EX(original_return_value) = EG(return_value_ptr_ptr);
        !          3307:                EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
        !          3308:                EG(active_op_array) = new_op_array;
        !          3309:                EX_T(opline->result.u.var).var.ptr = NULL;
        !          3310: 
        !          3311:                EX(current_object) = EX(object);
        !          3312: 
        !          3313:                EX(function_state).function = (zend_function *) new_op_array;
        !          3314:                EX(object) = NULL;
        !          3315: 
        !          3316:                if (!EG(active_symbol_table)) {
        !          3317:                        zend_rebuild_symbol_table(TSRMLS_C);
        !          3318:                }
        !          3319: 
        !          3320:                if (zend_execute == execute) {
        !          3321:                        EX(call_opline) = opline;
        !          3322:                        ZEND_VM_ENTER();
        !          3323:                } else {
        !          3324:                        zend_execute(new_op_array TSRMLS_CC);
        !          3325:                }
        !          3326: 
        !          3327:                EX(function_state).function = (zend_function *) EX(op_array);
        !          3328:                EX(object) = EX(current_object);
        !          3329: 
        !          3330:                if (return_value_used) {
        !          3331:                        if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
        !          3332:                                ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          3333:                                INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
        !          3334:                                Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
        !          3335:                                Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
        !          3336:                        }
        !          3337:                }
        !          3338: 
        !          3339:                EG(opline_ptr) = &EX(opline);
        !          3340:                EG(active_op_array) = EX(op_array);
        !          3341:                EG(return_value_ptr_ptr) = EX(original_return_value);
        !          3342:                destroy_op_array(new_op_array TSRMLS_CC);
        !          3343:                efree(new_op_array);
        !          3344:                if (EG(exception)) {
        !          3345:                        zend_throw_exception_internal(NULL TSRMLS_CC);
        !          3346:                }
        !          3347:        } else {
        !          3348:                if (return_value_used) {
        !          3349:                        ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
        !          3350:                        INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
        !          3351:                        Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
        !          3352:                        Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
        !          3353:                }
        !          3354:        }
        !          3355:        ZEND_VM_NEXT_OPCODE();
        !          3356: }
        !          3357: 
        !          3358: ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMP|VAR|CV, ANY)
        !          3359: {
        !          3360:        zend_op *opline = EX(opline);
        !          3361:        zval tmp, *varname;
        !          3362:        HashTable *target_symbol_table;
        !          3363:        zend_free_op free_op1;
        !          3364: 
        !          3365:        if (OP1_TYPE == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
        !          3366:                if (EG(active_symbol_table)) {
        !          3367:                        zend_execute_data *ex = EX(prev_execute_data);
        !          3368:                        zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
        !          3369: 
        !          3370:                        if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
        !          3371:                                while (ex && ex->symbol_table == EG(active_symbol_table)) {
        !          3372:                                        int i;
        !          3373: 
        !          3374:                                        if (ex->op_array) {
        !          3375:                                                for (i = 0; i < ex->op_array->last_var; i++) {
        !          3376:                                                        if (ex->op_array->vars[i].hash_value == cv->hash_value &&
        !          3377:                                                                ex->op_array->vars[i].name_len == cv->name_len &&
        !          3378:                                                                !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
        !          3379:                                                                ex->CVs[i] = NULL;
        !          3380:                                                                break;
        !          3381:                                                        }
        !          3382:                                                }
        !          3383:                                        }
        !          3384:                                        ex = ex->prev_execute_data;
        !          3385:                                }
        !          3386:                        }
        !          3387:                        EX(CVs)[opline->op1.u.var] = NULL;
        !          3388:                } else if (EX(CVs)[opline->op1.u.var]) {
        !          3389:                        zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
        !          3390:                        EX(CVs)[opline->op1.u.var] = NULL;
        !          3391:                }
        !          3392:                ZEND_VM_NEXT_OPCODE();
        !          3393:        }
        !          3394: 
        !          3395:        varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3396: 
        !          3397:        if (Z_TYPE_P(varname) != IS_STRING) {
        !          3398:                tmp = *varname;
        !          3399:                zval_copy_ctor(&tmp);
        !          3400:                convert_to_string(&tmp);
        !          3401:                varname = &tmp;
        !          3402:        } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
        !          3403:                Z_ADDREF_P(varname);
        !          3404:        }
        !          3405: 
        !          3406:        if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
        !          3407:                zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
        !          3408:        } else {
        !          3409:                ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
        !          3410: 
        !          3411:                target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
        !          3412:                if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
        !          3413:                        zend_execute_data *ex = EXECUTE_DATA;
        !          3414: 
        !          3415:                        do {
        !          3416:                                int i;
        !          3417: 
        !          3418:                                if (ex->op_array) {
        !          3419:                                        for (i = 0; i < ex->op_array->last_var; i++) {
        !          3420:                                                if (ex->op_array->vars[i].hash_value == hash_value &&
        !          3421:                                                        ex->op_array->vars[i].name_len == varname->value.str.len &&
        !          3422:                                                        !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
        !          3423:                                                        ex->CVs[i] = NULL;
        !          3424:                                                        break;
        !          3425:                                                }
        !          3426:                                        }
        !          3427:                                }
        !          3428:                                ex = ex->prev_execute_data;
        !          3429:                        } while (ex && ex->symbol_table == target_symbol_table);
        !          3430:                }
        !          3431:        }
        !          3432: 
        !          3433:        if (varname == &tmp) {
        !          3434:                zval_dtor(&tmp);
        !          3435:        } else if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) {
        !          3436:                zval_ptr_dtor(&varname);
        !          3437:        }
        !          3438:        FREE_OP1();
        !          3439:        ZEND_VM_NEXT_OPCODE();
        !          3440: }
        !          3441: 
        !          3442: ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          3443: {
        !          3444:        zend_op *opline = EX(opline);
        !          3445:        zend_free_op free_op1, free_op2;
        !          3446:        zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
        !          3447:        zval *offset;
        !          3448: 
        !          3449:        if (OP1_TYPE == IS_CV && container != &EG(uninitialized_zval_ptr)) {
        !          3450:                SEPARATE_ZVAL_IF_NOT_REF(container);
        !          3451:        }
        !          3452:        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          3453: 
        !          3454:        if (OP1_TYPE != IS_VAR || container) {
        !          3455:                switch (Z_TYPE_PP(container)) {
        !          3456:                        case IS_ARRAY: {
        !          3457:                                HashTable *ht = Z_ARRVAL_PP(container);
        !          3458: 
        !          3459:                                switch (Z_TYPE_P(offset)) {
        !          3460:                                        case IS_DOUBLE:
        !          3461:                                                zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
        !          3462:                                                break;
        !          3463:                                        case IS_RESOURCE:
        !          3464:                                        case IS_BOOL:
        !          3465:                                        case IS_LONG:
        !          3466:                                                zend_hash_index_del(ht, Z_LVAL_P(offset));
        !          3467:                                                break;
        !          3468:                                        case IS_STRING:
        !          3469:                                                if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR) {
        !          3470:                                                        Z_ADDREF_P(offset);
        !          3471:                                                }
        !          3472:                                                if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
        !          3473:                                            ht == &EG(symbol_table)) {
        !          3474:                                                        zend_execute_data *ex;
        !          3475:                                                        ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
        !          3476: 
        !          3477:                                                        for (ex = EXECUTE_DATA; ex; ex = ex->prev_execute_data) {
        !          3478:                                                                if (ex->op_array && ex->symbol_table == ht) {
        !          3479:                                                                        int i;
        !          3480: 
        !          3481:                                                                        for (i = 0; i < ex->op_array->last_var; i++) {
        !          3482:                                                                                if (ex->op_array->vars[i].hash_value == hash_value &&
        !          3483:                                                                                    ex->op_array->vars[i].name_len == offset->value.str.len &&
        !          3484:                                                                                    !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
        !          3485:                                                                                        ex->CVs[i] = NULL;
        !          3486:                                                                                        break;
        !          3487:                                                                                }
        !          3488:                                                                        }
        !          3489:                                                                }
        !          3490:                                                        }
        !          3491:                                                }
        !          3492:                                                if (OP2_TYPE == IS_CV || OP2_TYPE == IS_VAR) {
        !          3493:                                                        zval_ptr_dtor(&offset);
        !          3494:                                                }
        !          3495:                                                break;
        !          3496:                                        case IS_NULL:
        !          3497:                                                zend_hash_del(ht, "", sizeof(""));
        !          3498:                                                break;
        !          3499:                                        default:
        !          3500:                                                zend_error(E_WARNING, "Illegal offset type in unset");
        !          3501:                                                break;
        !          3502:                                }
        !          3503:                                FREE_OP2();
        !          3504:                                break;
        !          3505:                        }
        !          3506:                        case IS_OBJECT:
        !          3507:                                if (!Z_OBJ_HT_P(*container)->unset_dimension) {
        !          3508:                                        zend_error_noreturn(E_ERROR, "Cannot use object as array");
        !          3509:                                }
        !          3510:                                if (IS_OP2_TMP_FREE()) {
        !          3511:                                        MAKE_REAL_ZVAL_PTR(offset);
        !          3512:                                }
        !          3513:                                Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
        !          3514:                                if (IS_OP2_TMP_FREE()) {
        !          3515:                                        zval_ptr_dtor(&offset);
        !          3516:                                } else {
        !          3517:                                        FREE_OP2();
        !          3518:                                }
        !          3519:                                break;
        !          3520:                        case IS_STRING:
        !          3521:                                zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
        !          3522:                                ZEND_VM_CONTINUE(); /* bailed out before */
        !          3523:                        default:
        !          3524:                                FREE_OP2();
        !          3525:                                break;
        !          3526:                }
        !          3527:        } else {
        !          3528:                FREE_OP2();
        !          3529:        }
        !          3530:        FREE_OP1_VAR_PTR();
        !          3531: 
        !          3532:        ZEND_VM_NEXT_OPCODE();
        !          3533: }
        !          3534: 
        !          3535: ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          3536: {
        !          3537:        zend_op *opline = EX(opline);
        !          3538:        zend_free_op free_op1, free_op2;
        !          3539:        zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_UNSET);
        !          3540:        zval *offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          3541: 
        !          3542:        if (OP1_TYPE != IS_VAR || container) {
        !          3543:                if (OP1_TYPE == IS_CV && container != &EG(uninitialized_zval_ptr)) {
        !          3544:                        SEPARATE_ZVAL_IF_NOT_REF(container);
        !          3545:                }
        !          3546:                if (Z_TYPE_PP(container) == IS_OBJECT) {
        !          3547:                        if (IS_OP2_TMP_FREE()) {
        !          3548:                                MAKE_REAL_ZVAL_PTR(offset);
        !          3549:                        }
        !          3550:                        if (Z_OBJ_HT_P(*container)->unset_property) {
        !          3551:                                Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
        !          3552:                        } else {
        !          3553:                                zend_error(E_NOTICE, "Trying to unset property of non-object");
        !          3554:                        }
        !          3555:                        if (IS_OP2_TMP_FREE()) {
        !          3556:                                zval_ptr_dtor(&offset);
        !          3557:                        } else {
        !          3558:                                FREE_OP2();
        !          3559:                        }
        !          3560:                } else {
        !          3561:                        FREE_OP2();
        !          3562:                }
        !          3563:        } else {
        !          3564:                FREE_OP2();
        !          3565:        }
        !          3566:        FREE_OP1_VAR_PTR();
        !          3567: 
        !          3568:        ZEND_VM_NEXT_OPCODE();
        !          3569: }
        !          3570: 
        !          3571: ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
        !          3572: {
        !          3573:        zend_op *opline = EX(opline);
        !          3574:        zend_free_op free_op1;
        !          3575:        zval *array_ptr, **array_ptr_ptr;
        !          3576:        HashTable *fe_ht;
        !          3577:        zend_object_iterator *iter = NULL;
        !          3578:        zend_class_entry *ce = NULL;
        !          3579:        zend_bool is_empty = 0;
        !          3580: 
        !          3581:        if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
        !          3582:                array_ptr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_R);
        !          3583:                if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
        !          3584:                        ALLOC_INIT_ZVAL(array_ptr);
        !          3585:                } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
        !          3586:                        if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
        !          3587:                                zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
        !          3588:                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3589:                        }
        !          3590: 
        !          3591:                        ce = Z_OBJCE_PP(array_ptr_ptr);
        !          3592:                        if (!ce || ce->get_iterator == NULL) {
        !          3593:                                SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
        !          3594:                                Z_ADDREF_PP(array_ptr_ptr);
        !          3595:                        }
        !          3596:                        array_ptr = *array_ptr_ptr;
        !          3597:                } else {
        !          3598:                        if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
        !          3599:                                SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
        !          3600:                                if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
        !          3601:                                        Z_SET_ISREF_PP(array_ptr_ptr);
        !          3602:                                }
        !          3603:                        }
        !          3604:                        array_ptr = *array_ptr_ptr;
        !          3605:                        Z_ADDREF_P(array_ptr);
        !          3606:                }
        !          3607:        } else {
        !          3608:                array_ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          3609:                if (IS_OP1_TMP_FREE()) { /* IS_TMP_VAR */
        !          3610:                        zval *tmp;
        !          3611: 
        !          3612:                        ALLOC_ZVAL(tmp);
        !          3613:                        INIT_PZVAL_COPY(tmp, array_ptr);
        !          3614:                        array_ptr = tmp;
        !          3615:                        if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
        !          3616:                                ce = Z_OBJCE_P(array_ptr);
        !          3617:                                if (ce && ce->get_iterator) {
        !          3618:                                        Z_DELREF_P(array_ptr);
        !          3619:                                }
        !          3620:                        }
        !          3621:                } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
        !          3622:                        ce = Z_OBJCE_P(array_ptr);
        !          3623:                        if (!ce || !ce->get_iterator) {
        !          3624:                                Z_ADDREF_P(array_ptr);
        !          3625:                        }
        !          3626:                } else if (OP1_TYPE == IS_CONST || 
        !          3627:                           ((OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) &&
        !          3628:                            !Z_ISREF_P(array_ptr) &&
        !          3629:                            Z_REFCOUNT_P(array_ptr) > 1)) {
        !          3630:                        zval *tmp;
        !          3631: 
        !          3632:                        ALLOC_ZVAL(tmp);
        !          3633:                        INIT_PZVAL_COPY(tmp, array_ptr);
        !          3634:                        zval_copy_ctor(tmp);
        !          3635:                        array_ptr = tmp;
        !          3636:                } else {
        !          3637:                        Z_ADDREF_P(array_ptr);
        !          3638:                }
        !          3639:        }
        !          3640: 
        !          3641:        if (ce && ce->get_iterator) {
        !          3642:                iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
        !          3643: 
        !          3644:                if (iter && !EG(exception)) {
        !          3645:                        array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
        !          3646:                } else {
        !          3647:                        if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
        !          3648:                                FREE_OP1_VAR_PTR();
        !          3649:                        } else {
        !          3650:                                FREE_OP1_IF_VAR();
        !          3651:                        }
        !          3652:                        if (!EG(exception)) {
        !          3653:                                zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
        !          3654:                        }
        !          3655:                        zend_throw_exception_internal(NULL TSRMLS_CC);
        !          3656:                        ZEND_VM_NEXT_OPCODE();
        !          3657:                }
        !          3658:        }
        !          3659: 
        !          3660:        AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
        !          3661:        PZVAL_LOCK(array_ptr);
        !          3662: 
        !          3663:        if (iter) {
        !          3664:                iter->index = 0;
        !          3665:                if (iter->funcs->rewind) {
        !          3666:                        iter->funcs->rewind(iter TSRMLS_CC);
        !          3667:                        if (EG(exception)) {
        !          3668:                                Z_DELREF_P(array_ptr);
        !          3669:                                zval_ptr_dtor(&array_ptr);
        !          3670:                                if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
        !          3671:                                        FREE_OP1_VAR_PTR();
        !          3672:                                } else {
        !          3673:                                        FREE_OP1_IF_VAR();
        !          3674:                                }
        !          3675:                                ZEND_VM_NEXT_OPCODE();
        !          3676:                        }
        !          3677:                }
        !          3678:                is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
        !          3679:                if (EG(exception)) {
        !          3680:                        Z_DELREF_P(array_ptr);
        !          3681:                        zval_ptr_dtor(&array_ptr);
        !          3682:                        if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
        !          3683:                                FREE_OP1_VAR_PTR();
        !          3684:                        } else {
        !          3685:                                FREE_OP1_IF_VAR();
        !          3686:                        }
        !          3687:                        ZEND_VM_NEXT_OPCODE();
        !          3688:                }
        !          3689:                iter->index = -1; /* will be set to 0 before using next handler */
        !          3690:        } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
        !          3691:                zend_hash_internal_pointer_reset(fe_ht);
        !          3692:                if (ce) {
        !          3693:                        zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
        !          3694:                        while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
        !          3695:                                char *str_key;
        !          3696:                                uint str_key_len;
        !          3697:                                ulong int_key;
        !          3698:                                zend_uchar key_type;
        !          3699: 
        !          3700:                                key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
        !          3701:                                if (key_type != HASH_KEY_NON_EXISTANT &&
        !          3702:                                        (key_type == HASH_KEY_IS_LONG ||
        !          3703:                                     zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
        !          3704:                                        break;
        !          3705:                                }
        !          3706:                                zend_hash_move_forward(fe_ht);
        !          3707:                        }
        !          3708:                }
        !          3709:                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
        !          3710:                zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
        !          3711:        } else {
        !          3712:                zend_error(E_WARNING, "Invalid argument supplied for foreach()");
        !          3713:                is_empty = 1;
        !          3714:        }
        !          3715: 
        !          3716:        if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
        !          3717:                FREE_OP1_VAR_PTR();
        !          3718:        } else {
        !          3719:                FREE_OP1_IF_VAR();
        !          3720:        }
        !          3721:        if (is_empty) {
        !          3722:                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3723:        } else {
        !          3724:                ZEND_VM_NEXT_OPCODE();
        !          3725:        }
        !          3726: }
        !          3727: 
        !          3728: ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY)
        !          3729: {
        !          3730:        zend_op *opline = EX(opline);
        !          3731:        zend_free_op free_op1;
        !          3732:        zval *array = EX_T(opline->op1.u.var).var.ptr;
        !          3733:        zval **value;
        !          3734:        char *str_key;
        !          3735:        uint str_key_len;
        !          3736:        ulong int_key;
        !          3737:        HashTable *fe_ht;
        !          3738:        zend_object_iterator *iter = NULL;
        !          3739:        int key_type = 0;
        !          3740:        zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY);
        !          3741: 
        !          3742:        switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) {
        !          3743:                default:
        !          3744:                case ZEND_ITER_INVALID:
        !          3745:                        zend_error(E_WARNING, "Invalid argument supplied for foreach()");
        !          3746:                        ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3747: 
        !          3748:                case ZEND_ITER_PLAIN_OBJECT: {
        !          3749:                        char *class_name, *prop_name;
        !          3750:                        zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
        !          3751: 
        !          3752:                        fe_ht = HASH_OF(array);
        !          3753:                        zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
        !          3754:                        do {
        !          3755:                                if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
        !          3756:                                        /* reached end of iteration */
        !          3757:                                        ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3758:                                }
        !          3759:                                key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
        !          3760: 
        !          3761:                                zend_hash_move_forward(fe_ht);
        !          3762:                        } while (key_type == HASH_KEY_NON_EXISTANT ||
        !          3763:                                 (key_type != HASH_KEY_IS_LONG &&
        !          3764:                                  zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS));
        !          3765:                        zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
        !          3766:                        if (use_key && key_type != HASH_KEY_IS_LONG) {
        !          3767:                                zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name);
        !          3768:                                str_key_len = strlen(prop_name);
        !          3769:                                str_key = estrndup(prop_name, str_key_len);
        !          3770:                                str_key_len++;
        !          3771:                        }
        !          3772:                        break;
        !          3773:                }
        !          3774: 
        !          3775:                case ZEND_ITER_PLAIN_ARRAY:
        !          3776:                        fe_ht = HASH_OF(array);
        !          3777:                        zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
        !          3778:                        if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
        !          3779:                                /* reached end of iteration */
        !          3780:                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3781:                        }
        !          3782:                        if (use_key) {
        !          3783:                                key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
        !          3784:                        }
        !          3785:                        zend_hash_move_forward(fe_ht);
        !          3786:                        zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
        !          3787:                        break;
        !          3788: 
        !          3789:                case ZEND_ITER_OBJECT:
        !          3790:                        /* !iter happens from exception */
        !          3791:                        if (iter && ++iter->index > 0) {
        !          3792:                                /* This could cause an endless loop if index becomes zero again.
        !          3793:                                 * In case that ever happens we need an additional flag. */
        !          3794:                                iter->funcs->move_forward(iter TSRMLS_CC);
        !          3795:                                if (EG(exception)) {
        !          3796:                                        Z_DELREF_P(array);
        !          3797:                                        zval_ptr_dtor(&array);
        !          3798:                                        ZEND_VM_NEXT_OPCODE();
        !          3799:                                }
        !          3800:                        }
        !          3801:                        /* If index is zero we come from FE_RESET and checked valid() already. */
        !          3802:                        if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
        !          3803:                                /* reached end of iteration */
        !          3804:                                if (EG(exception)) {
        !          3805:                                        Z_DELREF_P(array);
        !          3806:                                        zval_ptr_dtor(&array);
        !          3807:                                        ZEND_VM_NEXT_OPCODE();
        !          3808:                                }
        !          3809:                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3810:                        }
        !          3811:                        iter->funcs->get_current_data(iter, &value TSRMLS_CC);
        !          3812:                        if (EG(exception)) {
        !          3813:                                Z_DELREF_P(array);
        !          3814:                                zval_ptr_dtor(&array);
        !          3815:                                ZEND_VM_NEXT_OPCODE();
        !          3816:                        }
        !          3817:                        if (!value) {
        !          3818:                                /* failure in get_current_data */
        !          3819:                                ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
        !          3820:                        }
        !          3821:                        if (use_key) {
        !          3822:                                if (iter->funcs->get_current_key) {
        !          3823:                                        key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
        !          3824:                                        if (EG(exception)) {
        !          3825:                                                Z_DELREF_P(array);
        !          3826:                                                zval_ptr_dtor(&array);
        !          3827:                                                ZEND_VM_NEXT_OPCODE();
        !          3828:                                        }
        !          3829:                                } else {
        !          3830:                                        key_type = HASH_KEY_IS_LONG;
        !          3831:                                        int_key = iter->index;
        !          3832:                                }
        !          3833:                        }
        !          3834:                        break;
        !          3835:        }
        !          3836: 
        !          3837:        if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
        !          3838:                SEPARATE_ZVAL_IF_NOT_REF(value);
        !          3839:                Z_SET_ISREF_PP(value);
        !          3840:                EX_T(opline->result.u.var).var.ptr_ptr = value;
        !          3841:                Z_ADDREF_PP(value);
        !          3842:        } else {
        !          3843:                AI_SET_PTR(EX_T(opline->result.u.var).var, *value);
        !          3844:                PZVAL_LOCK(*value);
        !          3845:        }
        !          3846: 
        !          3847:        if (use_key) {
        !          3848:                zend_op *op_data = opline+1;
        !          3849:                zval *key = &EX_T(op_data->result.u.var).tmp_var;
        !          3850: 
        !          3851:                switch (key_type) {
        !          3852:                        case HASH_KEY_IS_STRING:
        !          3853:                                Z_STRVAL_P(key) = str_key;
        !          3854:                                Z_STRLEN_P(key) = str_key_len-1;
        !          3855:                                Z_TYPE_P(key) = IS_STRING;
        !          3856:                                break;
        !          3857:                        case HASH_KEY_IS_LONG:
        !          3858:                                Z_LVAL_P(key) = int_key;
        !          3859:                                Z_TYPE_P(key) = IS_LONG;
        !          3860:                                break;
        !          3861:                        default:
        !          3862:                        case HASH_KEY_NON_EXISTANT:
        !          3863:                                ZVAL_NULL(key);
        !          3864:                                break;
        !          3865:                }
        !          3866:        }
        !          3867: 
        !          3868:        ZEND_VM_INC_OPCODE();
        !          3869:        ZEND_VM_NEXT_OPCODE();
        !          3870: }
        !          3871: 
        !          3872: ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, ANY)
        !          3873: {
        !          3874:        zend_op *opline = EX(opline);
        !          3875:        zval **value;
        !          3876:        zend_bool isset = 1;
        !          3877: 
        !          3878:        if (OP1_TYPE == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
        !          3879:                if (EX(CVs)[opline->op1.u.var]) {
        !          3880:                        value = EX(CVs)[opline->op1.u.var];
        !          3881:                } else if (EG(active_symbol_table)) {
        !          3882:                        zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
        !          3883: 
        !          3884:                        if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
        !          3885:                                isset = 0;
        !          3886:                        }
        !          3887:                } else {                
        !          3888:                        isset = 0;
        !          3889:                }
        !          3890:        } else {
        !          3891:                HashTable *target_symbol_table;
        !          3892:                zend_free_op free_op1;
        !          3893:                zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
        !          3894: 
        !          3895:                if (Z_TYPE_P(varname) != IS_STRING) {
        !          3896:                        tmp = *varname;
        !          3897:                        zval_copy_ctor(&tmp);
        !          3898:                        convert_to_string(&tmp);
        !          3899:                        varname = &tmp;
        !          3900:                }
        !          3901: 
        !          3902:                if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
        !          3903:                        value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
        !          3904:                        if (!value) {
        !          3905:                                isset = 0;
        !          3906:                        }
        !          3907:                } else {
        !          3908:                        target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
        !          3909:                        if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
        !          3910:                                isset = 0;
        !          3911:                        }
        !          3912:                }
        !          3913: 
        !          3914:                if (varname == &tmp) {
        !          3915:                        zval_dtor(&tmp);
        !          3916:                }
        !          3917:                FREE_OP1();
        !          3918:        }
        !          3919: 
        !          3920:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
        !          3921: 
        !          3922:        switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
        !          3923:                case ZEND_ISSET:
        !          3924:                        if (isset && Z_TYPE_PP(value) == IS_NULL) {
        !          3925:                                Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
        !          3926:                        } else {
        !          3927:                                Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
        !          3928:                        }
        !          3929:                        break;
        !          3930:                case ZEND_ISEMPTY:
        !          3931:                        if (!isset || !i_zend_is_true(*value)) {
        !          3932:                                Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
        !          3933:                        } else {
        !          3934:                                Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
        !          3935:                        }
        !          3936:                        break;
        !          3937:        }
        !          3938: 
        !          3939:        ZEND_VM_NEXT_OPCODE();
        !          3940: }
        !          3941: 
        !          3942: ZEND_VM_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, VAR|UNUSED|CV, CONST|TMP|VAR|CV, int prop_dim)
        !          3943: {
        !          3944:        zend_op *opline = EX(opline);
        !          3945:        zend_free_op free_op1;
        !          3946:        zval **container = GET_OP1_OBJ_ZVAL_PTR_PTR(BP_VAR_IS);
        !          3947:        zval **value = NULL;
        !          3948:        int result = 0;
        !          3949: 
        !          3950:        if (OP1_TYPE != IS_VAR || container) {
        !          3951:                zend_free_op free_op2;
        !          3952:                zval *offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          3953: 
        !          3954:                if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
        !          3955:                        HashTable *ht;
        !          3956:                        int isset = 0;
        !          3957: 
        !          3958:                        ht = Z_ARRVAL_PP(container);
        !          3959: 
        !          3960:                        switch (Z_TYPE_P(offset)) {
        !          3961:                                case IS_DOUBLE:
        !          3962:                                        if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
        !          3963:                                                isset = 1;
        !          3964:                                        }
        !          3965:                                        break;
        !          3966:                                case IS_RESOURCE:
        !          3967:                                case IS_BOOL:
        !          3968:                                case IS_LONG:
        !          3969:                                        if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
        !          3970:                                                isset = 1;
        !          3971:                                        }
        !          3972:                                        break;
        !          3973:                                case IS_STRING:
        !          3974:                                        if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
        !          3975:                                                isset = 1;
        !          3976:                                        }
        !          3977:                                        break;
        !          3978:                                case IS_NULL:
        !          3979:                                        if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
        !          3980:                                                isset = 1;
        !          3981:                                        }
        !          3982:                                        break;
        !          3983:                                default:
        !          3984:                                        zend_error(E_WARNING, "Illegal offset type in isset or empty");
        !          3985: 
        !          3986:                                        break;
        !          3987:                        }
        !          3988: 
        !          3989:                        switch (opline->extended_value) {
        !          3990:                                case ZEND_ISSET:
        !          3991:                                        if (isset && Z_TYPE_PP(value) == IS_NULL) {
        !          3992:                                                result = 0;
        !          3993:                                        } else {
        !          3994:                                                result = isset;
        !          3995:                                        }
        !          3996:                                        break;
        !          3997:                                case ZEND_ISEMPTY:
        !          3998:                                        if (!isset || !i_zend_is_true(*value)) {
        !          3999:                                                result = 0;
        !          4000:                                        } else {
        !          4001:                                                result = 1;
        !          4002:                                        }
        !          4003:                                        break;
        !          4004:                        }
        !          4005:                        FREE_OP2();
        !          4006:                } else if (Z_TYPE_PP(container) == IS_OBJECT) {
        !          4007:                        if (IS_OP2_TMP_FREE()) {
        !          4008:                                MAKE_REAL_ZVAL_PTR(offset);
        !          4009:                        }
        !          4010:                        if (prop_dim) {
        !          4011:                                if (Z_OBJ_HT_P(*container)->has_property) {
        !          4012:                                        result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
        !          4013:                                } else {
        !          4014:                                        zend_error(E_NOTICE, "Trying to check property of non-object");
        !          4015:                                        result = 0;
        !          4016:                                }
        !          4017:                        } else {
        !          4018:                                if (Z_OBJ_HT_P(*container)->has_dimension) {
        !          4019:                                        result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
        !          4020:                                } else {
        !          4021:                                        zend_error(E_NOTICE, "Trying to check element of non-array");
        !          4022:                                        result = 0;
        !          4023:                                }
        !          4024:                        }
        !          4025:                        if (IS_OP2_TMP_FREE()) {
        !          4026:                                zval_ptr_dtor(&offset);
        !          4027:                        } else {
        !          4028:                                FREE_OP2();
        !          4029:                        }
        !          4030:                } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
        !          4031:                        zval tmp;
        !          4032: 
        !          4033:                        if (Z_TYPE_P(offset) != IS_LONG) {
        !          4034:                                tmp = *offset;
        !          4035:                                zval_copy_ctor(&tmp);
        !          4036:                                convert_to_long(&tmp);
        !          4037:                                offset = &tmp;
        !          4038:                        }
        !          4039:                        if (Z_TYPE_P(offset) == IS_LONG) {
        !          4040:                                switch (opline->extended_value) {
        !          4041:                                        case ZEND_ISSET:
        !          4042:                                                if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
        !          4043:                                                        result = 1;
        !          4044:                                                }
        !          4045:                                                break;
        !          4046:                                        case ZEND_ISEMPTY:
        !          4047:                                                if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
        !          4048:                                                        result = 1;
        !          4049:                                                }
        !          4050:                                                break;
        !          4051:                                }
        !          4052:                        }
        !          4053:                        FREE_OP2();
        !          4054:                } else {
        !          4055:                        FREE_OP2();
        !          4056:                }
        !          4057:        }
        !          4058: 
        !          4059:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
        !          4060: 
        !          4061:        switch (opline->extended_value) {
        !          4062:                case ZEND_ISSET:
        !          4063:                        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
        !          4064:                        break;
        !          4065:                case ZEND_ISEMPTY:
        !          4066:                        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
        !          4067:                        break;
        !          4068:        }
        !          4069: 
        !          4070:        FREE_OP1_VAR_PTR();
        !          4071: 
        !          4072:        ZEND_VM_NEXT_OPCODE();
        !          4073: }
        !          4074: 
        !          4075: ZEND_VM_HANDLER(115, ZEND_ISSET_ISEMPTY_DIM_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          4076: {
        !          4077:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, prop_dim, 0);
        !          4078: }
        !          4079: 
        !          4080: ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, VAR|UNUSED|CV, CONST|TMP|VAR|CV)
        !          4081: {
        !          4082:        ZEND_VM_DISPATCH_TO_HELPER_EX(zend_isset_isempty_dim_prop_obj_handler, prop_dim, 1);
        !          4083: }
        !          4084: 
        !          4085: ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMP|VAR|UNUSED|CV, ANY)
        !          4086: {
        !          4087: #if !defined(ZEND_VM_SPEC) || (OP1_TYPE != IS_UNUSED)
        !          4088:        zend_op *opline = EX(opline);
        !          4089:        if (OP1_TYPE != IS_UNUSED) {
        !          4090:                zend_free_op free_op1;
        !          4091:                zval *ptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          4092: 
        !          4093:                if (Z_TYPE_P(ptr) == IS_LONG) {
        !          4094:                        EG(exit_status) = Z_LVAL_P(ptr);
        !          4095:                } else {
        !          4096:                        zend_print_variable(ptr);
        !          4097:                }
        !          4098:                FREE_OP1();
        !          4099:        }
        !          4100: #endif
        !          4101:        zend_bailout();
        !          4102:        ZEND_VM_NEXT_OPCODE();
        !          4103: }
        !          4104: 
        !          4105: ZEND_VM_HANDLER(57, ZEND_BEGIN_SILENCE, ANY, ANY)
        !          4106: {
        !          4107:        zend_op *opline = EX(opline);
        !          4108: 
        !          4109:        Z_LVAL(EX_T(opline->result.u.var).tmp_var) = EG(error_reporting);
        !          4110:        Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;  /* shouldn't be necessary */
        !          4111:        if (EX(old_error_reporting) == NULL) {
        !          4112:                EX(old_error_reporting) = &EX_T(opline->result.u.var).tmp_var;
        !          4113:        }
        !          4114: 
        !          4115:        if (EG(error_reporting)) {
        !          4116:                zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
        !          4117:        }
        !          4118:        ZEND_VM_NEXT_OPCODE();
        !          4119: }
        !          4120: 
        !          4121: ZEND_VM_HANDLER(142, ZEND_RAISE_ABSTRACT_ERROR, ANY, ANY)
        !          4122: {
        !          4123:        zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", EG(scope)->name, EX(op_array)->function_name);
        !          4124:        ZEND_VM_NEXT_OPCODE(); /* Never reached */
        !          4125: }
        !          4126: 
        !          4127: ZEND_VM_HANDLER(58, ZEND_END_SILENCE, TMP, ANY)
        !          4128: {
        !          4129:        zend_op *opline = EX(opline);
        !          4130:        zval restored_error_reporting;
        !          4131: 
        !          4132:        if (!EG(error_reporting) && Z_LVAL(EX_T(opline->op1.u.var).tmp_var) != 0) {
        !          4133:                Z_TYPE(restored_error_reporting) = IS_LONG;
        !          4134:                Z_LVAL(restored_error_reporting) = Z_LVAL(EX_T(opline->op1.u.var).tmp_var);
        !          4135:                convert_to_string(&restored_error_reporting);
        !          4136:                zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), Z_STRVAL(restored_error_reporting), Z_STRLEN(restored_error_reporting), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
        !          4137:                zendi_zval_dtor(restored_error_reporting);
        !          4138:        }
        !          4139:        if (EX(old_error_reporting) == &EX_T(opline->op1.u.var).tmp_var) {
        !          4140:                EX(old_error_reporting) = NULL;
        !          4141:        }
        !          4142:        ZEND_VM_NEXT_OPCODE();
        !          4143: }
        !          4144: 
        !          4145: ZEND_VM_HANDLER(152, ZEND_JMP_SET, CONST|TMP|VAR|CV, ANY)
        !          4146: {
        !          4147:        zend_op *opline = EX(opline);
        !          4148:        zend_free_op free_op1;
        !          4149:        zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          4150: 
        !          4151:        if (i_zend_is_true(value)) {
        !          4152:                EX_T(opline->result.u.var).tmp_var = *value;
        !          4153:                zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
        !          4154:                FREE_OP1();
        !          4155: #if DEBUG_ZEND>=2
        !          4156:                printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
        !          4157: #endif
        !          4158:                ZEND_VM_JMP(opline->op2.u.jmp_addr);
        !          4159:        }
        !          4160: 
        !          4161:        FREE_OP1();
        !          4162:        ZEND_VM_NEXT_OPCODE();
        !          4163: }
        !          4164: 
        !          4165: ZEND_VM_HANDLER(22, ZEND_QM_ASSIGN, CONST|TMP|VAR|CV, ANY)
        !          4166: {
        !          4167:        zend_op *opline = EX(opline);
        !          4168:        zend_free_op free_op1;
        !          4169:        zval *value = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          4170: 
        !          4171:        EX_T(opline->result.u.var).tmp_var = *value;
        !          4172:        if (!IS_OP1_TMP_FREE()) {
        !          4173:                zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
        !          4174:        }
        !          4175:        FREE_OP1_IF_VAR();
        !          4176:        ZEND_VM_NEXT_OPCODE();
        !          4177: }
        !          4178: 
        !          4179: ZEND_VM_HANDLER(101, ZEND_EXT_STMT, ANY, ANY)
        !          4180: {
        !          4181:        if (!EG(no_extensions)) {
        !          4182:                zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(op_array) TSRMLS_CC);
        !          4183:        }
        !          4184:        ZEND_VM_NEXT_OPCODE();
        !          4185: }
        !          4186: 
        !          4187: ZEND_VM_HANDLER(102, ZEND_EXT_FCALL_BEGIN, ANY, ANY)
        !          4188: {
        !          4189:        if (!EG(no_extensions)) {
        !          4190:                zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(op_array) TSRMLS_CC);
        !          4191:        }
        !          4192:        ZEND_VM_NEXT_OPCODE();
        !          4193: }
        !          4194: 
        !          4195: ZEND_VM_HANDLER(103, ZEND_EXT_FCALL_END, ANY, ANY)
        !          4196: {
        !          4197:        if (!EG(no_extensions)) {
        !          4198:                zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(op_array) TSRMLS_CC);
        !          4199:        }
        !          4200:        ZEND_VM_NEXT_OPCODE();
        !          4201: }
        !          4202: 
        !          4203: ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, ANY, ANY)
        !          4204: {
        !          4205:        zend_op *opline = EX(opline);
        !          4206: 
        !          4207:        EX_T(opline->result.u.var).class_entry = do_bind_class(opline, EG(class_table), 0 TSRMLS_CC);
        !          4208:        ZEND_VM_NEXT_OPCODE();
        !          4209: }
        !          4210: 
        !          4211: ZEND_VM_HANDLER(140, ZEND_DECLARE_INHERITED_CLASS, ANY, ANY)
        !          4212: {
        !          4213:        zend_op *opline = EX(opline);
        !          4214: 
        !          4215:        EX_T(opline->result.u.var).class_entry = do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
        !          4216:        ZEND_VM_NEXT_OPCODE();
        !          4217: }
        !          4218: 
        !          4219: ZEND_VM_HANDLER(145, ZEND_DECLARE_INHERITED_CLASS_DELAYED, ANY, ANY)
        !          4220: {
        !          4221:        zend_op *opline = EX(opline);
        !          4222:        zend_class_entry **pce, **pce_orig;
        !          4223: 
        !          4224:        if (zend_hash_find(EG(class_table), Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void**)&pce) == FAILURE ||
        !          4225:            (zend_hash_find(EG(class_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), (void**)&pce_orig) == SUCCESS &&
        !          4226:             *pce != *pce_orig)) {
        !          4227:                do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
        !          4228:        }
        !          4229:        ZEND_VM_NEXT_OPCODE();
        !          4230: }
        !          4231: 
        !          4232: ZEND_VM_HANDLER(141, ZEND_DECLARE_FUNCTION, ANY, ANY)
        !          4233: {
        !          4234:        do_bind_function(EX(opline), EG(function_table), 0);
        !          4235:        ZEND_VM_NEXT_OPCODE();
        !          4236: }
        !          4237: 
        !          4238: ZEND_VM_HANDLER(105, ZEND_TICKS, CONST, ANY)
        !          4239: {
        !          4240:        zend_op *opline = EX(opline);
        !          4241: 
        !          4242:        if (++EG(ticks_count)>=Z_LVAL(opline->op1.u.constant)) {
        !          4243:                EG(ticks_count)=0;
        !          4244:                if (zend_ticks_function) {
        !          4245:                        zend_ticks_function(Z_LVAL(opline->op1.u.constant));
        !          4246:                }
        !          4247:        }
        !          4248:        ZEND_VM_NEXT_OPCODE();
        !          4249: }
        !          4250: 
        !          4251: ZEND_VM_HANDLER(138, ZEND_INSTANCEOF, TMP|VAR|CV, ANY)
        !          4252: {
        !          4253:        zend_op *opline = EX(opline);
        !          4254:        zend_free_op free_op1;
        !          4255:        zval *expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          4256:        zend_bool result;
        !          4257: 
        !          4258:        if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
        !          4259:                result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.u.var).class_entry TSRMLS_CC);
        !          4260:        } else {
        !          4261:                result = 0;
        !          4262:        }
        !          4263:        ZVAL_BOOL(&EX_T(opline->result.u.var).tmp_var, result);
        !          4264:        FREE_OP1();
        !          4265:        ZEND_VM_NEXT_OPCODE();
        !          4266: }
        !          4267: 
        !          4268: ZEND_VM_HANDLER(104, ZEND_EXT_NOP, ANY, ANY)
        !          4269: {
        !          4270:        ZEND_VM_NEXT_OPCODE();
        !          4271: }
        !          4272: 
        !          4273: ZEND_VM_HANDLER(0, ZEND_NOP, ANY, ANY)
        !          4274: {
        !          4275:        ZEND_VM_NEXT_OPCODE();
        !          4276: }
        !          4277: 
        !          4278: ZEND_VM_HANDLER(144, ZEND_ADD_INTERFACE, ANY, CONST)
        !          4279: {
        !          4280:        zend_op *opline = EX(opline);
        !          4281:        zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
        !          4282:        zend_class_entry *iface = zend_fetch_class(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
        !          4283: 
        !          4284:        if (iface) {
        !          4285:                if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
        !          4286:                        zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
        !          4287:                }
        !          4288:                zend_do_implement_interface(ce, iface TSRMLS_CC);
        !          4289:        }
        !          4290: 
        !          4291:        ZEND_VM_NEXT_OPCODE();
        !          4292: }
        !          4293: 
        !          4294: ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
        !          4295: {
        !          4296:        zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes;
        !          4297:        int i;
        !          4298:        zend_uint catch_op_num;
        !          4299:        int catched = 0;
        !          4300:        zval restored_error_reporting;
        !          4301:  
        !          4302:        void **stack_frame = (void**)(((char*)EX(Ts)) +
        !          4303:                (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * EX(op_array)->T));
        !          4304: 
        !          4305:        while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
        !          4306:                zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
        !          4307:                zval_ptr_dtor(&stack_zval_p);
        !          4308:        }
        !          4309: 
        !          4310:        for (i=0; i<EG(active_op_array)->last_try_catch; i++) {
        !          4311:                if (EG(active_op_array)->try_catch_array[i].try_op > op_num) {
        !          4312:                        /* further blocks will not be relevant... */
        !          4313:                        break;
        !          4314:                }
        !          4315:                if (op_num >= EG(active_op_array)->try_catch_array[i].try_op
        !          4316:                        && op_num < EG(active_op_array)->try_catch_array[i].catch_op) {
        !          4317:                        catch_op_num = EX(op_array)->try_catch_array[i].catch_op;
        !          4318:                        catched = 1;
        !          4319:                }
        !          4320:        }
        !          4321: 
        !          4322:        while (EX(fbc)) {
        !          4323:                EX(called_scope) = (zend_class_entry*)zend_ptr_stack_pop(&EG(arg_types_stack));
        !          4324:                if (EX(object)) {
        !          4325:                        if (IS_CTOR_CALL(EX(called_scope))) {
        !          4326:                                if (IS_CTOR_USED(EX(called_scope))) {
        !          4327:                                        Z_DELREF_P(EX(object));
        !          4328:                                }
        !          4329:                                if (Z_REFCOUNT_P(EX(object)) == 1) {
        !          4330:                                        zend_object_store_ctor_failed(EX(object) TSRMLS_CC);
        !          4331:                                }
        !          4332:                        }
        !          4333:                        zval_ptr_dtor(&EX(object));
        !          4334:                }
        !          4335:                EX(called_scope) = DECODE_CTOR(EX(called_scope));
        !          4336:                zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
        !          4337:        }
        !          4338: 
        !          4339:        for (i=0; i<EX(op_array)->last_brk_cont; i++) {
        !          4340:                if (EX(op_array)->brk_cont_array[i].start < 0) {
        !          4341:                        continue;
        !          4342:                } else if (EX(op_array)->brk_cont_array[i].start > op_num) {
        !          4343:                        /* further blocks will not be relevant... */
        !          4344:                        break;
        !          4345:                } else if (op_num < EX(op_array)->brk_cont_array[i].brk) {
        !          4346:                        if (!catched ||
        !          4347:                            catch_op_num >= EX(op_array)->brk_cont_array[i].brk) {
        !          4348:                                zend_op *brk_opline = &EX(op_array)->opcodes[EX(op_array)->brk_cont_array[i].brk];
        !          4349: 
        !          4350:                                switch (brk_opline->opcode) {
        !          4351:                                        case ZEND_SWITCH_FREE:
        !          4352:                                                if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
        !          4353:                                                        zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
        !          4354:                                                }
        !          4355:                                                break;
        !          4356:                                        case ZEND_FREE:
        !          4357:                                                if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
        !          4358:                                                        zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
        !          4359:                                                }
        !          4360:                                                break;
        !          4361:                                }
        !          4362:                        }
        !          4363:                }
        !          4364:        }
        !          4365: 
        !          4366:        /* restore previous error_reporting value */
        !          4367:        if (!EG(error_reporting) && EX(old_error_reporting) != NULL && Z_LVAL_P(EX(old_error_reporting)) != 0) {
        !          4368:                Z_TYPE(restored_error_reporting) = IS_LONG;
        !          4369:                Z_LVAL(restored_error_reporting) = Z_LVAL_P(EX(old_error_reporting));
        !          4370:                convert_to_string(&restored_error_reporting);
        !          4371:                zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), Z_STRVAL(restored_error_reporting), Z_STRLEN(restored_error_reporting), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
        !          4372:                zendi_zval_dtor(restored_error_reporting);
        !          4373:        }
        !          4374:        EX(old_error_reporting) = NULL;
        !          4375: 
        !          4376:        if (!catched) {
        !          4377:                ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
        !          4378:        } else {
        !          4379:                ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
        !          4380:                ZEND_VM_CONTINUE();
        !          4381:        }
        !          4382: }
        !          4383: 
        !          4384: ZEND_VM_HANDLER(146, ZEND_VERIFY_ABSTRACT_CLASS, ANY, ANY)
        !          4385: {
        !          4386:        zend_verify_abstract_class(EX_T(EX(opline)->op1.u.var).class_entry TSRMLS_CC);
        !          4387:        ZEND_VM_NEXT_OPCODE();
        !          4388: }
        !          4389: 
        !          4390: ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY)
        !          4391: {
        !          4392:        int ret = zend_user_opcode_handlers[EX(opline)->opcode](ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL);
        !          4393: 
        !          4394:        switch (ret) {
        !          4395:                case ZEND_USER_OPCODE_CONTINUE:
        !          4396:                        ZEND_VM_CONTINUE();
        !          4397:                case ZEND_USER_OPCODE_RETURN:
        !          4398:                        ZEND_VM_DISPATCH_TO_HELPER(zend_leave_helper);
        !          4399:                case ZEND_USER_OPCODE_ENTER:
        !          4400:                        ZEND_VM_ENTER();
        !          4401:                case ZEND_USER_OPCODE_LEAVE:
        !          4402:                        ZEND_VM_LEAVE();
        !          4403:                case ZEND_USER_OPCODE_DISPATCH:
        !          4404:                        ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
        !          4405:                default:
        !          4406:                        ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), EX(opline));
        !          4407:        }
        !          4408: }
        !          4409: 
        !          4410: ZEND_VM_HANDLER(143, ZEND_DECLARE_CONST, CONST, CONST)
        !          4411: {
        !          4412:        zend_op *opline = EX(opline);
        !          4413:        zend_free_op free_op1, free_op2;
        !          4414:        zval *name  = GET_OP1_ZVAL_PTR(BP_VAR_R);
        !          4415:        zval *val   = GET_OP2_ZVAL_PTR(BP_VAR_R);
        !          4416:        zend_constant c;
        !          4417: 
        !          4418:        if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
        !          4419:                zval tmp = *val;
        !          4420:                zval *tmp_ptr = &tmp;
        !          4421: 
        !          4422:                if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
        !          4423:                        zval_copy_ctor(&tmp);
        !          4424:                }
        !          4425:                INIT_PZVAL(&tmp);
        !          4426:                zval_update_constant(&tmp_ptr, NULL TSRMLS_CC);
        !          4427:                c.value = *tmp_ptr;
        !          4428:        } else {
        !          4429:                c.value = *val;
        !          4430:                zval_copy_ctor(&c.value);
        !          4431:        }
        !          4432:        c.flags = CONST_CS; /* non persistent, case sensetive */
        !          4433:        c.name = zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name));
        !          4434:        c.name_len = Z_STRLEN_P(name)+1;
        !          4435:        c.module_number = PHP_USER_CONSTANT;
        !          4436: 
        !          4437:        if (zend_register_constant(&c TSRMLS_CC) == FAILURE) {
        !          4438:        }
        !          4439: 
        !          4440:        FREE_OP1();
        !          4441:        FREE_OP2();
        !          4442:        ZEND_VM_NEXT_OPCODE();
        !          4443: }
        !          4444: 
        !          4445: ZEND_VM_HANDLER(153, ZEND_DECLARE_LAMBDA_FUNCTION, CONST, CONST)
        !          4446: {
        !          4447:        zend_op *opline = EX(opline);
        !          4448:        zend_function *op_array;
        !          4449: 
        !          4450:        if (zend_hash_quick_find(EG(function_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), Z_LVAL(opline->op2.u.constant), (void *) &op_array) == FAILURE ||
        !          4451:            op_array->type != ZEND_USER_FUNCTION) {
        !          4452:                zend_error_noreturn(E_ERROR, "Base lambda function for closure not found");
        !          4453:        }
        !          4454: 
        !          4455:        zend_create_closure(&EX_T(opline->result.u.var).tmp_var, op_array TSRMLS_CC);
        !          4456: 
        !          4457:        ZEND_VM_NEXT_OPCODE();
        !          4458: }
        !          4459: 
        !          4460: ZEND_VM_EXPORT_HELPER(zend_do_fcall, zend_do_fcall_common_helper)

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>