Annotation of embedaddon/php/Zend/zend_vm_execute.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: #ifdef ZEND_WIN32
! 22: # pragma warning(once : 4101)
! 23: #endif
! 24: static user_opcode_handler_t zend_user_opcode_handlers[256] = {(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL,(user_opcode_handler_t)NULL};
! 25:
! 26: static zend_uchar zend_user_opcodes[256] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255};
! 27:
! 28: static opcode_handler_t zend_vm_get_opcode_handler(zend_uchar opcode, zend_op* op);
! 29:
! 30:
! 31: #define ZEND_VM_CONTINUE() return 0
! 32: #define ZEND_VM_RETURN() return 1
! 33: #define ZEND_VM_ENTER() return 2
! 34: #define ZEND_VM_LEAVE() return 3
! 35: #define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 36:
! 37: #define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC
! 38: #undef EX
! 39: #define EX(element) execute_data->element
! 40:
! 41:
! 42: ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
! 43: {
! 44: zend_execute_data *execute_data;
! 45: zend_bool nested = 0;
! 46: zend_bool original_in_execution = EG(in_execution);
! 47:
! 48:
! 49: if (EG(exception)) {
! 50: return;
! 51: }
! 52:
! 53: EG(in_execution) = 1;
! 54:
! 55: zend_vm_enter:
! 56: /* Initialize execute_data */
! 57: execute_data = (zend_execute_data *)zend_vm_stack_alloc(
! 58: ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) +
! 59: ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)) +
! 60: ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * op_array->T TSRMLS_CC);
! 61:
! 62: EX(CVs) = (zval***)((char*)execute_data + ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)));
! 63: memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
! 64: EX(Ts) = (temp_variable *)(((char*)EX(CVs)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)));
! 65: EX(fbc) = NULL;
! 66: EX(called_scope) = NULL;
! 67: EX(object) = NULL;
! 68: EX(old_error_reporting) = NULL;
! 69: EX(op_array) = op_array;
! 70: EX(symbol_table) = EG(active_symbol_table);
! 71: EX(prev_execute_data) = EG(current_execute_data);
! 72: EG(current_execute_data) = execute_data;
! 73: EX(nested) = nested;
! 74: nested = 1;
! 75:
! 76: if (op_array->start_op) {
! 77: ZEND_VM_SET_OPCODE(op_array->start_op);
! 78: } else {
! 79: ZEND_VM_SET_OPCODE(op_array->opcodes);
! 80: }
! 81:
! 82: if (op_array->this_var != -1 && EG(This)) {
! 83: Z_ADDREF_P(EG(This)); /* For $this pointer */
! 84: if (!EG(active_symbol_table)) {
! 85: EX(CVs)[op_array->this_var] = (zval**)EX(CVs) + (op_array->last_var + op_array->this_var);
! 86: *EX(CVs)[op_array->this_var] = EG(This);
! 87: } else {
! 88: if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), (void**)&EX(CVs)[op_array->this_var])==FAILURE) {
! 89: Z_DELREF_P(EG(This));
! 90: }
! 91: }
! 92: }
! 93:
! 94: EG(opline_ptr) = &EX(opline);
! 95:
! 96: EX(function_state).function = (zend_function *) op_array;
! 97: EX(function_state).arguments = NULL;
! 98:
! 99: while (1) {
! 100: int ret;
! 101: #ifdef ZEND_WIN32
! 102: if (EG(timed_out)) {
! 103: zend_timeout(0);
! 104: }
! 105: #endif
! 106:
! 107: if ((ret = EX(opline)->handler(execute_data TSRMLS_CC)) > 0) {
! 108: switch (ret) {
! 109: case 1:
! 110: EG(in_execution) = original_in_execution;
! 111: return;
! 112: case 2:
! 113: op_array = EG(active_op_array);
! 114: goto zend_vm_enter;
! 115: case 3:
! 116: execute_data = EG(current_execute_data);
! 117: default:
! 118: break;
! 119: }
! 120: }
! 121:
! 122: }
! 123: zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen");
! 124: }
! 125:
! 126: static int ZEND_FASTCALL ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 127: {
! 128: #if DEBUG_ZEND>=2
! 129: printf("Jumping to %d\n", EX(opline)->op1.u.opline_num);
! 130: #endif
! 131: ZEND_VM_SET_OPCODE(EX(opline)->op1.u.jmp_addr);
! 132: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 133: }
! 134:
! 135: static int ZEND_FASTCALL ZEND_INIT_STRING_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 136: {
! 137: zval *tmp = &EX_T(EX(opline)->result.u.var).tmp_var;
! 138:
! 139: tmp->value.str.val = emalloc(1);
! 140: tmp->value.str.val[0] = 0;
! 141: tmp->value.str.len = 0;
! 142: Z_SET_REFCOUNT_P(tmp, 1);
! 143: tmp->type = IS_STRING;
! 144: Z_UNSET_ISREF_P(tmp);
! 145: ZEND_VM_NEXT_OPCODE();
! 146: }
! 147:
! 148: static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
! 149: {
! 150: zend_bool nested;
! 151: zend_op_array *op_array = EX(op_array);
! 152:
! 153: EG(current_execute_data) = EX(prev_execute_data);
! 154: EG(opline_ptr) = NULL;
! 155: if (!EG(active_symbol_table)) {
! 156: zval ***cv = EX(CVs);
! 157: zval ***end = cv + EX(op_array)->last_var;
! 158: while (cv != end) {
! 159: if (*cv) {
! 160: zval_ptr_dtor(*cv);
! 161: }
! 162: cv++;
! 163: }
! 164: }
! 165:
! 166: if ((op_array->fn_flags & ZEND_ACC_CLOSURE) && op_array->prototype) {
! 167: zval_ptr_dtor((zval**)&op_array->prototype);
! 168: }
! 169:
! 170: nested = EX(nested);
! 171:
! 172: zend_vm_stack_free(execute_data TSRMLS_CC);
! 173:
! 174: if (nested) {
! 175: execute_data = EG(current_execute_data);
! 176:
! 177: if (EX(call_opline)->opcode == ZEND_INCLUDE_OR_EVAL) {
! 178:
! 179: EX(function_state).function = (zend_function *) EX(op_array);
! 180: EX(function_state).arguments = NULL;
! 181: EX(object) = EX(current_object);
! 182:
! 183: if (RETURN_VALUE_USED(EX(call_opline))) {
! 184: if (!EX_T(EX(call_opline)->result.u.var).var.ptr) { /* there was no return statement */
! 185: ALLOC_ZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
! 186: INIT_PZVAL(EX_T(EX(call_opline)->result.u.var).var.ptr);
! 187: Z_LVAL_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = 1;
! 188: Z_TYPE_P(EX_T(EX(call_opline)->result.u.var).var.ptr) = IS_BOOL;
! 189: }
! 190: }
! 191:
! 192: EG(opline_ptr) = &EX(opline);
! 193: EG(active_op_array) = EX(op_array);
! 194: EG(return_value_ptr_ptr) = EX(original_return_value);
! 195: destroy_op_array(op_array TSRMLS_CC);
! 196: efree(op_array);
! 197: if (EG(exception)) {
! 198: zend_throw_exception_internal(NULL TSRMLS_CC);
! 199: }
! 200:
! 201: EX(opline)++;
! 202: ZEND_VM_LEAVE();
! 203: } else {
! 204:
! 205: EG(opline_ptr) = &EX(opline);
! 206: EG(active_op_array) = EX(op_array);
! 207: EG(return_value_ptr_ptr) = EX(original_return_value);
! 208: if (EG(active_symbol_table)) {
! 209: if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
! 210: zend_hash_destroy(EG(active_symbol_table));
! 211: FREE_HASHTABLE(EG(active_symbol_table));
! 212: } else {
! 213: /* clean before putting into the cache, since clean
! 214: could call dtors, which could use cached hash */
! 215: zend_hash_clean(EG(active_symbol_table));
! 216: *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
! 217: }
! 218: }
! 219: EG(active_symbol_table) = EX(symbol_table);
! 220:
! 221: EX(function_state).function = (zend_function *) EX(op_array);
! 222: EX(function_state).arguments = NULL;
! 223:
! 224: if (EG(This)) {
! 225: if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
! 226: if (IS_CTOR_USED(EX(called_scope))) {
! 227: Z_DELREF_P(EG(This));
! 228: }
! 229: if (Z_REFCOUNT_P(EG(This)) == 1) {
! 230: zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
! 231: }
! 232: }
! 233: zval_ptr_dtor(&EG(This));
! 234: }
! 235: EG(This) = EX(current_this);
! 236: EG(scope) = EX(current_scope);
! 237: EG(called_scope) = EX(current_called_scope);
! 238:
! 239: EX(object) = EX(current_object);
! 240: EX(called_scope) = DECODE_CTOR(EX(called_scope));
! 241:
! 242: zend_vm_stack_clear_multiple(TSRMLS_C);
! 243:
! 244: if (EG(exception)) {
! 245: zend_throw_exception_internal(NULL TSRMLS_CC);
! 246: if (RETURN_VALUE_USED(EX(call_opline)) && EX_T(EX(call_opline)->result.u.var).var.ptr) {
! 247: zval_ptr_dtor(&EX_T(EX(call_opline)->result.u.var).var.ptr);
! 248: }
! 249: }
! 250:
! 251: EX(opline)++;
! 252: ZEND_VM_LEAVE();
! 253: }
! 254: }
! 255: ZEND_VM_RETURN();
! 256: }
! 257:
! 258: static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
! 259: {
! 260: zend_op *opline = EX(opline);
! 261: zend_bool should_change_scope = 0;
! 262:
! 263: if (EX(function_state).function->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) {
! 264: if (EX(function_state).function->common.fn_flags & ZEND_ACC_ABSTRACT) {
! 265: 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);
! 266: ZEND_VM_NEXT_OPCODE(); /* Never reached */
! 267: }
! 268: if (EX(function_state).function->common.fn_flags & ZEND_ACC_DEPRECATED) {
! 269: zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
! 270: EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name : "",
! 271: EX(function_state).function->common.scope ? "::" : "",
! 272: EX(function_state).function->common.function_name);
! 273: }
! 274: }
! 275: if (EX(function_state).function->common.scope &&
! 276: !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC) &&
! 277: !EX(object)) {
! 278:
! 279: if (EX(function_state).function->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 280: /* FIXME: output identifiers properly */
! 281: 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);
! 282: } else {
! 283: /* FIXME: output identifiers properly */
! 284: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 285: 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);
! 286: }
! 287: }
! 288:
! 289: if (EX(function_state).function->type == ZEND_USER_FUNCTION ||
! 290: EX(function_state).function->common.scope) {
! 291: should_change_scope = 1;
! 292: EX(current_this) = EG(This);
! 293: EX(current_scope) = EG(scope);
! 294: EX(current_called_scope) = EG(called_scope);
! 295: EG(This) = EX(object);
! 296: EG(scope) = (EX(function_state).function->type == ZEND_USER_FUNCTION || !EX(object)) ? EX(function_state).function->common.scope : NULL;
! 297: EG(called_scope) = EX(called_scope);
! 298: }
! 299:
! 300: zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
! 301: EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
! 302:
! 303: if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
! 304: ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 305: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 306: EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
! 307:
! 308: if (EX(function_state).function->common.arg_info) {
! 309: zend_uint i=0;
! 310: zval **p = (zval**)EX(function_state).arguments;
! 311: ulong arg_count = opline->extended_value;
! 312:
! 313: while (arg_count>0) {
! 314: zend_verify_arg_type(EX(function_state).function, ++i, *(p-arg_count), 0 TSRMLS_CC);
! 315: arg_count--;
! 316: }
! 317: }
! 318: if (!zend_execute_internal) {
! 319: /* saves one function call if zend_execute_internal is not used */
! 320: ((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);
! 321: } else {
! 322: zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
! 323: }
! 324:
! 325: if (!RETURN_VALUE_USED(opline)) {
! 326: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 327: }
! 328: } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
! 329: EX(original_return_value) = EG(return_value_ptr_ptr);
! 330: EG(active_symbol_table) = NULL;
! 331: EG(active_op_array) = &EX(function_state).function->op_array;
! 332: EG(return_value_ptr_ptr) = NULL;
! 333: if (RETURN_VALUE_USED(opline)) {
! 334: EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
! 335: EX_T(opline->result.u.var).var.ptr = NULL;
! 336: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 337: EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
! 338: }
! 339:
! 340: if (zend_execute == execute && !EG(exception)) {
! 341: EX(call_opline) = opline;
! 342: ZEND_VM_ENTER();
! 343: } else {
! 344: zend_execute(EG(active_op_array) TSRMLS_CC);
! 345: }
! 346:
! 347: EG(opline_ptr) = &EX(opline);
! 348: EG(active_op_array) = EX(op_array);
! 349: EG(return_value_ptr_ptr) = EX(original_return_value);
! 350: if (EG(active_symbol_table)) {
! 351: if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
! 352: zend_hash_destroy(EG(active_symbol_table));
! 353: FREE_HASHTABLE(EG(active_symbol_table));
! 354: } else {
! 355: /* clean before putting into the cache, since clean
! 356: could call dtors, which could use cached hash */
! 357: zend_hash_clean(EG(active_symbol_table));
! 358: *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
! 359: }
! 360: }
! 361: EG(active_symbol_table) = EX(symbol_table);
! 362: } else { /* ZEND_OVERLOADED_FUNCTION */
! 363: ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 364:
! 365: /* Not sure what should be done here if it's a static method */
! 366: if (EX(object)) {
! 367: 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);
! 368: } else {
! 369: zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
! 370: }
! 371:
! 372: if (EX(function_state).function->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
! 373: efree(EX(function_state).function->common.function_name);
! 374: }
! 375: efree(EX(function_state).function);
! 376:
! 377: if (!RETURN_VALUE_USED(opline)) {
! 378: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 379: } else {
! 380: Z_UNSET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 381: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 382: EX_T(opline->result.u.var).var.fcall_returned_reference = 0;
! 383: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 384: }
! 385: }
! 386:
! 387: EX(function_state).function = (zend_function *) EX(op_array);
! 388: EX(function_state).arguments = NULL;
! 389:
! 390: if (should_change_scope) {
! 391: if (EG(This)) {
! 392: if (EG(exception) && IS_CTOR_CALL(EX(called_scope))) {
! 393: if (IS_CTOR_USED(EX(called_scope))) {
! 394: Z_DELREF_P(EG(This));
! 395: }
! 396: if (Z_REFCOUNT_P(EG(This)) == 1) {
! 397: zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
! 398: }
! 399: }
! 400: zval_ptr_dtor(&EG(This));
! 401: }
! 402: EG(This) = EX(current_this);
! 403: EG(scope) = EX(current_scope);
! 404: EG(called_scope) = EX(current_called_scope);
! 405: }
! 406:
! 407: EX(object) = EX(current_object);
! 408: EX(called_scope) = DECODE_CTOR(EX(called_scope));
! 409:
! 410: zend_vm_stack_clear_multiple(TSRMLS_C);
! 411:
! 412: if (EG(exception)) {
! 413: zend_throw_exception_internal(NULL TSRMLS_CC);
! 414: if (RETURN_VALUE_USED(opline) && EX_T(opline->result.u.var).var.ptr) {
! 415: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 416: }
! 417: }
! 418:
! 419: ZEND_VM_NEXT_OPCODE();
! 420: }
! 421:
! 422: static int ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 423: {
! 424: EX(function_state).function = EX(fbc);
! 425: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 426: }
! 427:
! 428: static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 429: {
! 430: zend_op *opline = EX(opline);
! 431: zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
! 432: zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
! 433:
! 434: if (param == NULL) {
! 435: char *space;
! 436: char *class_name = get_active_class_name(&space TSRMLS_CC);
! 437: zend_execute_data *ptr = EX(prev_execute_data);
! 438:
! 439: if (zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL, opline->extended_value TSRMLS_CC)) {
! 440: if(ptr && ptr->op_array) {
! 441: 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);
! 442: } else {
! 443: 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));
! 444: }
! 445: }
! 446: if (opline->result.op_type == IS_VAR) {
! 447: PZVAL_UNLOCK_FREE(*EX_T(opline->result.u.var).var.ptr_ptr);
! 448: }
! 449: } else {
! 450: zend_free_op free_res;
! 451: zval **var_ptr;
! 452:
! 453: zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC);
! 454: var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
! 455: Z_DELREF_PP(var_ptr);
! 456: *var_ptr = *param;
! 457: Z_ADDREF_PP(var_ptr);
! 458: }
! 459:
! 460: ZEND_VM_NEXT_OPCODE();
! 461: }
! 462:
! 463: static int ZEND_FASTCALL ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 464: {
! 465: zend_op *opline = EX(opline);
! 466: zval *object_zval;
! 467: zend_function *constructor;
! 468:
! 469: if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
! 470: char *class_type;
! 471:
! 472: if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
! 473: class_type = "interface";
! 474: } else {
! 475: class_type = "abstract class";
! 476: }
! 477: zend_error_noreturn(E_ERROR, "Cannot instantiate %s %s", class_type, EX_T(opline->op1.u.var).class_entry->name);
! 478: }
! 479: ALLOC_ZVAL(object_zval);
! 480: object_init_ex(object_zval, EX_T(opline->op1.u.var).class_entry);
! 481: INIT_PZVAL(object_zval);
! 482:
! 483: constructor = Z_OBJ_HT_P(object_zval)->get_constructor(object_zval TSRMLS_CC);
! 484:
! 485: if (constructor == NULL) {
! 486: if (RETURN_VALUE_USED(opline)) {
! 487: AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
! 488: } else {
! 489: zval_ptr_dtor(&object_zval);
! 490: }
! 491: ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.u.opline_num);
! 492: } else {
! 493: if (RETURN_VALUE_USED(opline)) {
! 494: AI_SET_PTR(EX_T(opline->result.u.var).var, object_zval);
! 495: PZVAL_LOCK(object_zval);
! 496: }
! 497:
! 498: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), ENCODE_CTOR(EX(called_scope), RETURN_VALUE_USED(opline)));
! 499:
! 500: /* We are not handling overloaded classes right now */
! 501: EX(object) = object_zval;
! 502: EX(fbc) = constructor;
! 503: EX(called_scope) = EX_T(opline->op1.u.var).class_entry;
! 504:
! 505: ZEND_VM_NEXT_OPCODE();
! 506: }
! 507: }
! 508:
! 509: static int ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 510: {
! 511: zend_op *opline = EX(opline);
! 512:
! 513: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = EG(error_reporting);
! 514: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG; /* shouldn't be necessary */
! 515: if (EX(old_error_reporting) == NULL) {
! 516: EX(old_error_reporting) = &EX_T(opline->result.u.var).tmp_var;
! 517: }
! 518:
! 519: if (EG(error_reporting)) {
! 520: zend_alter_ini_entry_ex("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME, 1 TSRMLS_CC);
! 521: }
! 522: ZEND_VM_NEXT_OPCODE();
! 523: }
! 524:
! 525: static int ZEND_FASTCALL ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 526: {
! 527: zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", EG(scope)->name, EX(op_array)->function_name);
! 528: ZEND_VM_NEXT_OPCODE(); /* Never reached */
! 529: }
! 530:
! 531: static int ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 532: {
! 533: if (!EG(no_extensions)) {
! 534: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(op_array) TSRMLS_CC);
! 535: }
! 536: ZEND_VM_NEXT_OPCODE();
! 537: }
! 538:
! 539: static int ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 540: {
! 541: if (!EG(no_extensions)) {
! 542: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(op_array) TSRMLS_CC);
! 543: }
! 544: ZEND_VM_NEXT_OPCODE();
! 545: }
! 546:
! 547: static int ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 548: {
! 549: if (!EG(no_extensions)) {
! 550: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(op_array) TSRMLS_CC);
! 551: }
! 552: ZEND_VM_NEXT_OPCODE();
! 553: }
! 554:
! 555: static int ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 556: {
! 557: zend_op *opline = EX(opline);
! 558:
! 559: EX_T(opline->result.u.var).class_entry = do_bind_class(opline, EG(class_table), 0 TSRMLS_CC);
! 560: ZEND_VM_NEXT_OPCODE();
! 561: }
! 562:
! 563: static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 564: {
! 565: zend_op *opline = EX(opline);
! 566:
! 567: 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);
! 568: ZEND_VM_NEXT_OPCODE();
! 569: }
! 570:
! 571: static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 572: {
! 573: zend_op *opline = EX(opline);
! 574: zend_class_entry **pce, **pce_orig;
! 575:
! 576: if (zend_hash_find(EG(class_table), Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void**)&pce) == FAILURE ||
! 577: (zend_hash_find(EG(class_table), Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), (void**)&pce_orig) == SUCCESS &&
! 578: *pce != *pce_orig)) {
! 579: do_bind_inherited_class(opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
! 580: }
! 581: ZEND_VM_NEXT_OPCODE();
! 582: }
! 583:
! 584: static int ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 585: {
! 586: do_bind_function(EX(opline), EG(function_table), 0);
! 587: ZEND_VM_NEXT_OPCODE();
! 588: }
! 589:
! 590: static int ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 591: {
! 592: ZEND_VM_NEXT_OPCODE();
! 593: }
! 594:
! 595: static int ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 596: {
! 597: ZEND_VM_NEXT_OPCODE();
! 598: }
! 599:
! 600: static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 601: {
! 602: zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes;
! 603: int i;
! 604: zend_uint catch_op_num;
! 605: int catched = 0;
! 606: zval restored_error_reporting;
! 607:
! 608: void **stack_frame = (void**)(((char*)EX(Ts)) +
! 609: (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * EX(op_array)->T));
! 610:
! 611: while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
! 612: zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
! 613: zval_ptr_dtor(&stack_zval_p);
! 614: }
! 615:
! 616: for (i=0; i<EG(active_op_array)->last_try_catch; i++) {
! 617: if (EG(active_op_array)->try_catch_array[i].try_op > op_num) {
! 618: /* further blocks will not be relevant... */
! 619: break;
! 620: }
! 621: if (op_num >= EG(active_op_array)->try_catch_array[i].try_op
! 622: && op_num < EG(active_op_array)->try_catch_array[i].catch_op) {
! 623: catch_op_num = EX(op_array)->try_catch_array[i].catch_op;
! 624: catched = 1;
! 625: }
! 626: }
! 627:
! 628: while (EX(fbc)) {
! 629: EX(called_scope) = (zend_class_entry*)zend_ptr_stack_pop(&EG(arg_types_stack));
! 630: if (EX(object)) {
! 631: if (IS_CTOR_CALL(EX(called_scope))) {
! 632: if (IS_CTOR_USED(EX(called_scope))) {
! 633: Z_DELREF_P(EX(object));
! 634: }
! 635: if (Z_REFCOUNT_P(EX(object)) == 1) {
! 636: zend_object_store_ctor_failed(EX(object) TSRMLS_CC);
! 637: }
! 638: }
! 639: zval_ptr_dtor(&EX(object));
! 640: }
! 641: EX(called_scope) = DECODE_CTOR(EX(called_scope));
! 642: zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
! 643: }
! 644:
! 645: for (i=0; i<EX(op_array)->last_brk_cont; i++) {
! 646: if (EX(op_array)->brk_cont_array[i].start < 0) {
! 647: continue;
! 648: } else if (EX(op_array)->brk_cont_array[i].start > op_num) {
! 649: /* further blocks will not be relevant... */
! 650: break;
! 651: } else if (op_num < EX(op_array)->brk_cont_array[i].brk) {
! 652: if (!catched ||
! 653: catch_op_num >= EX(op_array)->brk_cont_array[i].brk) {
! 654: zend_op *brk_opline = &EX(op_array)->opcodes[EX(op_array)->brk_cont_array[i].brk];
! 655:
! 656: switch (brk_opline->opcode) {
! 657: case ZEND_SWITCH_FREE:
! 658: if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
! 659: zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
! 660: }
! 661: break;
! 662: case ZEND_FREE:
! 663: if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
! 664: zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
! 665: }
! 666: break;
! 667: }
! 668: }
! 669: }
! 670: }
! 671:
! 672: /* restore previous error_reporting value */
! 673: if (!EG(error_reporting) && EX(old_error_reporting) != NULL && Z_LVAL_P(EX(old_error_reporting)) != 0) {
! 674: Z_TYPE(restored_error_reporting) = IS_LONG;
! 675: Z_LVAL(restored_error_reporting) = Z_LVAL_P(EX(old_error_reporting));
! 676: convert_to_string(&restored_error_reporting);
! 677: 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);
! 678: zendi_zval_dtor(restored_error_reporting);
! 679: }
! 680: EX(old_error_reporting) = NULL;
! 681:
! 682: if (!catched) {
! 683: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 684: } else {
! 685: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
! 686: ZEND_VM_CONTINUE();
! 687: }
! 688: }
! 689:
! 690: static int ZEND_FASTCALL ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 691: {
! 692: zend_verify_abstract_class(EX_T(EX(opline)->op1.u.var).class_entry TSRMLS_CC);
! 693: ZEND_VM_NEXT_OPCODE();
! 694: }
! 695:
! 696: static int ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 697: {
! 698: int ret = zend_user_opcode_handlers[EX(opline)->opcode](ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL);
! 699:
! 700: switch (ret) {
! 701: case ZEND_USER_OPCODE_CONTINUE:
! 702: ZEND_VM_CONTINUE();
! 703: case ZEND_USER_OPCODE_RETURN:
! 704: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 705: case ZEND_USER_OPCODE_ENTER:
! 706: ZEND_VM_ENTER();
! 707: case ZEND_USER_OPCODE_LEAVE:
! 708: ZEND_VM_LEAVE();
! 709: case ZEND_USER_OPCODE_DISPATCH:
! 710: ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline));
! 711: default:
! 712: ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), EX(opline));
! 713: }
! 714: }
! 715:
! 716: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 717: {
! 718: zend_op *opline = EX(opline);
! 719:
! 720:
! 721: if (IS_CONST == IS_UNUSED) {
! 722: EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
! 723: ZEND_VM_NEXT_OPCODE();
! 724: } else {
! 725:
! 726: zval *class_name = &opline->op2.u.constant;
! 727:
! 728: if (IS_CONST != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
! 729: EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
! 730: } else if (Z_TYPE_P(class_name) == IS_STRING) {
! 731: 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);
! 732: } else {
! 733: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
! 734: }
! 735:
! 736: ZEND_VM_NEXT_OPCODE();
! 737: }
! 738: }
! 739:
! 740: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 741: {
! 742: zend_op *opline = EX(opline);
! 743: zval *function_name;
! 744: char *function_name_strval, *lcname;
! 745: int function_name_strlen;
! 746:
! 747:
! 748: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 749:
! 750: if (IS_CONST == IS_CONST) {
! 751: 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) {
! 752: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
! 753: }
! 754: } else {
! 755: function_name = &opline->op2.u.constant;
! 756:
! 757: if (IS_CONST != IS_CONST && IS_CONST != IS_TMP_VAR &&
! 758: Z_TYPE_P(function_name) == IS_OBJECT &&
! 759: Z_OBJ_HANDLER_P(function_name, get_closure) &&
! 760: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
! 761: if (EX(object)) {
! 762: Z_ADDREF_P(EX(object));
! 763: }
! 764: if (IS_CONST == IS_VAR && 0 &&
! 765: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
! 766: /* Delay closure destruction until its invocation */
! 767: EX(fbc)->common.prototype = (zend_function*)function_name;
! 768: } else {
! 769:
! 770: }
! 771: ZEND_VM_NEXT_OPCODE();
! 772: }
! 773:
! 774: if (Z_TYPE_P(function_name) != IS_STRING) {
! 775: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 776: }
! 777: function_name_strval = Z_STRVAL_P(function_name);
! 778: function_name_strlen = Z_STRLEN_P(function_name);
! 779: if (function_name_strval[0] == '\\') {
! 780:
! 781: function_name_strlen -= 1;
! 782: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
! 783: } else {
! 784: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
! 785: }
! 786: if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE) {
! 787: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
! 788: }
! 789: efree(lcname);
! 790:
! 791: }
! 792:
! 793: EX(object) = NULL;
! 794: ZEND_VM_NEXT_OPCODE();
! 795: }
! 796:
! 797:
! 798: static int ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 799: {
! 800: zend_op *opline = EX(opline);
! 801: zend_op *op_data = opline + 1;
! 802:
! 803: ZEND_VM_INC_OPCODE();
! 804: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 805:
! 806: 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) {
! 807: char *short_name = Z_STRVAL(opline->op1.u.constant)+Z_LVAL(op_data->op1.u.constant);
! 808: 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) {
! 809: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
! 810: }
! 811: }
! 812:
! 813: EX(object) = NULL;
! 814: ZEND_VM_NEXT_OPCODE();
! 815: }
! 816:
! 817: static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 818: {
! 819: zend_op *opline = EX(opline);
! 820: zval *assignment_value;
! 821: zend_uint arg_num = Z_LVAL(opline->op1.u.constant);
! 822: zend_free_op free_res;
! 823: zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
! 824: zval **var_ptr;
! 825:
! 826: if (param == NULL) {
! 827: ALLOC_ZVAL(assignment_value);
! 828: *assignment_value = opline->op2.u.constant;
! 829: if ((Z_TYPE(opline->op2.u.constant) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE(opline->op2.u.constant)==IS_CONSTANT_ARRAY) {
! 830: Z_SET_REFCOUNT_P(assignment_value, 1);
! 831: zval_update_constant(&assignment_value, 0 TSRMLS_CC);
! 832: } else {
! 833: zval_copy_ctor(assignment_value);
! 834: }
! 835: INIT_PZVAL(assignment_value);
! 836: } else {
! 837: assignment_value = *param;
! 838: Z_ADDREF_P(assignment_value);
! 839: }
! 840:
! 841: zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
! 842: var_ptr = get_zval_ptr_ptr(&opline->result, EX(Ts), &free_res, BP_VAR_W);
! 843: Z_DELREF_PP(var_ptr);
! 844: *var_ptr = assignment_value;
! 845:
! 846: ZEND_VM_NEXT_OPCODE();
! 847: }
! 848:
! 849: static int ZEND_FASTCALL ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 850: {
! 851: zend_op *opline = EX(opline);
! 852:
! 853: zend_brk_cont_element *el;
! 854:
! 855: el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num,
! 856: EX(op_array), EX(Ts) TSRMLS_CC);
! 857:
! 858: ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
! 859: }
! 860:
! 861: static int ZEND_FASTCALL ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 862: {
! 863: zend_op *opline = EX(opline);
! 864:
! 865: zend_brk_cont_element *el;
! 866:
! 867: el = zend_brk_cont(&opline->op2.u.constant, opline->op1.u.opline_num,
! 868: EX(op_array), EX(Ts) TSRMLS_CC);
! 869:
! 870: ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
! 871: }
! 872:
! 873: static int ZEND_FASTCALL ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 874: {
! 875: zend_op *brk_opline;
! 876: zend_op *opline = EX(opline);
! 877: zend_brk_cont_element *el;
! 878:
! 879: el = zend_brk_cont(&opline->op2.u.constant, opline->extended_value,
! 880: EX(op_array), EX(Ts) TSRMLS_CC);
! 881:
! 882: brk_opline = EX(op_array)->opcodes + el->brk;
! 883:
! 884: switch (brk_opline->opcode) {
! 885: case ZEND_SWITCH_FREE:
! 886: if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
! 887: zend_switch_free(&EX_T(brk_opline->op1.u.var), brk_opline->extended_value TSRMLS_CC);
! 888: }
! 889: break;
! 890: case ZEND_FREE:
! 891: if (brk_opline->op1.u.EA.type != EXT_TYPE_FREE_ON_RETURN) {
! 892: zendi_zval_dtor(EX_T(brk_opline->op1.u.var).tmp_var);
! 893: }
! 894: break;
! 895: }
! 896: ZEND_VM_JMP(opline->op1.u.jmp_addr);
! 897: }
! 898:
! 899: static int ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 900: {
! 901: zend_op *opline = EX(opline);
! 902: zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;
! 903: zend_class_entry *iface = zend_fetch_class(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant), opline->extended_value TSRMLS_CC);
! 904:
! 905: if (iface) {
! 906: if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {
! 907: zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
! 908: }
! 909: zend_do_implement_interface(ce, iface TSRMLS_CC);
! 910: }
! 911:
! 912: ZEND_VM_NEXT_OPCODE();
! 913: }
! 914:
! 915: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 916: {
! 917: zend_op *opline = EX(opline);
! 918:
! 919:
! 920: if (IS_TMP_VAR == IS_UNUSED) {
! 921: EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
! 922: ZEND_VM_NEXT_OPCODE();
! 923: } else {
! 924: zend_free_op free_op2;
! 925: zval *class_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 926:
! 927: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
! 928: EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
! 929: } else if (Z_TYPE_P(class_name) == IS_STRING) {
! 930: 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);
! 931: } else {
! 932: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
! 933: }
! 934:
! 935: zval_dtor(free_op2.var);
! 936: ZEND_VM_NEXT_OPCODE();
! 937: }
! 938: }
! 939:
! 940: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 941: {
! 942: zend_op *opline = EX(opline);
! 943: zval *function_name;
! 944: char *function_name_strval, *lcname;
! 945: int function_name_strlen;
! 946: zend_free_op free_op2;
! 947:
! 948: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 949:
! 950: if (IS_TMP_VAR == IS_CONST) {
! 951: 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) {
! 952: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
! 953: }
! 954: } else {
! 955: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 956:
! 957: if (IS_TMP_VAR != IS_CONST && IS_TMP_VAR != IS_TMP_VAR &&
! 958: Z_TYPE_P(function_name) == IS_OBJECT &&
! 959: Z_OBJ_HANDLER_P(function_name, get_closure) &&
! 960: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
! 961: if (EX(object)) {
! 962: Z_ADDREF_P(EX(object));
! 963: }
! 964: if (IS_TMP_VAR == IS_VAR && 1 &&
! 965: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
! 966: /* Delay closure destruction until its invocation */
! 967: EX(fbc)->common.prototype = (zend_function*)function_name;
! 968: } else {
! 969: zval_dtor(free_op2.var);
! 970: }
! 971: ZEND_VM_NEXT_OPCODE();
! 972: }
! 973:
! 974: if (Z_TYPE_P(function_name) != IS_STRING) {
! 975: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 976: }
! 977: function_name_strval = Z_STRVAL_P(function_name);
! 978: function_name_strlen = Z_STRLEN_P(function_name);
! 979: if (function_name_strval[0] == '\\') {
! 980:
! 981: function_name_strlen -= 1;
! 982: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
! 983: } else {
! 984: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
! 985: }
! 986: if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE) {
! 987: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
! 988: }
! 989: efree(lcname);
! 990: zval_dtor(free_op2.var);
! 991: }
! 992:
! 993: EX(object) = NULL;
! 994: ZEND_VM_NEXT_OPCODE();
! 995: }
! 996:
! 997:
! 998: static int ZEND_FASTCALL ZEND_BRK_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 999: {
! 1000: zend_op *opline = EX(opline);
! 1001: zend_free_op free_op2;
! 1002: zend_brk_cont_element *el;
! 1003:
! 1004: el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
! 1005: EX(op_array), EX(Ts) TSRMLS_CC);
! 1006: zval_dtor(free_op2.var);
! 1007: ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
! 1008: }
! 1009:
! 1010: static int ZEND_FASTCALL ZEND_CONT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1011: {
! 1012: zend_op *opline = EX(opline);
! 1013: zend_free_op free_op2;
! 1014: zend_brk_cont_element *el;
! 1015:
! 1016: el = zend_brk_cont(_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
! 1017: EX(op_array), EX(Ts) TSRMLS_CC);
! 1018: zval_dtor(free_op2.var);
! 1019: ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
! 1020: }
! 1021:
! 1022: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1023: {
! 1024: zend_op *opline = EX(opline);
! 1025:
! 1026:
! 1027: if (IS_VAR == IS_UNUSED) {
! 1028: EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
! 1029: ZEND_VM_NEXT_OPCODE();
! 1030: } else {
! 1031: zend_free_op free_op2;
! 1032: zval *class_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 1033:
! 1034: if (IS_VAR != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
! 1035: EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
! 1036: } else if (Z_TYPE_P(class_name) == IS_STRING) {
! 1037: 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);
! 1038: } else {
! 1039: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
! 1040: }
! 1041:
! 1042: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 1043: ZEND_VM_NEXT_OPCODE();
! 1044: }
! 1045: }
! 1046:
! 1047: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1048: {
! 1049: zend_op *opline = EX(opline);
! 1050: zval *function_name;
! 1051: char *function_name_strval, *lcname;
! 1052: int function_name_strlen;
! 1053: zend_free_op free_op2;
! 1054:
! 1055: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 1056:
! 1057: if (IS_VAR == IS_CONST) {
! 1058: 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) {
! 1059: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
! 1060: }
! 1061: } else {
! 1062: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 1063:
! 1064: if (IS_VAR != IS_CONST && IS_VAR != IS_TMP_VAR &&
! 1065: Z_TYPE_P(function_name) == IS_OBJECT &&
! 1066: Z_OBJ_HANDLER_P(function_name, get_closure) &&
! 1067: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
! 1068: if (EX(object)) {
! 1069: Z_ADDREF_P(EX(object));
! 1070: }
! 1071: if (IS_VAR == IS_VAR && (free_op2.var != NULL) &&
! 1072: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
! 1073: /* Delay closure destruction until its invocation */
! 1074: EX(fbc)->common.prototype = (zend_function*)function_name;
! 1075: } else {
! 1076: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 1077: }
! 1078: ZEND_VM_NEXT_OPCODE();
! 1079: }
! 1080:
! 1081: if (Z_TYPE_P(function_name) != IS_STRING) {
! 1082: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 1083: }
! 1084: function_name_strval = Z_STRVAL_P(function_name);
! 1085: function_name_strlen = Z_STRLEN_P(function_name);
! 1086: if (function_name_strval[0] == '\\') {
! 1087:
! 1088: function_name_strlen -= 1;
! 1089: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
! 1090: } else {
! 1091: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
! 1092: }
! 1093: if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE) {
! 1094: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
! 1095: }
! 1096: efree(lcname);
! 1097: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 1098: }
! 1099:
! 1100: EX(object) = NULL;
! 1101: ZEND_VM_NEXT_OPCODE();
! 1102: }
! 1103:
! 1104:
! 1105: static int ZEND_FASTCALL ZEND_BRK_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1106: {
! 1107: zend_op *opline = EX(opline);
! 1108: zend_free_op free_op2;
! 1109: zend_brk_cont_element *el;
! 1110:
! 1111: el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
! 1112: EX(op_array), EX(Ts) TSRMLS_CC);
! 1113: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 1114: ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
! 1115: }
! 1116:
! 1117: static int ZEND_FASTCALL ZEND_CONT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1118: {
! 1119: zend_op *opline = EX(opline);
! 1120: zend_free_op free_op2;
! 1121: zend_brk_cont_element *el;
! 1122:
! 1123: el = zend_brk_cont(_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC), opline->op1.u.opline_num,
! 1124: EX(op_array), EX(Ts) TSRMLS_CC);
! 1125: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 1126: ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
! 1127: }
! 1128:
! 1129: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1130: {
! 1131: zend_op *opline = EX(opline);
! 1132:
! 1133:
! 1134: if (IS_UNUSED == IS_UNUSED) {
! 1135: EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
! 1136: ZEND_VM_NEXT_OPCODE();
! 1137: } else {
! 1138:
! 1139: zval *class_name = NULL;
! 1140:
! 1141: if (IS_UNUSED != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
! 1142: EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
! 1143: } else if (Z_TYPE_P(class_name) == IS_STRING) {
! 1144: 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);
! 1145: } else {
! 1146: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
! 1147: }
! 1148:
! 1149: ZEND_VM_NEXT_OPCODE();
! 1150: }
! 1151: }
! 1152:
! 1153: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1154: {
! 1155: zend_op *opline = EX(opline);
! 1156:
! 1157:
! 1158: if (IS_CV == IS_UNUSED) {
! 1159: EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
! 1160: ZEND_VM_NEXT_OPCODE();
! 1161: } else {
! 1162:
! 1163: zval *class_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 1164:
! 1165: if (IS_CV != IS_CONST && Z_TYPE_P(class_name) == IS_OBJECT) {
! 1166: EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);
! 1167: } else if (Z_TYPE_P(class_name) == IS_STRING) {
! 1168: 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);
! 1169: } else {
! 1170: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
! 1171: }
! 1172:
! 1173: ZEND_VM_NEXT_OPCODE();
! 1174: }
! 1175: }
! 1176:
! 1177: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1178: {
! 1179: zend_op *opline = EX(opline);
! 1180: zval *function_name;
! 1181: char *function_name_strval, *lcname;
! 1182: int function_name_strlen;
! 1183:
! 1184:
! 1185: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 1186:
! 1187: if (IS_CV == IS_CONST) {
! 1188: 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) {
! 1189: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL(opline->op2.u.constant));
! 1190: }
! 1191: } else {
! 1192: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 1193:
! 1194: if (IS_CV != IS_CONST && IS_CV != IS_TMP_VAR &&
! 1195: Z_TYPE_P(function_name) == IS_OBJECT &&
! 1196: Z_OBJ_HANDLER_P(function_name, get_closure) &&
! 1197: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
! 1198: if (EX(object)) {
! 1199: Z_ADDREF_P(EX(object));
! 1200: }
! 1201: if (IS_CV == IS_VAR && 0 &&
! 1202: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
! 1203: /* Delay closure destruction until its invocation */
! 1204: EX(fbc)->common.prototype = (zend_function*)function_name;
! 1205: } else {
! 1206:
! 1207: }
! 1208: ZEND_VM_NEXT_OPCODE();
! 1209: }
! 1210:
! 1211: if (Z_TYPE_P(function_name) != IS_STRING) {
! 1212: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 1213: }
! 1214: function_name_strval = Z_STRVAL_P(function_name);
! 1215: function_name_strlen = Z_STRLEN_P(function_name);
! 1216: if (function_name_strval[0] == '\\') {
! 1217:
! 1218: function_name_strlen -= 1;
! 1219: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
! 1220: } else {
! 1221: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
! 1222: }
! 1223: if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE) {
! 1224: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
! 1225: }
! 1226: efree(lcname);
! 1227:
! 1228: }
! 1229:
! 1230: EX(object) = NULL;
! 1231: ZEND_VM_NEXT_OPCODE();
! 1232: }
! 1233:
! 1234:
! 1235: static int ZEND_FASTCALL ZEND_CATCH_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1236: {
! 1237: zend_op *opline = EX(opline);
! 1238: zend_class_entry *ce;
! 1239:
! 1240: /* Check whether an exception has been thrown, if not, jump over code */
! 1241: zend_exception_restore(TSRMLS_C);
! 1242: if (EG(exception) == NULL) {
! 1243: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 1244: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 1245: }
! 1246: ce = Z_OBJCE_P(EG(exception));
! 1247: if (ce != EX_T(opline->op1.u.var).class_entry) {
! 1248: if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) {
! 1249: if (opline->op1.u.EA.type) {
! 1250: zend_throw_exception_internal(NULL TSRMLS_CC);
! 1251: ZEND_VM_NEXT_OPCODE();
! 1252: }
! 1253: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 1254: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 1255: }
! 1256: }
! 1257:
! 1258: if (!EG(active_symbol_table)) {
! 1259: if (EX(CVs)[opline->op2.u.var]) {
! 1260: zval_ptr_dtor(EX(CVs)[opline->op2.u.var]);
! 1261: }
! 1262: EX(CVs)[opline->op2.u.var] = (zval**)EX(CVs) + (EX(op_array)->last_var + opline->op2.u.var);
! 1263: *EX(CVs)[opline->op2.u.var] = EG(exception);
! 1264: } else {
! 1265: zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.u.var);
! 1266: zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value,
! 1267: &EG(exception), sizeof(zval *), (void**)&EX(CVs)[opline->op2.u.var]);
! 1268: }
! 1269: EG(exception) = NULL;
! 1270: ZEND_VM_NEXT_OPCODE();
! 1271: }
! 1272:
! 1273: static int ZEND_FASTCALL ZEND_BRK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1274: {
! 1275: zend_op *opline = EX(opline);
! 1276:
! 1277: zend_brk_cont_element *el;
! 1278:
! 1279: el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num,
! 1280: EX(op_array), EX(Ts) TSRMLS_CC);
! 1281:
! 1282: ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
! 1283: }
! 1284:
! 1285: static int ZEND_FASTCALL ZEND_CONT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1286: {
! 1287: zend_op *opline = EX(opline);
! 1288:
! 1289: zend_brk_cont_element *el;
! 1290:
! 1291: el = zend_brk_cont(_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC), opline->op1.u.opline_num,
! 1292: EX(op_array), EX(Ts) TSRMLS_CC);
! 1293:
! 1294: ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
! 1295: }
! 1296:
! 1297: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1298: {
! 1299: zend_op *opline = EX(opline);
! 1300:
! 1301:
! 1302: bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
! 1303: &opline->op1.u.constant TSRMLS_CC);
! 1304:
! 1305: ZEND_VM_NEXT_OPCODE();
! 1306: }
! 1307:
! 1308: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1309: {
! 1310: zend_op *opline = EX(opline);
! 1311:
! 1312:
! 1313: boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
! 1314: &opline->op1.u.constant TSRMLS_CC);
! 1315:
! 1316: ZEND_VM_NEXT_OPCODE();
! 1317: }
! 1318:
! 1319: static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1320: {
! 1321: zend_op *opline = EX(opline);
! 1322:
! 1323: zval z_copy;
! 1324: zval *z = &opline->op1.u.constant;
! 1325:
! 1326: if (IS_CONST != IS_CONST &&
! 1327: Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL) {
! 1328: if (IS_CONST == IS_TMP_VAR) {
! 1329: INIT_PZVAL(z);
! 1330: }
! 1331: if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
! 1332: zend_print_variable(&z_copy);
! 1333: zval_dtor(&z_copy);
! 1334: } else {
! 1335: zend_print_variable(z);
! 1336: }
! 1337: } else {
! 1338: zend_print_variable(z);
! 1339: }
! 1340:
! 1341: ZEND_VM_NEXT_OPCODE();
! 1342: }
! 1343:
! 1344: static int ZEND_FASTCALL ZEND_PRINT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1345: {
! 1346: zend_op *opline = EX(opline);
! 1347:
! 1348: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 1349: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
! 1350:
! 1351: return ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1352: }
! 1353:
! 1354: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
! 1355: {
! 1356: zend_op *opline = EX(opline);
! 1357: zend_free_op free_op1;
! 1358: zval *varname = &opline->op1.u.constant;
! 1359: zval **retval;
! 1360: zval tmp_varname;
! 1361: HashTable *target_symbol_table;
! 1362:
! 1363: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
! 1364: tmp_varname = *varname;
! 1365: zval_copy_ctor(&tmp_varname);
! 1366: convert_to_string(&tmp_varname);
! 1367: varname = &tmp_varname;
! 1368: }
! 1369:
! 1370: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 1371: 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);
! 1372:
! 1373: } else {
! 1374: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
! 1375: /*
! 1376: if (!target_symbol_table) {
! 1377: ZEND_VM_NEXT_OPCODE();
! 1378: }
! 1379: */
! 1380: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) {
! 1381: switch (type) {
! 1382: case BP_VAR_R:
! 1383: case BP_VAR_UNSET:
! 1384: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 1385: /* break missing intentionally */
! 1386: case BP_VAR_IS:
! 1387: retval = &EG(uninitialized_zval_ptr);
! 1388: break;
! 1389: case BP_VAR_RW:
! 1390: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 1391: /* break missing intentionally */
! 1392: case BP_VAR_W: {
! 1393: zval *new_zval = &EG(uninitialized_zval);
! 1394:
! 1395: Z_ADDREF_P(new_zval);
! 1396: zend_hash_update(target_symbol_table, varname->value.str.val, varname->value.str.len+1, &new_zval, sizeof(zval *), (void **) &retval);
! 1397: }
! 1398: break;
! 1399: EMPTY_SWITCH_DEFAULT_CASE()
! 1400: }
! 1401: }
! 1402: switch (opline->op2.u.EA.type) {
! 1403: case ZEND_FETCH_GLOBAL:
! 1404: if (IS_CONST != IS_TMP_VAR) {
! 1405:
! 1406: }
! 1407: break;
! 1408: case ZEND_FETCH_LOCAL:
! 1409:
! 1410: break;
! 1411: case ZEND_FETCH_STATIC:
! 1412: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
! 1413: break;
! 1414: case ZEND_FETCH_GLOBAL_LOCK:
! 1415: if (IS_CONST == IS_VAR && !free_op1.var) {
! 1416: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 1417: }
! 1418: break;
! 1419: }
! 1420: }
! 1421:
! 1422:
! 1423: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
! 1424: zval_dtor(varname);
! 1425: }
! 1426: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 1427: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 1428: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
! 1429: }
! 1430: PZVAL_LOCK(*retval);
! 1431: switch (type) {
! 1432: case BP_VAR_R:
! 1433: case BP_VAR_IS:
! 1434: AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
! 1435: break;
! 1436: case BP_VAR_UNSET: {
! 1437: zend_free_op free_res;
! 1438:
! 1439: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 1440: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 1441: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 1442: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 1443: }
! 1444: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 1445: FREE_OP_VAR_PTR(free_res);
! 1446: break;
! 1447: default:
! 1448: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 1449: break;
! 1450: }
! 1451: }
! 1452: }
! 1453: ZEND_VM_NEXT_OPCODE();
! 1454: }
! 1455:
! 1456: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1457: {
! 1458: return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1459: }
! 1460:
! 1461: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1462: {
! 1463: return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1464: }
! 1465:
! 1466: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1467: {
! 1468: return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1469: }
! 1470:
! 1471: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1472: {
! 1473: return zend_fetch_var_address_helper_SPEC_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1474: }
! 1475:
! 1476: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1477: {
! 1478: return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1479: }
! 1480:
! 1481: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1482: {
! 1483: return zend_fetch_var_address_helper_SPEC_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1484: }
! 1485:
! 1486: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1487: {
! 1488: zend_op *opline = EX(opline);
! 1489:
! 1490: zval *val = &opline->op1.u.constant;
! 1491: int ret;
! 1492:
! 1493: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 1494: ret = Z_LVAL_P(val);
! 1495: } else {
! 1496: ret = i_zend_is_true(val);
! 1497:
! 1498: if (UNEXPECTED(EG(exception) != NULL)) {
! 1499: ZEND_VM_CONTINUE();
! 1500: }
! 1501: }
! 1502: if (!ret) {
! 1503: #if DEBUG_ZEND>=2
! 1504: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 1505: #endif
! 1506: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 1507: ZEND_VM_CONTINUE();
! 1508: }
! 1509:
! 1510: ZEND_VM_NEXT_OPCODE();
! 1511: }
! 1512:
! 1513: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1514: {
! 1515: zend_op *opline = EX(opline);
! 1516:
! 1517: zval *val = &opline->op1.u.constant;
! 1518: int ret;
! 1519:
! 1520: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 1521: ret = Z_LVAL_P(val);
! 1522: } else {
! 1523: ret = i_zend_is_true(val);
! 1524:
! 1525: if (UNEXPECTED(EG(exception) != NULL)) {
! 1526: ZEND_VM_CONTINUE();
! 1527: }
! 1528: }
! 1529: if (ret) {
! 1530: #if DEBUG_ZEND>=2
! 1531: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 1532: #endif
! 1533: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 1534: ZEND_VM_CONTINUE();
! 1535: }
! 1536:
! 1537: ZEND_VM_NEXT_OPCODE();
! 1538: }
! 1539:
! 1540: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1541: {
! 1542: zend_op *opline = EX(opline);
! 1543:
! 1544: zval *val = &opline->op1.u.constant;
! 1545: int retval;
! 1546:
! 1547: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 1548: retval = Z_LVAL_P(val);
! 1549: } else {
! 1550: retval = i_zend_is_true(val);
! 1551:
! 1552: if (UNEXPECTED(EG(exception) != NULL)) {
! 1553: ZEND_VM_CONTINUE();
! 1554: }
! 1555: }
! 1556: if (EXPECTED(retval != 0)) {
! 1557: #if DEBUG_ZEND>=2
! 1558: printf("Conditional jmp on true to %d\n", opline->extended_value);
! 1559: #endif
! 1560: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 1561: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 1562: } else {
! 1563: #if DEBUG_ZEND>=2
! 1564: printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
! 1565: #endif
! 1566: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
! 1567: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 1568: }
! 1569: }
! 1570:
! 1571: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1572: {
! 1573: zend_op *opline = EX(opline);
! 1574:
! 1575: zval *val = &opline->op1.u.constant;
! 1576: int retval;
! 1577:
! 1578: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 1579: retval = Z_LVAL_P(val);
! 1580: } else {
! 1581: retval = i_zend_is_true(val);
! 1582:
! 1583: if (UNEXPECTED(EG(exception) != NULL)) {
! 1584: ZEND_VM_CONTINUE();
! 1585: }
! 1586: }
! 1587: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 1588: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 1589: if (!retval) {
! 1590: #if DEBUG_ZEND>=2
! 1591: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 1592: #endif
! 1593: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 1594: ZEND_VM_CONTINUE();
! 1595: }
! 1596: ZEND_VM_NEXT_OPCODE();
! 1597: }
! 1598:
! 1599: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1600: {
! 1601: zend_op *opline = EX(opline);
! 1602:
! 1603: zval *val = &opline->op1.u.constant;
! 1604: int retval;
! 1605:
! 1606: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 1607: retval = Z_LVAL_P(val);
! 1608: } else {
! 1609: retval = i_zend_is_true(val);
! 1610:
! 1611: if (UNEXPECTED(EG(exception) != NULL)) {
! 1612: ZEND_VM_CONTINUE();
! 1613: }
! 1614: }
! 1615: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 1616: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 1617: if (retval) {
! 1618: #if DEBUG_ZEND>=2
! 1619: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 1620: #endif
! 1621: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 1622: ZEND_VM_CONTINUE();
! 1623: }
! 1624: ZEND_VM_NEXT_OPCODE();
! 1625: }
! 1626:
! 1627: static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1628: {
! 1629: zend_op *opline = EX(opline);
! 1630:
! 1631: zval *fname = &opline->op1.u.constant;
! 1632:
! 1633: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 1634:
! 1635: 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) {
! 1636: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", fname->value.str.val);
! 1637: }
! 1638: EX(object) = NULL;
! 1639:
! 1640: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1641: }
! 1642:
! 1643: static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1644: {
! 1645: zend_op *opline = EX(opline);
! 1646: zval *retval_ptr;
! 1647: zval **retval_ptr_ptr;
! 1648:
! 1649:
! 1650: if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
! 1651:
! 1652: if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
! 1653: /* Not supposed to happen, but we'll allow it */
! 1654: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 1655: goto return_by_value;
! 1656: }
! 1657:
! 1658: retval_ptr_ptr = NULL;
! 1659:
! 1660: if (IS_CONST == IS_VAR && !retval_ptr_ptr) {
! 1661: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
! 1662: }
! 1663:
! 1664: if (IS_CONST == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
! 1665: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 1666: EX_T(opline->op1.u.var).var.fcall_returned_reference) {
! 1667: } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 1668: if (IS_CONST == IS_VAR && !0) {
! 1669: PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 1670: }
! 1671: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 1672: goto return_by_value;
! 1673: }
! 1674: }
! 1675:
! 1676: if (EG(return_value_ptr_ptr)) {
! 1677: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
! 1678: Z_ADDREF_PP(retval_ptr_ptr);
! 1679:
! 1680: (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
! 1681: }
! 1682: } else {
! 1683: return_by_value:
! 1684:
! 1685: retval_ptr = &opline->op1.u.constant;
! 1686:
! 1687: if (!EG(return_value_ptr_ptr)) {
! 1688: if (IS_CONST == IS_TMP_VAR) {
! 1689:
! 1690: }
! 1691: } else if (!0) { /* Not a temp var */
! 1692: if (IS_CONST == IS_CONST ||
! 1693: EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
! 1694: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
! 1695: zval *ret;
! 1696:
! 1697: ALLOC_ZVAL(ret);
! 1698: INIT_PZVAL_COPY(ret, retval_ptr);
! 1699: zval_copy_ctor(ret);
! 1700: *EG(return_value_ptr_ptr) = ret;
! 1701: } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
! 1702: retval_ptr == &EG(uninitialized_zval)) {
! 1703: zval *ret;
! 1704:
! 1705: ALLOC_INIT_ZVAL(ret);
! 1706: *EG(return_value_ptr_ptr) = ret;
! 1707: } else {
! 1708: *EG(return_value_ptr_ptr) = retval_ptr;
! 1709: Z_ADDREF_P(retval_ptr);
! 1710: }
! 1711: } else {
! 1712: zval *ret;
! 1713:
! 1714: ALLOC_ZVAL(ret);
! 1715: INIT_PZVAL_COPY(ret, retval_ptr);
! 1716: *EG(return_value_ptr_ptr) = ret;
! 1717: }
! 1718: }
! 1719:
! 1720: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 1721: }
! 1722:
! 1723: static int ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1724: {
! 1725: zend_op *opline = EX(opline);
! 1726: zval *value;
! 1727: zval *exception;
! 1728:
! 1729:
! 1730: value = &opline->op1.u.constant;
! 1731:
! 1732: if (IS_CONST == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
! 1733: zend_error_noreturn(E_ERROR, "Can only throw objects");
! 1734: }
! 1735: zend_exception_save(TSRMLS_C);
! 1736: /* Not sure if a complete copy is what we want here */
! 1737: ALLOC_ZVAL(exception);
! 1738: INIT_PZVAL_COPY(exception, value);
! 1739: if (!0) {
! 1740: zval_copy_ctor(exception);
! 1741: }
! 1742:
! 1743: zend_throw_exception_object(exception TSRMLS_CC);
! 1744: zend_exception_restore(TSRMLS_C);
! 1745:
! 1746: ZEND_VM_NEXT_OPCODE();
! 1747: }
! 1748:
! 1749: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1750: {
! 1751: zend_op *opline = EX(opline);
! 1752: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
! 1753: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 1754: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
! 1755: }
! 1756: {
! 1757: zval *valptr;
! 1758: zval *value;
! 1759:
! 1760:
! 1761: value = &opline->op1.u.constant;
! 1762:
! 1763: ALLOC_ZVAL(valptr);
! 1764: INIT_PZVAL_COPY(valptr, value);
! 1765: if (!0) {
! 1766: zval_copy_ctor(valptr);
! 1767: }
! 1768: zend_vm_stack_push(valptr TSRMLS_CC);
! 1769:
! 1770: }
! 1771: ZEND_VM_NEXT_OPCODE();
! 1772: }
! 1773:
! 1774: static int ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1775: {
! 1776: zend_op *opline = EX(opline);
! 1777:
! 1778:
! 1779: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
! 1780: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(&opline->op1.u.constant);
! 1781: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 1782:
! 1783: ZEND_VM_NEXT_OPCODE();
! 1784: }
! 1785:
! 1786: static int ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1787: {
! 1788: zend_op *opline = EX(opline);
! 1789:
! 1790: zval *obj = &opline->op1.u.constant;
! 1791: zend_class_entry *ce;
! 1792: zend_function *clone;
! 1793: zend_object_clone_obj_t clone_call;
! 1794:
! 1795: if (IS_CONST == IS_CONST ||
! 1796: (IS_CONST == IS_VAR && !obj) ||
! 1797: Z_TYPE_P(obj) != IS_OBJECT) {
! 1798: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
! 1799: }
! 1800:
! 1801: ce = Z_OBJCE_P(obj);
! 1802: clone = ce ? ce->clone : NULL;
! 1803: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
! 1804: if (!clone_call) {
! 1805: if (ce) {
! 1806: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
! 1807: } else {
! 1808: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
! 1809: }
! 1810: }
! 1811:
! 1812: if (ce && clone) {
! 1813: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
! 1814: /* Ensure that if we're calling a private function, we're allowed to do so.
! 1815: */
! 1816: if (ce != EG(scope)) {
! 1817: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 1818: }
! 1819: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
! 1820: /* Ensure that if we're calling a protected function, we're allowed to do so.
! 1821: */
! 1822: if (!zend_check_protected(clone->common.scope, EG(scope))) {
! 1823: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 1824: }
! 1825: }
! 1826: }
! 1827:
! 1828: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 1829: if (!EG(exception)) {
! 1830: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 1831: Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
! 1832: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
! 1833: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 1834: Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 1835: if (!RETURN_VALUE_USED(opline) || EG(exception)) {
! 1836: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 1837: }
! 1838: }
! 1839:
! 1840: ZEND_VM_NEXT_OPCODE();
! 1841: }
! 1842:
! 1843: static int ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1844: {
! 1845: zend_op *opline = EX(opline);
! 1846:
! 1847: zval *expr = &opline->op1.u.constant;
! 1848: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 1849:
! 1850: if (opline->extended_value != IS_STRING) {
! 1851: *result = *expr;
! 1852: if (!0) {
! 1853: zendi_zval_copy_ctor(*result);
! 1854: }
! 1855: }
! 1856: switch (opline->extended_value) {
! 1857: case IS_NULL:
! 1858: convert_to_null(result);
! 1859: break;
! 1860: case IS_BOOL:
! 1861: convert_to_boolean(result);
! 1862: break;
! 1863: case IS_LONG:
! 1864: convert_to_long(result);
! 1865: break;
! 1866: case IS_DOUBLE:
! 1867: convert_to_double(result);
! 1868: break;
! 1869: case IS_STRING: {
! 1870: zval var_copy;
! 1871: int use_copy;
! 1872:
! 1873: zend_make_printable_zval(expr, &var_copy, &use_copy);
! 1874: if (use_copy) {
! 1875: *result = var_copy;
! 1876: if (0) {
! 1877:
! 1878: }
! 1879: } else {
! 1880: *result = *expr;
! 1881: if (!0) {
! 1882: zendi_zval_copy_ctor(*result);
! 1883: }
! 1884: }
! 1885: break;
! 1886: }
! 1887: case IS_ARRAY:
! 1888: convert_to_array(result);
! 1889: break;
! 1890: case IS_OBJECT:
! 1891: convert_to_object(result);
! 1892: break;
! 1893: }
! 1894:
! 1895: ZEND_VM_NEXT_OPCODE();
! 1896: }
! 1897:
! 1898: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 1899: {
! 1900: zend_op *opline = EX(opline);
! 1901: zend_op_array *new_op_array=NULL;
! 1902: int return_value_used;
! 1903:
! 1904: zval *inc_filename = &opline->op1.u.constant;
! 1905: zval tmp_inc_filename;
! 1906: zend_bool failure_retval=0;
! 1907:
! 1908: if (inc_filename->type!=IS_STRING) {
! 1909: tmp_inc_filename = *inc_filename;
! 1910: zval_copy_ctor(&tmp_inc_filename);
! 1911: convert_to_string(&tmp_inc_filename);
! 1912: inc_filename = &tmp_inc_filename;
! 1913: }
! 1914:
! 1915: return_value_used = RETURN_VALUE_USED(opline);
! 1916:
! 1917: if (Z_LVAL(opline->op2.u.constant) != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
! 1918: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE || Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE) {
! 1919: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 1920: } else {
! 1921: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 1922: }
! 1923: } else {
! 1924: switch (Z_LVAL(opline->op2.u.constant)) {
! 1925: case ZEND_INCLUDE_ONCE:
! 1926: case ZEND_REQUIRE_ONCE: {
! 1927: zend_file_handle file_handle;
! 1928: char *resolved_path;
! 1929:
! 1930: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
! 1931: if (resolved_path) {
! 1932: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
! 1933: } else {
! 1934: resolved_path = Z_STRVAL_P(inc_filename);
! 1935: }
! 1936:
! 1937: if (failure_retval) {
! 1938: /* do nothing, file already included */
! 1939: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
! 1940:
! 1941: if (!file_handle.opened_path) {
! 1942: file_handle.opened_path = estrdup(resolved_path);
! 1943: }
! 1944:
! 1945: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
! 1946: new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
! 1947: zend_destroy_file_handle(&file_handle TSRMLS_CC);
! 1948: } else {
! 1949: zend_file_handle_dtor(&file_handle TSRMLS_CC);
! 1950: failure_retval=1;
! 1951: }
! 1952: } else {
! 1953: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
! 1954: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 1955: } else {
! 1956: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 1957: }
! 1958: }
! 1959: if (resolved_path != Z_STRVAL_P(inc_filename)) {
! 1960: efree(resolved_path);
! 1961: }
! 1962: }
! 1963: break;
! 1964: case ZEND_INCLUDE:
! 1965: case ZEND_REQUIRE:
! 1966: new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
! 1967: break;
! 1968: case ZEND_EVAL: {
! 1969: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
! 1970:
! 1971: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
! 1972: efree(eval_desc);
! 1973: }
! 1974: break;
! 1975: EMPTY_SWITCH_DEFAULT_CASE()
! 1976: }
! 1977: }
! 1978: if (inc_filename==&tmp_inc_filename) {
! 1979: zval_dtor(&tmp_inc_filename);
! 1980: }
! 1981:
! 1982: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 1983: if (new_op_array && !EG(exception)) {
! 1984: EX(original_return_value) = EG(return_value_ptr_ptr);
! 1985: EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
! 1986: EG(active_op_array) = new_op_array;
! 1987: EX_T(opline->result.u.var).var.ptr = NULL;
! 1988:
! 1989: EX(current_object) = EX(object);
! 1990:
! 1991: EX(function_state).function = (zend_function *) new_op_array;
! 1992: EX(object) = NULL;
! 1993:
! 1994: if (!EG(active_symbol_table)) {
! 1995: zend_rebuild_symbol_table(TSRMLS_C);
! 1996: }
! 1997:
! 1998: if (zend_execute == execute) {
! 1999: EX(call_opline) = opline;
! 2000: ZEND_VM_ENTER();
! 2001: } else {
! 2002: zend_execute(new_op_array TSRMLS_CC);
! 2003: }
! 2004:
! 2005: EX(function_state).function = (zend_function *) EX(op_array);
! 2006: EX(object) = EX(current_object);
! 2007:
! 2008: if (return_value_used) {
! 2009: if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
! 2010: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 2011: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 2012: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
! 2013: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 2014: }
! 2015: }
! 2016:
! 2017: EG(opline_ptr) = &EX(opline);
! 2018: EG(active_op_array) = EX(op_array);
! 2019: EG(return_value_ptr_ptr) = EX(original_return_value);
! 2020: destroy_op_array(new_op_array TSRMLS_CC);
! 2021: efree(new_op_array);
! 2022: if (EG(exception)) {
! 2023: zend_throw_exception_internal(NULL TSRMLS_CC);
! 2024: }
! 2025: } else {
! 2026: if (return_value_used) {
! 2027: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 2028: INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
! 2029: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
! 2030: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 2031: }
! 2032: }
! 2033: ZEND_VM_NEXT_OPCODE();
! 2034: }
! 2035:
! 2036: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2037: {
! 2038: zend_op *opline = EX(opline);
! 2039: zval tmp, *varname;
! 2040: HashTable *target_symbol_table;
! 2041:
! 2042:
! 2043: if (IS_CONST == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 2044: if (EG(active_symbol_table)) {
! 2045: zend_execute_data *ex = EX(prev_execute_data);
! 2046: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 2047:
! 2048: if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
! 2049: while (ex && ex->symbol_table == EG(active_symbol_table)) {
! 2050: int i;
! 2051:
! 2052: if (ex->op_array) {
! 2053: for (i = 0; i < ex->op_array->last_var; i++) {
! 2054: if (ex->op_array->vars[i].hash_value == cv->hash_value &&
! 2055: ex->op_array->vars[i].name_len == cv->name_len &&
! 2056: !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
! 2057: ex->CVs[i] = NULL;
! 2058: break;
! 2059: }
! 2060: }
! 2061: }
! 2062: ex = ex->prev_execute_data;
! 2063: }
! 2064: }
! 2065: EX(CVs)[opline->op1.u.var] = NULL;
! 2066: } else if (EX(CVs)[opline->op1.u.var]) {
! 2067: zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
! 2068: EX(CVs)[opline->op1.u.var] = NULL;
! 2069: }
! 2070: ZEND_VM_NEXT_OPCODE();
! 2071: }
! 2072:
! 2073: varname = &opline->op1.u.constant;
! 2074:
! 2075: if (Z_TYPE_P(varname) != IS_STRING) {
! 2076: tmp = *varname;
! 2077: zval_copy_ctor(&tmp);
! 2078: convert_to_string(&tmp);
! 2079: varname = &tmp;
! 2080: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
! 2081: Z_ADDREF_P(varname);
! 2082: }
! 2083:
! 2084: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 2085: zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
! 2086: } else {
! 2087: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
! 2088:
! 2089: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 2090: if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
! 2091: zend_execute_data *ex = execute_data;
! 2092:
! 2093: do {
! 2094: int i;
! 2095:
! 2096: if (ex->op_array) {
! 2097: for (i = 0; i < ex->op_array->last_var; i++) {
! 2098: if (ex->op_array->vars[i].hash_value == hash_value &&
! 2099: ex->op_array->vars[i].name_len == varname->value.str.len &&
! 2100: !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
! 2101: ex->CVs[i] = NULL;
! 2102: break;
! 2103: }
! 2104: }
! 2105: }
! 2106: ex = ex->prev_execute_data;
! 2107: } while (ex && ex->symbol_table == target_symbol_table);
! 2108: }
! 2109: }
! 2110:
! 2111: if (varname == &tmp) {
! 2112: zval_dtor(&tmp);
! 2113: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
! 2114: zval_ptr_dtor(&varname);
! 2115: }
! 2116:
! 2117: ZEND_VM_NEXT_OPCODE();
! 2118: }
! 2119:
! 2120: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2121: {
! 2122: zend_op *opline = EX(opline);
! 2123:
! 2124: zval *array_ptr, **array_ptr_ptr;
! 2125: HashTable *fe_ht;
! 2126: zend_object_iterator *iter = NULL;
! 2127: zend_class_entry *ce = NULL;
! 2128: zend_bool is_empty = 0;
! 2129:
! 2130: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 2131: array_ptr_ptr = NULL;
! 2132: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
! 2133: ALLOC_INIT_ZVAL(array_ptr);
! 2134: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
! 2135: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
! 2136: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
! 2137: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 2138: }
! 2139:
! 2140: ce = Z_OBJCE_PP(array_ptr_ptr);
! 2141: if (!ce || ce->get_iterator == NULL) {
! 2142: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 2143: Z_ADDREF_PP(array_ptr_ptr);
! 2144: }
! 2145: array_ptr = *array_ptr_ptr;
! 2146: } else {
! 2147: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
! 2148: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 2149: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
! 2150: Z_SET_ISREF_PP(array_ptr_ptr);
! 2151: }
! 2152: }
! 2153: array_ptr = *array_ptr_ptr;
! 2154: Z_ADDREF_P(array_ptr);
! 2155: }
! 2156: } else {
! 2157: array_ptr = &opline->op1.u.constant;
! 2158: if (0) { /* IS_TMP_VAR */
! 2159: zval *tmp;
! 2160:
! 2161: ALLOC_ZVAL(tmp);
! 2162: INIT_PZVAL_COPY(tmp, array_ptr);
! 2163: array_ptr = tmp;
! 2164: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 2165: ce = Z_OBJCE_P(array_ptr);
! 2166: if (ce && ce->get_iterator) {
! 2167: Z_DELREF_P(array_ptr);
! 2168: }
! 2169: }
! 2170: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 2171: ce = Z_OBJCE_P(array_ptr);
! 2172: if (!ce || !ce->get_iterator) {
! 2173: Z_ADDREF_P(array_ptr);
! 2174: }
! 2175: } else if (IS_CONST == IS_CONST ||
! 2176: ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
! 2177: !Z_ISREF_P(array_ptr) &&
! 2178: Z_REFCOUNT_P(array_ptr) > 1)) {
! 2179: zval *tmp;
! 2180:
! 2181: ALLOC_ZVAL(tmp);
! 2182: INIT_PZVAL_COPY(tmp, array_ptr);
! 2183: zval_copy_ctor(tmp);
! 2184: array_ptr = tmp;
! 2185: } else {
! 2186: Z_ADDREF_P(array_ptr);
! 2187: }
! 2188: }
! 2189:
! 2190: if (ce && ce->get_iterator) {
! 2191: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
! 2192:
! 2193: if (iter && !EG(exception)) {
! 2194: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
! 2195: } else {
! 2196: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 2197:
! 2198: } else {
! 2199:
! 2200: }
! 2201: if (!EG(exception)) {
! 2202: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
! 2203: }
! 2204: zend_throw_exception_internal(NULL TSRMLS_CC);
! 2205: ZEND_VM_NEXT_OPCODE();
! 2206: }
! 2207: }
! 2208:
! 2209: AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
! 2210: PZVAL_LOCK(array_ptr);
! 2211:
! 2212: if (iter) {
! 2213: iter->index = 0;
! 2214: if (iter->funcs->rewind) {
! 2215: iter->funcs->rewind(iter TSRMLS_CC);
! 2216: if (EG(exception)) {
! 2217: Z_DELREF_P(array_ptr);
! 2218: zval_ptr_dtor(&array_ptr);
! 2219: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 2220:
! 2221: } else {
! 2222:
! 2223: }
! 2224: ZEND_VM_NEXT_OPCODE();
! 2225: }
! 2226: }
! 2227: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
! 2228: if (EG(exception)) {
! 2229: Z_DELREF_P(array_ptr);
! 2230: zval_ptr_dtor(&array_ptr);
! 2231: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 2232:
! 2233: } else {
! 2234:
! 2235: }
! 2236: ZEND_VM_NEXT_OPCODE();
! 2237: }
! 2238: iter->index = -1; /* will be set to 0 before using next handler */
! 2239: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
! 2240: zend_hash_internal_pointer_reset(fe_ht);
! 2241: if (ce) {
! 2242: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
! 2243: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
! 2244: char *str_key;
! 2245: uint str_key_len;
! 2246: ulong int_key;
! 2247: zend_uchar key_type;
! 2248:
! 2249: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
! 2250: if (key_type != HASH_KEY_NON_EXISTANT &&
! 2251: (key_type == HASH_KEY_IS_LONG ||
! 2252: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
! 2253: break;
! 2254: }
! 2255: zend_hash_move_forward(fe_ht);
! 2256: }
! 2257: }
! 2258: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
! 2259: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
! 2260: } else {
! 2261: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
! 2262: is_empty = 1;
! 2263: }
! 2264:
! 2265: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 2266:
! 2267: } else {
! 2268:
! 2269: }
! 2270: if (is_empty) {
! 2271: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 2272: } else {
! 2273: ZEND_VM_NEXT_OPCODE();
! 2274: }
! 2275: }
! 2276:
! 2277: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2278: {
! 2279: zend_op *opline = EX(opline);
! 2280: zval **value;
! 2281: zend_bool isset = 1;
! 2282:
! 2283: if (IS_CONST == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 2284: if (EX(CVs)[opline->op1.u.var]) {
! 2285: value = EX(CVs)[opline->op1.u.var];
! 2286: } else if (EG(active_symbol_table)) {
! 2287: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 2288:
! 2289: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
! 2290: isset = 0;
! 2291: }
! 2292: } else {
! 2293: isset = 0;
! 2294: }
! 2295: } else {
! 2296: HashTable *target_symbol_table;
! 2297:
! 2298: zval tmp, *varname = &opline->op1.u.constant;
! 2299:
! 2300: if (Z_TYPE_P(varname) != IS_STRING) {
! 2301: tmp = *varname;
! 2302: zval_copy_ctor(&tmp);
! 2303: convert_to_string(&tmp);
! 2304: varname = &tmp;
! 2305: }
! 2306:
! 2307: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 2308: 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);
! 2309: if (!value) {
! 2310: isset = 0;
! 2311: }
! 2312: } else {
! 2313: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 2314: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
! 2315: isset = 0;
! 2316: }
! 2317: }
! 2318:
! 2319: if (varname == &tmp) {
! 2320: zval_dtor(&tmp);
! 2321: }
! 2322:
! 2323: }
! 2324:
! 2325: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 2326:
! 2327: switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
! 2328: case ZEND_ISSET:
! 2329: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 2330: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 2331: } else {
! 2332: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
! 2333: }
! 2334: break;
! 2335: case ZEND_ISEMPTY:
! 2336: if (!isset || !i_zend_is_true(*value)) {
! 2337: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 2338: } else {
! 2339: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 2340: }
! 2341: break;
! 2342: }
! 2343:
! 2344: ZEND_VM_NEXT_OPCODE();
! 2345: }
! 2346:
! 2347: static int ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2348: {
! 2349: #if 0 || (IS_CONST != IS_UNUSED)
! 2350: zend_op *opline = EX(opline);
! 2351: if (IS_CONST != IS_UNUSED) {
! 2352:
! 2353: zval *ptr = &opline->op1.u.constant;
! 2354:
! 2355: if (Z_TYPE_P(ptr) == IS_LONG) {
! 2356: EG(exit_status) = Z_LVAL_P(ptr);
! 2357: } else {
! 2358: zend_print_variable(ptr);
! 2359: }
! 2360:
! 2361: }
! 2362: #endif
! 2363: zend_bailout();
! 2364: ZEND_VM_NEXT_OPCODE();
! 2365: }
! 2366:
! 2367: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2368: {
! 2369: zend_op *opline = EX(opline);
! 2370:
! 2371: zval *value = &opline->op1.u.constant;
! 2372:
! 2373: if (i_zend_is_true(value)) {
! 2374: EX_T(opline->result.u.var).tmp_var = *value;
! 2375: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 2376:
! 2377: #if DEBUG_ZEND>=2
! 2378: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 2379: #endif
! 2380: ZEND_VM_JMP(opline->op2.u.jmp_addr);
! 2381: }
! 2382:
! 2383: ZEND_VM_NEXT_OPCODE();
! 2384: }
! 2385:
! 2386: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2387: {
! 2388: zend_op *opline = EX(opline);
! 2389:
! 2390: zval *value = &opline->op1.u.constant;
! 2391:
! 2392: EX_T(opline->result.u.var).tmp_var = *value;
! 2393: if (!0) {
! 2394: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 2395: }
! 2396:
! 2397: ZEND_VM_NEXT_OPCODE();
! 2398: }
! 2399:
! 2400: static int ZEND_FASTCALL ZEND_TICKS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2401: {
! 2402: zend_op *opline = EX(opline);
! 2403:
! 2404: if (++EG(ticks_count)>=Z_LVAL(opline->op1.u.constant)) {
! 2405: EG(ticks_count)=0;
! 2406: if (zend_ticks_function) {
! 2407: zend_ticks_function(Z_LVAL(opline->op1.u.constant));
! 2408: }
! 2409: }
! 2410: ZEND_VM_NEXT_OPCODE();
! 2411: }
! 2412:
! 2413: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2414: {
! 2415: zend_op *opline = EX(opline);
! 2416:
! 2417:
! 2418: add_function(&EX_T(opline->result.u.var).tmp_var,
! 2419: &opline->op1.u.constant,
! 2420: &opline->op2.u.constant TSRMLS_CC);
! 2421:
! 2422:
! 2423: ZEND_VM_NEXT_OPCODE();
! 2424: }
! 2425:
! 2426: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2427: {
! 2428: zend_op *opline = EX(opline);
! 2429:
! 2430:
! 2431: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 2432: &opline->op1.u.constant,
! 2433: &opline->op2.u.constant TSRMLS_CC);
! 2434:
! 2435:
! 2436: ZEND_VM_NEXT_OPCODE();
! 2437: }
! 2438:
! 2439: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2440: {
! 2441: zend_op *opline = EX(opline);
! 2442:
! 2443:
! 2444: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 2445: &opline->op1.u.constant,
! 2446: &opline->op2.u.constant TSRMLS_CC);
! 2447:
! 2448:
! 2449: ZEND_VM_NEXT_OPCODE();
! 2450: }
! 2451:
! 2452: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2453: {
! 2454: zend_op *opline = EX(opline);
! 2455:
! 2456:
! 2457: div_function(&EX_T(opline->result.u.var).tmp_var,
! 2458: &opline->op1.u.constant,
! 2459: &opline->op2.u.constant TSRMLS_CC);
! 2460:
! 2461:
! 2462: ZEND_VM_NEXT_OPCODE();
! 2463: }
! 2464:
! 2465: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2466: {
! 2467: zend_op *opline = EX(opline);
! 2468:
! 2469:
! 2470: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 2471: &opline->op1.u.constant,
! 2472: &opline->op2.u.constant TSRMLS_CC);
! 2473:
! 2474:
! 2475: ZEND_VM_NEXT_OPCODE();
! 2476: }
! 2477:
! 2478: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2479: {
! 2480: zend_op *opline = EX(opline);
! 2481:
! 2482:
! 2483: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 2484: &opline->op1.u.constant,
! 2485: &opline->op2.u.constant TSRMLS_CC);
! 2486:
! 2487:
! 2488: ZEND_VM_NEXT_OPCODE();
! 2489: }
! 2490:
! 2491: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2492: {
! 2493: zend_op *opline = EX(opline);
! 2494:
! 2495:
! 2496: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 2497: &opline->op1.u.constant,
! 2498: &opline->op2.u.constant TSRMLS_CC);
! 2499:
! 2500:
! 2501: ZEND_VM_NEXT_OPCODE();
! 2502: }
! 2503:
! 2504: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2505: {
! 2506: zend_op *opline = EX(opline);
! 2507:
! 2508:
! 2509: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 2510: &opline->op1.u.constant,
! 2511: &opline->op2.u.constant TSRMLS_CC);
! 2512:
! 2513:
! 2514: ZEND_VM_NEXT_OPCODE();
! 2515: }
! 2516:
! 2517: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2518: {
! 2519: zend_op *opline = EX(opline);
! 2520:
! 2521:
! 2522: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 2523: &opline->op1.u.constant,
! 2524: &opline->op2.u.constant TSRMLS_CC);
! 2525:
! 2526:
! 2527: ZEND_VM_NEXT_OPCODE();
! 2528: }
! 2529:
! 2530: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2531: {
! 2532: zend_op *opline = EX(opline);
! 2533:
! 2534: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 2535:
! 2536: is_identical_function(result,
! 2537: &opline->op1.u.constant,
! 2538: &opline->op2.u.constant TSRMLS_CC);
! 2539: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 2540:
! 2541:
! 2542: ZEND_VM_NEXT_OPCODE();
! 2543: }
! 2544:
! 2545: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2546: {
! 2547: zend_op *opline = EX(opline);
! 2548:
! 2549: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 2550:
! 2551: compare_function(result,
! 2552: &opline->op1.u.constant,
! 2553: &opline->op2.u.constant TSRMLS_CC);
! 2554: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 2555:
! 2556:
! 2557: ZEND_VM_NEXT_OPCODE();
! 2558: }
! 2559:
! 2560: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2561: {
! 2562: zend_op *opline = EX(opline);
! 2563:
! 2564: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 2565:
! 2566: compare_function(result,
! 2567: &opline->op1.u.constant,
! 2568: &opline->op2.u.constant TSRMLS_CC);
! 2569: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 2570:
! 2571:
! 2572: ZEND_VM_NEXT_OPCODE();
! 2573: }
! 2574:
! 2575: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2576: {
! 2577: zend_op *opline = EX(opline);
! 2578:
! 2579: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 2580:
! 2581: compare_function(result,
! 2582: &opline->op1.u.constant,
! 2583: &opline->op2.u.constant TSRMLS_CC);
! 2584: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 2585:
! 2586:
! 2587: ZEND_VM_NEXT_OPCODE();
! 2588: }
! 2589:
! 2590: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2591: {
! 2592: zend_op *opline = EX(opline);
! 2593:
! 2594: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 2595:
! 2596: compare_function(result,
! 2597: &opline->op1.u.constant,
! 2598: &opline->op2.u.constant TSRMLS_CC);
! 2599: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 2600:
! 2601:
! 2602: ZEND_VM_NEXT_OPCODE();
! 2603: }
! 2604:
! 2605: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2606: {
! 2607: zend_op *opline = EX(opline);
! 2608:
! 2609:
! 2610: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 2611: &opline->op1.u.constant,
! 2612: &opline->op2.u.constant TSRMLS_CC);
! 2613:
! 2614:
! 2615: ZEND_VM_NEXT_OPCODE();
! 2616: }
! 2617:
! 2618: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2619: {
! 2620: zend_op *opline = EX(opline);
! 2621:
! 2622:
! 2623: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 2624: &opline->op1.u.constant,
! 2625: &opline->op2.u.constant TSRMLS_CC);
! 2626:
! 2627:
! 2628: ZEND_VM_NEXT_OPCODE();
! 2629: }
! 2630:
! 2631: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2632: {
! 2633: zend_op *opline = EX(opline);
! 2634:
! 2635:
! 2636: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 2637: &opline->op1.u.constant,
! 2638: &opline->op2.u.constant TSRMLS_CC);
! 2639:
! 2640:
! 2641: ZEND_VM_NEXT_OPCODE();
! 2642: }
! 2643:
! 2644: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2645: {
! 2646: zend_op *opline = EX(opline);
! 2647:
! 2648:
! 2649: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 2650: &opline->op1.u.constant,
! 2651: &opline->op2.u.constant TSRMLS_CC);
! 2652:
! 2653:
! 2654: ZEND_VM_NEXT_OPCODE();
! 2655: }
! 2656:
! 2657: static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2658: {
! 2659: zend_op *opline = EX(opline);
! 2660:
! 2661: zval *container = &opline->op1.u.constant;
! 2662:
! 2663: if (Z_TYPE_P(container) != IS_ARRAY) {
! 2664: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 2665: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 2666: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 2667: }
! 2668: } else {
! 2669:
! 2670: zval *dim = &opline->op2.u.constant;
! 2671:
! 2672: 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));
! 2673: SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
! 2674:
! 2675: }
! 2676: ZEND_VM_NEXT_OPCODE();
! 2677: }
! 2678:
! 2679: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2680: {
! 2681: zend_op *opline = EX(opline);
! 2682: zval *function_name;
! 2683: zend_class_entry *ce;
! 2684:
! 2685: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 2686:
! 2687: if (IS_CONST == IS_CONST) {
! 2688: /* no function found. try a static method in class */
! 2689: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 2690: if (!ce) {
! 2691: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 2692: }
! 2693: EX(called_scope) = ce;
! 2694: } else {
! 2695: ce = EX_T(opline->op1.u.var).class_entry;
! 2696:
! 2697: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 2698: EX(called_scope) = EG(called_scope);
! 2699: } else {
! 2700: EX(called_scope) = ce;
! 2701: }
! 2702: }
! 2703: if(IS_CONST != IS_UNUSED) {
! 2704: char *function_name_strval = NULL;
! 2705: int function_name_strlen = 0;
! 2706:
! 2707:
! 2708: if (IS_CONST == IS_CONST) {
! 2709: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 2710: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 2711: } else {
! 2712: function_name = &opline->op2.u.constant;
! 2713:
! 2714: if (Z_TYPE_P(function_name) != IS_STRING) {
! 2715: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 2716: } else {
! 2717: function_name_strval = Z_STRVAL_P(function_name);
! 2718: function_name_strlen = Z_STRLEN_P(function_name);
! 2719: }
! 2720: }
! 2721:
! 2722: if (function_name_strval) {
! 2723: if (ce->get_static_method) {
! 2724: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 2725: } else {
! 2726: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 2727: }
! 2728: if (!EX(fbc)) {
! 2729: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 2730: }
! 2731: }
! 2732:
! 2733: if (IS_CONST != IS_CONST) {
! 2734:
! 2735: }
! 2736: } else {
! 2737: if(!ce->constructor) {
! 2738: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 2739: }
! 2740: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 2741: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 2742: }
! 2743: EX(fbc) = ce->constructor;
! 2744: }
! 2745:
! 2746: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 2747: EX(object) = NULL;
! 2748: } else {
! 2749: if (EG(This) &&
! 2750: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 2751: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 2752: /* We are calling method of the other (incompatible) class,
! 2753: but passing $this. This is done for compatibility with php-4. */
! 2754: int severity;
! 2755: char *verb;
! 2756: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 2757: severity = E_STRICT;
! 2758: verb = "should not";
! 2759: } else {
! 2760: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 2761: severity = E_ERROR;
! 2762: verb = "cannot";
! 2763: }
! 2764: 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);
! 2765:
! 2766: }
! 2767: if ((EX(object) = EG(This))) {
! 2768: Z_ADDREF_P(EX(object));
! 2769: EX(called_scope) = Z_OBJCE_P(EX(object));
! 2770: }
! 2771: }
! 2772:
! 2773: ZEND_VM_NEXT_OPCODE();
! 2774: }
! 2775:
! 2776: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2777: {
! 2778: zend_op *opline = EX(opline);
! 2779: int switch_expr_is_overloaded=0;
! 2780:
! 2781:
! 2782: if (IS_CONST==IS_VAR) {
! 2783: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 2784: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 2785: } else {
! 2786: switch_expr_is_overloaded = 1;
! 2787: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 2788: }
! 2789: }
! 2790: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 2791: &opline->op1.u.constant,
! 2792: &opline->op2.u.constant TSRMLS_CC);
! 2793:
! 2794: if (switch_expr_is_overloaded) {
! 2795: /* We only free op1 if this is a string offset,
! 2796: * Since if it is a TMP_VAR, it'll be reused by
! 2797: * other CASE opcodes (whereas string offsets
! 2798: * are allocated at each get_zval_ptr())
! 2799: */
! 2800:
! 2801: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 2802: EX_T(opline->op1.u.var).var.ptr = NULL;
! 2803: }
! 2804: ZEND_VM_NEXT_OPCODE();
! 2805: }
! 2806:
! 2807: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2808: {
! 2809: zend_op *opline = EX(opline);
! 2810:
! 2811: if (IS_CONST == IS_UNUSED) {
! 2812: /* namespaced constant */
! 2813: 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)) {
! 2814: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
! 2815: char *actual = (char *)zend_memrchr(Z_STRVAL(opline->op2.u.constant), '\\', Z_STRLEN(opline->op2.u.constant));
! 2816: if(!actual) {
! 2817: actual = Z_STRVAL(opline->op2.u.constant);
! 2818: } else {
! 2819: actual++;
! 2820: }
! 2821: /* non-qualified constant - allow text substitution */
! 2822: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
! 2823: 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);
! 2824: } else {
! 2825: zend_error_noreturn(E_ERROR, "Undefined constant '%s'",
! 2826: Z_STRVAL(opline->op2.u.constant), Z_STRVAL(opline->op2.u.constant));
! 2827: }
! 2828: }
! 2829: ZEND_VM_NEXT_OPCODE();
! 2830: } else {
! 2831: /* class constant */
! 2832: zend_class_entry *ce;
! 2833: zval **value;
! 2834:
! 2835: if (IS_CONST == IS_CONST) {
! 2836:
! 2837: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 2838: if (!ce) {
! 2839: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 2840: }
! 2841: } else {
! 2842: ce = EX_T(opline->op1.u.var).class_entry;
! 2843: }
! 2844:
! 2845: if (zend_hash_find(&ce->constants_table, Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void **) &value) == SUCCESS) {
! 2846: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
! 2847: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
! 2848: zend_class_entry *old_scope = EG(scope);
! 2849:
! 2850: EG(scope) = ce;
! 2851: zval_update_constant(value, (void *) 1 TSRMLS_CC);
! 2852: EG(scope) = old_scope;
! 2853: }
! 2854: EX_T(opline->result.u.var).tmp_var = **value;
! 2855: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 2856: } else {
! 2857: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 2858: }
! 2859:
! 2860: ZEND_VM_NEXT_OPCODE();
! 2861: }
! 2862: }
! 2863:
! 2864: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2865: {
! 2866: zend_op *opline = EX(opline);
! 2867:
! 2868: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 2869: zval *expr_ptr;
! 2870: zval *offset=&opline->op2.u.constant;
! 2871:
! 2872: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 2873: zval **expr_ptr_ptr = NULL;
! 2874:
! 2875: if (opline->extended_value) {
! 2876: expr_ptr_ptr=NULL;
! 2877: expr_ptr = *expr_ptr_ptr;
! 2878: } else {
! 2879: expr_ptr=&opline->op1.u.constant;
! 2880: }
! 2881: #else
! 2882: expr_ptr=&opline->op1.u.constant;
! 2883: #endif
! 2884:
! 2885: if (0) { /* temporary variable */
! 2886: zval *new_expr;
! 2887:
! 2888: ALLOC_ZVAL(new_expr);
! 2889: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 2890: expr_ptr = new_expr;
! 2891: } else {
! 2892: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 2893: if (opline->extended_value) {
! 2894: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 2895: expr_ptr = *expr_ptr_ptr;
! 2896: Z_ADDREF_P(expr_ptr);
! 2897: } else
! 2898: #endif
! 2899: if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 2900: zval *new_expr;
! 2901:
! 2902: ALLOC_ZVAL(new_expr);
! 2903: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 2904: expr_ptr = new_expr;
! 2905: zendi_zval_copy_ctor(*expr_ptr);
! 2906: } else {
! 2907: Z_ADDREF_P(expr_ptr);
! 2908: }
! 2909: }
! 2910: if (offset) {
! 2911: switch (Z_TYPE_P(offset)) {
! 2912: case IS_DOUBLE:
! 2913: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 2914: break;
! 2915: case IS_LONG:
! 2916: case IS_BOOL:
! 2917: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 2918: break;
! 2919: case IS_STRING:
! 2920: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 2921: break;
! 2922: case IS_NULL:
! 2923: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 2924: break;
! 2925: default:
! 2926: zend_error(E_WARNING, "Illegal offset type");
! 2927: zval_ptr_dtor(&expr_ptr);
! 2928: /* do nothing */
! 2929: break;
! 2930: }
! 2931:
! 2932: } else {
! 2933: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 2934: }
! 2935: if (opline->extended_value) {
! 2936:
! 2937: } else {
! 2938:
! 2939: }
! 2940: ZEND_VM_NEXT_OPCODE();
! 2941: }
! 2942:
! 2943: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2944: {
! 2945: zend_op *opline = EX(opline);
! 2946:
! 2947: array_init(&EX_T(opline->result.u.var).tmp_var);
! 2948: if (IS_CONST == IS_UNUSED) {
! 2949: ZEND_VM_NEXT_OPCODE();
! 2950: #if 0 || IS_CONST != IS_UNUSED
! 2951: } else {
! 2952: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 2953: #endif
! 2954: }
! 2955: }
! 2956:
! 2957: static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2958: {
! 2959: zend_op *opline = EX(opline);
! 2960:
! 2961: zval *name = &opline->op1.u.constant;
! 2962: zval *val = &opline->op2.u.constant;
! 2963: zend_constant c;
! 2964:
! 2965: if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
! 2966: zval tmp = *val;
! 2967: zval *tmp_ptr = &tmp;
! 2968:
! 2969: if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
! 2970: zval_copy_ctor(&tmp);
! 2971: }
! 2972: INIT_PZVAL(&tmp);
! 2973: zval_update_constant(&tmp_ptr, NULL TSRMLS_CC);
! 2974: c.value = *tmp_ptr;
! 2975: } else {
! 2976: c.value = *val;
! 2977: zval_copy_ctor(&c.value);
! 2978: }
! 2979: c.flags = CONST_CS; /* non persistent, case sensetive */
! 2980: c.name = zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name));
! 2981: c.name_len = Z_STRLEN_P(name)+1;
! 2982: c.module_number = PHP_USER_CONSTANT;
! 2983:
! 2984: if (zend_register_constant(&c TSRMLS_CC) == FAILURE) {
! 2985: }
! 2986:
! 2987:
! 2988: ZEND_VM_NEXT_OPCODE();
! 2989: }
! 2990:
! 2991: static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 2992: {
! 2993: zend_op *opline = EX(opline);
! 2994: zend_function *op_array;
! 2995:
! 2996: 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 ||
! 2997: op_array->type != ZEND_USER_FUNCTION) {
! 2998: zend_error_noreturn(E_ERROR, "Base lambda function for closure not found");
! 2999: }
! 3000:
! 3001: zend_create_closure(&EX_T(opline->result.u.var).tmp_var, op_array TSRMLS_CC);
! 3002:
! 3003: ZEND_VM_NEXT_OPCODE();
! 3004: }
! 3005:
! 3006: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3007: {
! 3008: zend_op *opline = EX(opline);
! 3009: zend_free_op free_op2;
! 3010:
! 3011: add_function(&EX_T(opline->result.u.var).tmp_var,
! 3012: &opline->op1.u.constant,
! 3013: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3014:
! 3015: zval_dtor(free_op2.var);
! 3016: ZEND_VM_NEXT_OPCODE();
! 3017: }
! 3018:
! 3019: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3020: {
! 3021: zend_op *opline = EX(opline);
! 3022: zend_free_op free_op2;
! 3023:
! 3024: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 3025: &opline->op1.u.constant,
! 3026: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3027:
! 3028: zval_dtor(free_op2.var);
! 3029: ZEND_VM_NEXT_OPCODE();
! 3030: }
! 3031:
! 3032: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3033: {
! 3034: zend_op *opline = EX(opline);
! 3035: zend_free_op free_op2;
! 3036:
! 3037: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 3038: &opline->op1.u.constant,
! 3039: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3040:
! 3041: zval_dtor(free_op2.var);
! 3042: ZEND_VM_NEXT_OPCODE();
! 3043: }
! 3044:
! 3045: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3046: {
! 3047: zend_op *opline = EX(opline);
! 3048: zend_free_op free_op2;
! 3049:
! 3050: div_function(&EX_T(opline->result.u.var).tmp_var,
! 3051: &opline->op1.u.constant,
! 3052: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3053:
! 3054: zval_dtor(free_op2.var);
! 3055: ZEND_VM_NEXT_OPCODE();
! 3056: }
! 3057:
! 3058: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3059: {
! 3060: zend_op *opline = EX(opline);
! 3061: zend_free_op free_op2;
! 3062:
! 3063: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 3064: &opline->op1.u.constant,
! 3065: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3066:
! 3067: zval_dtor(free_op2.var);
! 3068: ZEND_VM_NEXT_OPCODE();
! 3069: }
! 3070:
! 3071: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3072: {
! 3073: zend_op *opline = EX(opline);
! 3074: zend_free_op free_op2;
! 3075:
! 3076: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 3077: &opline->op1.u.constant,
! 3078: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3079:
! 3080: zval_dtor(free_op2.var);
! 3081: ZEND_VM_NEXT_OPCODE();
! 3082: }
! 3083:
! 3084: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3085: {
! 3086: zend_op *opline = EX(opline);
! 3087: zend_free_op free_op2;
! 3088:
! 3089: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 3090: &opline->op1.u.constant,
! 3091: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3092:
! 3093: zval_dtor(free_op2.var);
! 3094: ZEND_VM_NEXT_OPCODE();
! 3095: }
! 3096:
! 3097: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3098: {
! 3099: zend_op *opline = EX(opline);
! 3100: zend_free_op free_op2;
! 3101:
! 3102: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 3103: &opline->op1.u.constant,
! 3104: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3105:
! 3106: zval_dtor(free_op2.var);
! 3107: ZEND_VM_NEXT_OPCODE();
! 3108: }
! 3109:
! 3110: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3111: {
! 3112: zend_op *opline = EX(opline);
! 3113: zend_free_op free_op2;
! 3114:
! 3115: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 3116: &opline->op1.u.constant,
! 3117: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3118:
! 3119: zval_dtor(free_op2.var);
! 3120: ZEND_VM_NEXT_OPCODE();
! 3121: }
! 3122:
! 3123: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3124: {
! 3125: zend_op *opline = EX(opline);
! 3126: zend_free_op free_op2;
! 3127: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3128:
! 3129: is_identical_function(result,
! 3130: &opline->op1.u.constant,
! 3131: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3132: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 3133:
! 3134: zval_dtor(free_op2.var);
! 3135: ZEND_VM_NEXT_OPCODE();
! 3136: }
! 3137:
! 3138: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3139: {
! 3140: zend_op *opline = EX(opline);
! 3141: zend_free_op free_op2;
! 3142: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3143:
! 3144: compare_function(result,
! 3145: &opline->op1.u.constant,
! 3146: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3147: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 3148:
! 3149: zval_dtor(free_op2.var);
! 3150: ZEND_VM_NEXT_OPCODE();
! 3151: }
! 3152:
! 3153: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3154: {
! 3155: zend_op *opline = EX(opline);
! 3156: zend_free_op free_op2;
! 3157: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3158:
! 3159: compare_function(result,
! 3160: &opline->op1.u.constant,
! 3161: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3162: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 3163:
! 3164: zval_dtor(free_op2.var);
! 3165: ZEND_VM_NEXT_OPCODE();
! 3166: }
! 3167:
! 3168: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3169: {
! 3170: zend_op *opline = EX(opline);
! 3171: zend_free_op free_op2;
! 3172: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3173:
! 3174: compare_function(result,
! 3175: &opline->op1.u.constant,
! 3176: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3177: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 3178:
! 3179: zval_dtor(free_op2.var);
! 3180: ZEND_VM_NEXT_OPCODE();
! 3181: }
! 3182:
! 3183: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3184: {
! 3185: zend_op *opline = EX(opline);
! 3186: zend_free_op free_op2;
! 3187: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3188:
! 3189: compare_function(result,
! 3190: &opline->op1.u.constant,
! 3191: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3192: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 3193:
! 3194: zval_dtor(free_op2.var);
! 3195: ZEND_VM_NEXT_OPCODE();
! 3196: }
! 3197:
! 3198: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3199: {
! 3200: zend_op *opline = EX(opline);
! 3201: zend_free_op free_op2;
! 3202:
! 3203: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 3204: &opline->op1.u.constant,
! 3205: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3206:
! 3207: zval_dtor(free_op2.var);
! 3208: ZEND_VM_NEXT_OPCODE();
! 3209: }
! 3210:
! 3211: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3212: {
! 3213: zend_op *opline = EX(opline);
! 3214: zend_free_op free_op2;
! 3215:
! 3216: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 3217: &opline->op1.u.constant,
! 3218: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3219:
! 3220: zval_dtor(free_op2.var);
! 3221: ZEND_VM_NEXT_OPCODE();
! 3222: }
! 3223:
! 3224: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3225: {
! 3226: zend_op *opline = EX(opline);
! 3227: zend_free_op free_op2;
! 3228:
! 3229: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 3230: &opline->op1.u.constant,
! 3231: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3232:
! 3233: zval_dtor(free_op2.var);
! 3234: ZEND_VM_NEXT_OPCODE();
! 3235: }
! 3236:
! 3237: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3238: {
! 3239: zend_op *opline = EX(opline);
! 3240: zend_free_op free_op2;
! 3241:
! 3242: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 3243: &opline->op1.u.constant,
! 3244: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3245:
! 3246: zval_dtor(free_op2.var);
! 3247: ZEND_VM_NEXT_OPCODE();
! 3248: }
! 3249:
! 3250: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3251: {
! 3252: zend_op *opline = EX(opline);
! 3253: zval *function_name;
! 3254: zend_class_entry *ce;
! 3255:
! 3256: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 3257:
! 3258: if (IS_CONST == IS_CONST) {
! 3259: /* no function found. try a static method in class */
! 3260: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 3261: if (!ce) {
! 3262: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 3263: }
! 3264: EX(called_scope) = ce;
! 3265: } else {
! 3266: ce = EX_T(opline->op1.u.var).class_entry;
! 3267:
! 3268: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 3269: EX(called_scope) = EG(called_scope);
! 3270: } else {
! 3271: EX(called_scope) = ce;
! 3272: }
! 3273: }
! 3274: if(IS_TMP_VAR != IS_UNUSED) {
! 3275: char *function_name_strval = NULL;
! 3276: int function_name_strlen = 0;
! 3277: zend_free_op free_op2;
! 3278:
! 3279: if (IS_TMP_VAR == IS_CONST) {
! 3280: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 3281: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 3282: } else {
! 3283: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 3284:
! 3285: if (Z_TYPE_P(function_name) != IS_STRING) {
! 3286: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 3287: } else {
! 3288: function_name_strval = Z_STRVAL_P(function_name);
! 3289: function_name_strlen = Z_STRLEN_P(function_name);
! 3290: }
! 3291: }
! 3292:
! 3293: if (function_name_strval) {
! 3294: if (ce->get_static_method) {
! 3295: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3296: } else {
! 3297: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3298: }
! 3299: if (!EX(fbc)) {
! 3300: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 3301: }
! 3302: }
! 3303:
! 3304: if (IS_TMP_VAR != IS_CONST) {
! 3305: zval_dtor(free_op2.var);
! 3306: }
! 3307: } else {
! 3308: if(!ce->constructor) {
! 3309: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 3310: }
! 3311: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 3312: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 3313: }
! 3314: EX(fbc) = ce->constructor;
! 3315: }
! 3316:
! 3317: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 3318: EX(object) = NULL;
! 3319: } else {
! 3320: if (EG(This) &&
! 3321: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 3322: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 3323: /* We are calling method of the other (incompatible) class,
! 3324: but passing $this. This is done for compatibility with php-4. */
! 3325: int severity;
! 3326: char *verb;
! 3327: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 3328: severity = E_STRICT;
! 3329: verb = "should not";
! 3330: } else {
! 3331: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 3332: severity = E_ERROR;
! 3333: verb = "cannot";
! 3334: }
! 3335: 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);
! 3336:
! 3337: }
! 3338: if ((EX(object) = EG(This))) {
! 3339: Z_ADDREF_P(EX(object));
! 3340: EX(called_scope) = Z_OBJCE_P(EX(object));
! 3341: }
! 3342: }
! 3343:
! 3344: ZEND_VM_NEXT_OPCODE();
! 3345: }
! 3346:
! 3347: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3348: {
! 3349: zend_op *opline = EX(opline);
! 3350: int switch_expr_is_overloaded=0;
! 3351: zend_free_op free_op2;
! 3352:
! 3353: if (IS_CONST==IS_VAR) {
! 3354: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 3355: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 3356: } else {
! 3357: switch_expr_is_overloaded = 1;
! 3358: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 3359: }
! 3360: }
! 3361: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 3362: &opline->op1.u.constant,
! 3363: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3364:
! 3365: zval_dtor(free_op2.var);
! 3366: if (switch_expr_is_overloaded) {
! 3367: /* We only free op1 if this is a string offset,
! 3368: * Since if it is a TMP_VAR, it'll be reused by
! 3369: * other CASE opcodes (whereas string offsets
! 3370: * are allocated at each get_zval_ptr())
! 3371: */
! 3372:
! 3373: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 3374: EX_T(opline->op1.u.var).var.ptr = NULL;
! 3375: }
! 3376: ZEND_VM_NEXT_OPCODE();
! 3377: }
! 3378:
! 3379: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3380: {
! 3381: zend_op *opline = EX(opline);
! 3382: zend_free_op free_op2;
! 3383: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 3384: zval *expr_ptr;
! 3385: zval *offset=_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 3386:
! 3387: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 3388: zval **expr_ptr_ptr = NULL;
! 3389:
! 3390: if (opline->extended_value) {
! 3391: expr_ptr_ptr=NULL;
! 3392: expr_ptr = *expr_ptr_ptr;
! 3393: } else {
! 3394: expr_ptr=&opline->op1.u.constant;
! 3395: }
! 3396: #else
! 3397: expr_ptr=&opline->op1.u.constant;
! 3398: #endif
! 3399:
! 3400: if (0) { /* temporary variable */
! 3401: zval *new_expr;
! 3402:
! 3403: ALLOC_ZVAL(new_expr);
! 3404: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 3405: expr_ptr = new_expr;
! 3406: } else {
! 3407: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 3408: if (opline->extended_value) {
! 3409: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 3410: expr_ptr = *expr_ptr_ptr;
! 3411: Z_ADDREF_P(expr_ptr);
! 3412: } else
! 3413: #endif
! 3414: if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 3415: zval *new_expr;
! 3416:
! 3417: ALLOC_ZVAL(new_expr);
! 3418: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 3419: expr_ptr = new_expr;
! 3420: zendi_zval_copy_ctor(*expr_ptr);
! 3421: } else {
! 3422: Z_ADDREF_P(expr_ptr);
! 3423: }
! 3424: }
! 3425: if (offset) {
! 3426: switch (Z_TYPE_P(offset)) {
! 3427: case IS_DOUBLE:
! 3428: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 3429: break;
! 3430: case IS_LONG:
! 3431: case IS_BOOL:
! 3432: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 3433: break;
! 3434: case IS_STRING:
! 3435: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 3436: break;
! 3437: case IS_NULL:
! 3438: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 3439: break;
! 3440: default:
! 3441: zend_error(E_WARNING, "Illegal offset type");
! 3442: zval_ptr_dtor(&expr_ptr);
! 3443: /* do nothing */
! 3444: break;
! 3445: }
! 3446: zval_dtor(free_op2.var);
! 3447: } else {
! 3448: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 3449: }
! 3450: if (opline->extended_value) {
! 3451:
! 3452: } else {
! 3453:
! 3454: }
! 3455: ZEND_VM_NEXT_OPCODE();
! 3456: }
! 3457:
! 3458: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3459: {
! 3460: zend_op *opline = EX(opline);
! 3461:
! 3462: array_init(&EX_T(opline->result.u.var).tmp_var);
! 3463: if (IS_CONST == IS_UNUSED) {
! 3464: ZEND_VM_NEXT_OPCODE();
! 3465: #if 0 || IS_CONST != IS_UNUSED
! 3466: } else {
! 3467: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 3468: #endif
! 3469: }
! 3470: }
! 3471:
! 3472: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3473: {
! 3474: zend_op *opline = EX(opline);
! 3475: zend_free_op free_op2;
! 3476:
! 3477: add_function(&EX_T(opline->result.u.var).tmp_var,
! 3478: &opline->op1.u.constant,
! 3479: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3480:
! 3481: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3482: ZEND_VM_NEXT_OPCODE();
! 3483: }
! 3484:
! 3485: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3486: {
! 3487: zend_op *opline = EX(opline);
! 3488: zend_free_op free_op2;
! 3489:
! 3490: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 3491: &opline->op1.u.constant,
! 3492: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3493:
! 3494: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3495: ZEND_VM_NEXT_OPCODE();
! 3496: }
! 3497:
! 3498: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3499: {
! 3500: zend_op *opline = EX(opline);
! 3501: zend_free_op free_op2;
! 3502:
! 3503: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 3504: &opline->op1.u.constant,
! 3505: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3506:
! 3507: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3508: ZEND_VM_NEXT_OPCODE();
! 3509: }
! 3510:
! 3511: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3512: {
! 3513: zend_op *opline = EX(opline);
! 3514: zend_free_op free_op2;
! 3515:
! 3516: div_function(&EX_T(opline->result.u.var).tmp_var,
! 3517: &opline->op1.u.constant,
! 3518: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3519:
! 3520: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3521: ZEND_VM_NEXT_OPCODE();
! 3522: }
! 3523:
! 3524: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3525: {
! 3526: zend_op *opline = EX(opline);
! 3527: zend_free_op free_op2;
! 3528:
! 3529: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 3530: &opline->op1.u.constant,
! 3531: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3532:
! 3533: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3534: ZEND_VM_NEXT_OPCODE();
! 3535: }
! 3536:
! 3537: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3538: {
! 3539: zend_op *opline = EX(opline);
! 3540: zend_free_op free_op2;
! 3541:
! 3542: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 3543: &opline->op1.u.constant,
! 3544: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3545:
! 3546: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3547: ZEND_VM_NEXT_OPCODE();
! 3548: }
! 3549:
! 3550: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3551: {
! 3552: zend_op *opline = EX(opline);
! 3553: zend_free_op free_op2;
! 3554:
! 3555: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 3556: &opline->op1.u.constant,
! 3557: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3558:
! 3559: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3560: ZEND_VM_NEXT_OPCODE();
! 3561: }
! 3562:
! 3563: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3564: {
! 3565: zend_op *opline = EX(opline);
! 3566: zend_free_op free_op2;
! 3567:
! 3568: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 3569: &opline->op1.u.constant,
! 3570: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3571:
! 3572: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3573: ZEND_VM_NEXT_OPCODE();
! 3574: }
! 3575:
! 3576: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3577: {
! 3578: zend_op *opline = EX(opline);
! 3579: zend_free_op free_op2;
! 3580:
! 3581: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 3582: &opline->op1.u.constant,
! 3583: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3584:
! 3585: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3586: ZEND_VM_NEXT_OPCODE();
! 3587: }
! 3588:
! 3589: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3590: {
! 3591: zend_op *opline = EX(opline);
! 3592: zend_free_op free_op2;
! 3593: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3594:
! 3595: is_identical_function(result,
! 3596: &opline->op1.u.constant,
! 3597: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3598: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 3599:
! 3600: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3601: ZEND_VM_NEXT_OPCODE();
! 3602: }
! 3603:
! 3604: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3605: {
! 3606: zend_op *opline = EX(opline);
! 3607: zend_free_op free_op2;
! 3608: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3609:
! 3610: compare_function(result,
! 3611: &opline->op1.u.constant,
! 3612: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3613: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 3614:
! 3615: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3616: ZEND_VM_NEXT_OPCODE();
! 3617: }
! 3618:
! 3619: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3620: {
! 3621: zend_op *opline = EX(opline);
! 3622: zend_free_op free_op2;
! 3623: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3624:
! 3625: compare_function(result,
! 3626: &opline->op1.u.constant,
! 3627: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3628: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 3629:
! 3630: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3631: ZEND_VM_NEXT_OPCODE();
! 3632: }
! 3633:
! 3634: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3635: {
! 3636: zend_op *opline = EX(opline);
! 3637: zend_free_op free_op2;
! 3638: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3639:
! 3640: compare_function(result,
! 3641: &opline->op1.u.constant,
! 3642: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3643: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 3644:
! 3645: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3646: ZEND_VM_NEXT_OPCODE();
! 3647: }
! 3648:
! 3649: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3650: {
! 3651: zend_op *opline = EX(opline);
! 3652: zend_free_op free_op2;
! 3653: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 3654:
! 3655: compare_function(result,
! 3656: &opline->op1.u.constant,
! 3657: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3658: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 3659:
! 3660: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3661: ZEND_VM_NEXT_OPCODE();
! 3662: }
! 3663:
! 3664: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3665: {
! 3666: zend_op *opline = EX(opline);
! 3667: zend_free_op free_op2;
! 3668:
! 3669: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 3670: &opline->op1.u.constant,
! 3671: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3672:
! 3673: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3674: ZEND_VM_NEXT_OPCODE();
! 3675: }
! 3676:
! 3677: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3678: {
! 3679: zend_op *opline = EX(opline);
! 3680: zend_free_op free_op2;
! 3681:
! 3682: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 3683: &opline->op1.u.constant,
! 3684: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3685:
! 3686: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3687: ZEND_VM_NEXT_OPCODE();
! 3688: }
! 3689:
! 3690: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3691: {
! 3692: zend_op *opline = EX(opline);
! 3693: zend_free_op free_op2;
! 3694:
! 3695: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 3696: &opline->op1.u.constant,
! 3697: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3698:
! 3699: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3700: ZEND_VM_NEXT_OPCODE();
! 3701: }
! 3702:
! 3703: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3704: {
! 3705: zend_op *opline = EX(opline);
! 3706: zend_free_op free_op2;
! 3707:
! 3708: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 3709: &opline->op1.u.constant,
! 3710: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3711:
! 3712: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3713: ZEND_VM_NEXT_OPCODE();
! 3714: }
! 3715:
! 3716: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3717: {
! 3718: zend_op *opline = EX(opline);
! 3719: zval *function_name;
! 3720: zend_class_entry *ce;
! 3721:
! 3722: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 3723:
! 3724: if (IS_CONST == IS_CONST) {
! 3725: /* no function found. try a static method in class */
! 3726: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 3727: if (!ce) {
! 3728: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 3729: }
! 3730: EX(called_scope) = ce;
! 3731: } else {
! 3732: ce = EX_T(opline->op1.u.var).class_entry;
! 3733:
! 3734: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 3735: EX(called_scope) = EG(called_scope);
! 3736: } else {
! 3737: EX(called_scope) = ce;
! 3738: }
! 3739: }
! 3740: if(IS_VAR != IS_UNUSED) {
! 3741: char *function_name_strval = NULL;
! 3742: int function_name_strlen = 0;
! 3743: zend_free_op free_op2;
! 3744:
! 3745: if (IS_VAR == IS_CONST) {
! 3746: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 3747: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 3748: } else {
! 3749: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 3750:
! 3751: if (Z_TYPE_P(function_name) != IS_STRING) {
! 3752: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 3753: } else {
! 3754: function_name_strval = Z_STRVAL_P(function_name);
! 3755: function_name_strlen = Z_STRLEN_P(function_name);
! 3756: }
! 3757: }
! 3758:
! 3759: if (function_name_strval) {
! 3760: if (ce->get_static_method) {
! 3761: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3762: } else {
! 3763: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3764: }
! 3765: if (!EX(fbc)) {
! 3766: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 3767: }
! 3768: }
! 3769:
! 3770: if (IS_VAR != IS_CONST) {
! 3771: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3772: }
! 3773: } else {
! 3774: if(!ce->constructor) {
! 3775: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 3776: }
! 3777: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 3778: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 3779: }
! 3780: EX(fbc) = ce->constructor;
! 3781: }
! 3782:
! 3783: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 3784: EX(object) = NULL;
! 3785: } else {
! 3786: if (EG(This) &&
! 3787: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 3788: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 3789: /* We are calling method of the other (incompatible) class,
! 3790: but passing $this. This is done for compatibility with php-4. */
! 3791: int severity;
! 3792: char *verb;
! 3793: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 3794: severity = E_STRICT;
! 3795: verb = "should not";
! 3796: } else {
! 3797: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 3798: severity = E_ERROR;
! 3799: verb = "cannot";
! 3800: }
! 3801: 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);
! 3802:
! 3803: }
! 3804: if ((EX(object) = EG(This))) {
! 3805: Z_ADDREF_P(EX(object));
! 3806: EX(called_scope) = Z_OBJCE_P(EX(object));
! 3807: }
! 3808: }
! 3809:
! 3810: ZEND_VM_NEXT_OPCODE();
! 3811: }
! 3812:
! 3813: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3814: {
! 3815: zend_op *opline = EX(opline);
! 3816: int switch_expr_is_overloaded=0;
! 3817: zend_free_op free_op2;
! 3818:
! 3819: if (IS_CONST==IS_VAR) {
! 3820: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 3821: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 3822: } else {
! 3823: switch_expr_is_overloaded = 1;
! 3824: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 3825: }
! 3826: }
! 3827: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 3828: &opline->op1.u.constant,
! 3829: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 3830:
! 3831: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3832: if (switch_expr_is_overloaded) {
! 3833: /* We only free op1 if this is a string offset,
! 3834: * Since if it is a TMP_VAR, it'll be reused by
! 3835: * other CASE opcodes (whereas string offsets
! 3836: * are allocated at each get_zval_ptr())
! 3837: */
! 3838:
! 3839: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 3840: EX_T(opline->op1.u.var).var.ptr = NULL;
! 3841: }
! 3842: ZEND_VM_NEXT_OPCODE();
! 3843: }
! 3844:
! 3845: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3846: {
! 3847: zend_op *opline = EX(opline);
! 3848: zend_free_op free_op2;
! 3849: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 3850: zval *expr_ptr;
! 3851: zval *offset=_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 3852:
! 3853: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 3854: zval **expr_ptr_ptr = NULL;
! 3855:
! 3856: if (opline->extended_value) {
! 3857: expr_ptr_ptr=NULL;
! 3858: expr_ptr = *expr_ptr_ptr;
! 3859: } else {
! 3860: expr_ptr=&opline->op1.u.constant;
! 3861: }
! 3862: #else
! 3863: expr_ptr=&opline->op1.u.constant;
! 3864: #endif
! 3865:
! 3866: if (0) { /* temporary variable */
! 3867: zval *new_expr;
! 3868:
! 3869: ALLOC_ZVAL(new_expr);
! 3870: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 3871: expr_ptr = new_expr;
! 3872: } else {
! 3873: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 3874: if (opline->extended_value) {
! 3875: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 3876: expr_ptr = *expr_ptr_ptr;
! 3877: Z_ADDREF_P(expr_ptr);
! 3878: } else
! 3879: #endif
! 3880: if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 3881: zval *new_expr;
! 3882:
! 3883: ALLOC_ZVAL(new_expr);
! 3884: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 3885: expr_ptr = new_expr;
! 3886: zendi_zval_copy_ctor(*expr_ptr);
! 3887: } else {
! 3888: Z_ADDREF_P(expr_ptr);
! 3889: }
! 3890: }
! 3891: if (offset) {
! 3892: switch (Z_TYPE_P(offset)) {
! 3893: case IS_DOUBLE:
! 3894: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 3895: break;
! 3896: case IS_LONG:
! 3897: case IS_BOOL:
! 3898: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 3899: break;
! 3900: case IS_STRING:
! 3901: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 3902: break;
! 3903: case IS_NULL:
! 3904: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 3905: break;
! 3906: default:
! 3907: zend_error(E_WARNING, "Illegal offset type");
! 3908: zval_ptr_dtor(&expr_ptr);
! 3909: /* do nothing */
! 3910: break;
! 3911: }
! 3912: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 3913: } else {
! 3914: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 3915: }
! 3916: if (opline->extended_value) {
! 3917:
! 3918: } else {
! 3919:
! 3920: }
! 3921: ZEND_VM_NEXT_OPCODE();
! 3922: }
! 3923:
! 3924: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3925: {
! 3926: zend_op *opline = EX(opline);
! 3927:
! 3928: array_init(&EX_T(opline->result.u.var).tmp_var);
! 3929: if (IS_CONST == IS_UNUSED) {
! 3930: ZEND_VM_NEXT_OPCODE();
! 3931: #if 0 || IS_CONST != IS_UNUSED
! 3932: } else {
! 3933: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 3934: #endif
! 3935: }
! 3936: }
! 3937:
! 3938: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 3939: {
! 3940: zend_op *opline = EX(opline);
! 3941: zval *function_name;
! 3942: zend_class_entry *ce;
! 3943:
! 3944: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 3945:
! 3946: if (IS_CONST == IS_CONST) {
! 3947: /* no function found. try a static method in class */
! 3948: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 3949: if (!ce) {
! 3950: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 3951: }
! 3952: EX(called_scope) = ce;
! 3953: } else {
! 3954: ce = EX_T(opline->op1.u.var).class_entry;
! 3955:
! 3956: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 3957: EX(called_scope) = EG(called_scope);
! 3958: } else {
! 3959: EX(called_scope) = ce;
! 3960: }
! 3961: }
! 3962: if(IS_UNUSED != IS_UNUSED) {
! 3963: char *function_name_strval = NULL;
! 3964: int function_name_strlen = 0;
! 3965:
! 3966:
! 3967: if (IS_UNUSED == IS_CONST) {
! 3968: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 3969: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 3970: } else {
! 3971: function_name = NULL;
! 3972:
! 3973: if (Z_TYPE_P(function_name) != IS_STRING) {
! 3974: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 3975: } else {
! 3976: function_name_strval = Z_STRVAL_P(function_name);
! 3977: function_name_strlen = Z_STRLEN_P(function_name);
! 3978: }
! 3979: }
! 3980:
! 3981: if (function_name_strval) {
! 3982: if (ce->get_static_method) {
! 3983: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3984: } else {
! 3985: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 3986: }
! 3987: if (!EX(fbc)) {
! 3988: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 3989: }
! 3990: }
! 3991:
! 3992: if (IS_UNUSED != IS_CONST) {
! 3993:
! 3994: }
! 3995: } else {
! 3996: if(!ce->constructor) {
! 3997: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 3998: }
! 3999: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 4000: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 4001: }
! 4002: EX(fbc) = ce->constructor;
! 4003: }
! 4004:
! 4005: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 4006: EX(object) = NULL;
! 4007: } else {
! 4008: if (EG(This) &&
! 4009: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 4010: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 4011: /* We are calling method of the other (incompatible) class,
! 4012: but passing $this. This is done for compatibility with php-4. */
! 4013: int severity;
! 4014: char *verb;
! 4015: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 4016: severity = E_STRICT;
! 4017: verb = "should not";
! 4018: } else {
! 4019: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 4020: severity = E_ERROR;
! 4021: verb = "cannot";
! 4022: }
! 4023: 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);
! 4024:
! 4025: }
! 4026: if ((EX(object) = EG(This))) {
! 4027: Z_ADDREF_P(EX(object));
! 4028: EX(called_scope) = Z_OBJCE_P(EX(object));
! 4029: }
! 4030: }
! 4031:
! 4032: ZEND_VM_NEXT_OPCODE();
! 4033: }
! 4034:
! 4035: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4036: {
! 4037: zend_op *opline = EX(opline);
! 4038:
! 4039: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 4040: zval *expr_ptr;
! 4041: zval *offset=NULL;
! 4042:
! 4043: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 4044: zval **expr_ptr_ptr = NULL;
! 4045:
! 4046: if (opline->extended_value) {
! 4047: expr_ptr_ptr=NULL;
! 4048: expr_ptr = *expr_ptr_ptr;
! 4049: } else {
! 4050: expr_ptr=&opline->op1.u.constant;
! 4051: }
! 4052: #else
! 4053: expr_ptr=&opline->op1.u.constant;
! 4054: #endif
! 4055:
! 4056: if (0) { /* temporary variable */
! 4057: zval *new_expr;
! 4058:
! 4059: ALLOC_ZVAL(new_expr);
! 4060: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 4061: expr_ptr = new_expr;
! 4062: } else {
! 4063: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 4064: if (opline->extended_value) {
! 4065: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 4066: expr_ptr = *expr_ptr_ptr;
! 4067: Z_ADDREF_P(expr_ptr);
! 4068: } else
! 4069: #endif
! 4070: if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 4071: zval *new_expr;
! 4072:
! 4073: ALLOC_ZVAL(new_expr);
! 4074: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 4075: expr_ptr = new_expr;
! 4076: zendi_zval_copy_ctor(*expr_ptr);
! 4077: } else {
! 4078: Z_ADDREF_P(expr_ptr);
! 4079: }
! 4080: }
! 4081: if (offset) {
! 4082: switch (Z_TYPE_P(offset)) {
! 4083: case IS_DOUBLE:
! 4084: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 4085: break;
! 4086: case IS_LONG:
! 4087: case IS_BOOL:
! 4088: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 4089: break;
! 4090: case IS_STRING:
! 4091: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 4092: break;
! 4093: case IS_NULL:
! 4094: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 4095: break;
! 4096: default:
! 4097: zend_error(E_WARNING, "Illegal offset type");
! 4098: zval_ptr_dtor(&expr_ptr);
! 4099: /* do nothing */
! 4100: break;
! 4101: }
! 4102:
! 4103: } else {
! 4104: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 4105: }
! 4106: if (opline->extended_value) {
! 4107:
! 4108: } else {
! 4109:
! 4110: }
! 4111: ZEND_VM_NEXT_OPCODE();
! 4112: }
! 4113:
! 4114: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4115: {
! 4116: zend_op *opline = EX(opline);
! 4117:
! 4118: array_init(&EX_T(opline->result.u.var).tmp_var);
! 4119: if (IS_CONST == IS_UNUSED) {
! 4120: ZEND_VM_NEXT_OPCODE();
! 4121: #if 0 || IS_CONST != IS_UNUSED
! 4122: } else {
! 4123: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4124: #endif
! 4125: }
! 4126: }
! 4127:
! 4128: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4129: {
! 4130: zend_op *opline = EX(opline);
! 4131:
! 4132:
! 4133: add_function(&EX_T(opline->result.u.var).tmp_var,
! 4134: &opline->op1.u.constant,
! 4135: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4136:
! 4137:
! 4138: ZEND_VM_NEXT_OPCODE();
! 4139: }
! 4140:
! 4141: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4142: {
! 4143: zend_op *opline = EX(opline);
! 4144:
! 4145:
! 4146: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 4147: &opline->op1.u.constant,
! 4148: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4149:
! 4150:
! 4151: ZEND_VM_NEXT_OPCODE();
! 4152: }
! 4153:
! 4154: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4155: {
! 4156: zend_op *opline = EX(opline);
! 4157:
! 4158:
! 4159: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 4160: &opline->op1.u.constant,
! 4161: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4162:
! 4163:
! 4164: ZEND_VM_NEXT_OPCODE();
! 4165: }
! 4166:
! 4167: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4168: {
! 4169: zend_op *opline = EX(opline);
! 4170:
! 4171:
! 4172: div_function(&EX_T(opline->result.u.var).tmp_var,
! 4173: &opline->op1.u.constant,
! 4174: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4175:
! 4176:
! 4177: ZEND_VM_NEXT_OPCODE();
! 4178: }
! 4179:
! 4180: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4181: {
! 4182: zend_op *opline = EX(opline);
! 4183:
! 4184:
! 4185: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 4186: &opline->op1.u.constant,
! 4187: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4188:
! 4189:
! 4190: ZEND_VM_NEXT_OPCODE();
! 4191: }
! 4192:
! 4193: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4194: {
! 4195: zend_op *opline = EX(opline);
! 4196:
! 4197:
! 4198: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 4199: &opline->op1.u.constant,
! 4200: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4201:
! 4202:
! 4203: ZEND_VM_NEXT_OPCODE();
! 4204: }
! 4205:
! 4206: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4207: {
! 4208: zend_op *opline = EX(opline);
! 4209:
! 4210:
! 4211: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 4212: &opline->op1.u.constant,
! 4213: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4214:
! 4215:
! 4216: ZEND_VM_NEXT_OPCODE();
! 4217: }
! 4218:
! 4219: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4220: {
! 4221: zend_op *opline = EX(opline);
! 4222:
! 4223:
! 4224: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 4225: &opline->op1.u.constant,
! 4226: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4227:
! 4228:
! 4229: ZEND_VM_NEXT_OPCODE();
! 4230: }
! 4231:
! 4232: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4233: {
! 4234: zend_op *opline = EX(opline);
! 4235:
! 4236:
! 4237: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 4238: &opline->op1.u.constant,
! 4239: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4240:
! 4241:
! 4242: ZEND_VM_NEXT_OPCODE();
! 4243: }
! 4244:
! 4245: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4246: {
! 4247: zend_op *opline = EX(opline);
! 4248:
! 4249: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 4250:
! 4251: is_identical_function(result,
! 4252: &opline->op1.u.constant,
! 4253: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4254: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 4255:
! 4256:
! 4257: ZEND_VM_NEXT_OPCODE();
! 4258: }
! 4259:
! 4260: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4261: {
! 4262: zend_op *opline = EX(opline);
! 4263:
! 4264: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 4265:
! 4266: compare_function(result,
! 4267: &opline->op1.u.constant,
! 4268: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4269: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 4270:
! 4271:
! 4272: ZEND_VM_NEXT_OPCODE();
! 4273: }
! 4274:
! 4275: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4276: {
! 4277: zend_op *opline = EX(opline);
! 4278:
! 4279: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 4280:
! 4281: compare_function(result,
! 4282: &opline->op1.u.constant,
! 4283: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4284: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 4285:
! 4286:
! 4287: ZEND_VM_NEXT_OPCODE();
! 4288: }
! 4289:
! 4290: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4291: {
! 4292: zend_op *opline = EX(opline);
! 4293:
! 4294: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 4295:
! 4296: compare_function(result,
! 4297: &opline->op1.u.constant,
! 4298: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4299: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 4300:
! 4301:
! 4302: ZEND_VM_NEXT_OPCODE();
! 4303: }
! 4304:
! 4305: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4306: {
! 4307: zend_op *opline = EX(opline);
! 4308:
! 4309: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 4310:
! 4311: compare_function(result,
! 4312: &opline->op1.u.constant,
! 4313: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4314: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 4315:
! 4316:
! 4317: ZEND_VM_NEXT_OPCODE();
! 4318: }
! 4319:
! 4320: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4321: {
! 4322: zend_op *opline = EX(opline);
! 4323:
! 4324:
! 4325: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 4326: &opline->op1.u.constant,
! 4327: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4328:
! 4329:
! 4330: ZEND_VM_NEXT_OPCODE();
! 4331: }
! 4332:
! 4333: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4334: {
! 4335: zend_op *opline = EX(opline);
! 4336:
! 4337:
! 4338: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 4339: &opline->op1.u.constant,
! 4340: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4341:
! 4342:
! 4343: ZEND_VM_NEXT_OPCODE();
! 4344: }
! 4345:
! 4346: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4347: {
! 4348: zend_op *opline = EX(opline);
! 4349:
! 4350:
! 4351: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 4352: &opline->op1.u.constant,
! 4353: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4354:
! 4355:
! 4356: ZEND_VM_NEXT_OPCODE();
! 4357: }
! 4358:
! 4359: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4360: {
! 4361: zend_op *opline = EX(opline);
! 4362:
! 4363:
! 4364: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 4365: &opline->op1.u.constant,
! 4366: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4367:
! 4368:
! 4369: ZEND_VM_NEXT_OPCODE();
! 4370: }
! 4371:
! 4372: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4373: {
! 4374: zend_op *opline = EX(opline);
! 4375: zval *function_name;
! 4376: zend_class_entry *ce;
! 4377:
! 4378: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 4379:
! 4380: if (IS_CONST == IS_CONST) {
! 4381: /* no function found. try a static method in class */
! 4382: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 4383: if (!ce) {
! 4384: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 4385: }
! 4386: EX(called_scope) = ce;
! 4387: } else {
! 4388: ce = EX_T(opline->op1.u.var).class_entry;
! 4389:
! 4390: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 4391: EX(called_scope) = EG(called_scope);
! 4392: } else {
! 4393: EX(called_scope) = ce;
! 4394: }
! 4395: }
! 4396: if(IS_CV != IS_UNUSED) {
! 4397: char *function_name_strval = NULL;
! 4398: int function_name_strlen = 0;
! 4399:
! 4400:
! 4401: if (IS_CV == IS_CONST) {
! 4402: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 4403: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 4404: } else {
! 4405: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 4406:
! 4407: if (Z_TYPE_P(function_name) != IS_STRING) {
! 4408: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 4409: } else {
! 4410: function_name_strval = Z_STRVAL_P(function_name);
! 4411: function_name_strlen = Z_STRLEN_P(function_name);
! 4412: }
! 4413: }
! 4414:
! 4415: if (function_name_strval) {
! 4416: if (ce->get_static_method) {
! 4417: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 4418: } else {
! 4419: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 4420: }
! 4421: if (!EX(fbc)) {
! 4422: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 4423: }
! 4424: }
! 4425:
! 4426: if (IS_CV != IS_CONST) {
! 4427:
! 4428: }
! 4429: } else {
! 4430: if(!ce->constructor) {
! 4431: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 4432: }
! 4433: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 4434: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 4435: }
! 4436: EX(fbc) = ce->constructor;
! 4437: }
! 4438:
! 4439: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 4440: EX(object) = NULL;
! 4441: } else {
! 4442: if (EG(This) &&
! 4443: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 4444: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 4445: /* We are calling method of the other (incompatible) class,
! 4446: but passing $this. This is done for compatibility with php-4. */
! 4447: int severity;
! 4448: char *verb;
! 4449: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 4450: severity = E_STRICT;
! 4451: verb = "should not";
! 4452: } else {
! 4453: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 4454: severity = E_ERROR;
! 4455: verb = "cannot";
! 4456: }
! 4457: 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);
! 4458:
! 4459: }
! 4460: if ((EX(object) = EG(This))) {
! 4461: Z_ADDREF_P(EX(object));
! 4462: EX(called_scope) = Z_OBJCE_P(EX(object));
! 4463: }
! 4464: }
! 4465:
! 4466: ZEND_VM_NEXT_OPCODE();
! 4467: }
! 4468:
! 4469: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4470: {
! 4471: zend_op *opline = EX(opline);
! 4472: int switch_expr_is_overloaded=0;
! 4473:
! 4474:
! 4475: if (IS_CONST==IS_VAR) {
! 4476: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 4477: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 4478: } else {
! 4479: switch_expr_is_overloaded = 1;
! 4480: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 4481: }
! 4482: }
! 4483: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 4484: &opline->op1.u.constant,
! 4485: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 4486:
! 4487: if (switch_expr_is_overloaded) {
! 4488: /* We only free op1 if this is a string offset,
! 4489: * Since if it is a TMP_VAR, it'll be reused by
! 4490: * other CASE opcodes (whereas string offsets
! 4491: * are allocated at each get_zval_ptr())
! 4492: */
! 4493:
! 4494: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 4495: EX_T(opline->op1.u.var).var.ptr = NULL;
! 4496: }
! 4497: ZEND_VM_NEXT_OPCODE();
! 4498: }
! 4499:
! 4500: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4501: {
! 4502: zend_op *opline = EX(opline);
! 4503:
! 4504: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 4505: zval *expr_ptr;
! 4506: zval *offset=_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 4507:
! 4508: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 4509: zval **expr_ptr_ptr = NULL;
! 4510:
! 4511: if (opline->extended_value) {
! 4512: expr_ptr_ptr=NULL;
! 4513: expr_ptr = *expr_ptr_ptr;
! 4514: } else {
! 4515: expr_ptr=&opline->op1.u.constant;
! 4516: }
! 4517: #else
! 4518: expr_ptr=&opline->op1.u.constant;
! 4519: #endif
! 4520:
! 4521: if (0) { /* temporary variable */
! 4522: zval *new_expr;
! 4523:
! 4524: ALLOC_ZVAL(new_expr);
! 4525: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 4526: expr_ptr = new_expr;
! 4527: } else {
! 4528: #if 0 || IS_CONST == IS_VAR || IS_CONST == IS_CV
! 4529: if (opline->extended_value) {
! 4530: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 4531: expr_ptr = *expr_ptr_ptr;
! 4532: Z_ADDREF_P(expr_ptr);
! 4533: } else
! 4534: #endif
! 4535: if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 4536: zval *new_expr;
! 4537:
! 4538: ALLOC_ZVAL(new_expr);
! 4539: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 4540: expr_ptr = new_expr;
! 4541: zendi_zval_copy_ctor(*expr_ptr);
! 4542: } else {
! 4543: Z_ADDREF_P(expr_ptr);
! 4544: }
! 4545: }
! 4546: if (offset) {
! 4547: switch (Z_TYPE_P(offset)) {
! 4548: case IS_DOUBLE:
! 4549: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 4550: break;
! 4551: case IS_LONG:
! 4552: case IS_BOOL:
! 4553: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 4554: break;
! 4555: case IS_STRING:
! 4556: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 4557: break;
! 4558: case IS_NULL:
! 4559: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 4560: break;
! 4561: default:
! 4562: zend_error(E_WARNING, "Illegal offset type");
! 4563: zval_ptr_dtor(&expr_ptr);
! 4564: /* do nothing */
! 4565: break;
! 4566: }
! 4567:
! 4568: } else {
! 4569: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 4570: }
! 4571: if (opline->extended_value) {
! 4572:
! 4573: } else {
! 4574:
! 4575: }
! 4576: ZEND_VM_NEXT_OPCODE();
! 4577: }
! 4578:
! 4579: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4580: {
! 4581: zend_op *opline = EX(opline);
! 4582:
! 4583: array_init(&EX_T(opline->result.u.var).tmp_var);
! 4584: if (IS_CONST == IS_UNUSED) {
! 4585: ZEND_VM_NEXT_OPCODE();
! 4586: #if 0 || IS_CONST != IS_UNUSED
! 4587: } else {
! 4588: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4589: #endif
! 4590: }
! 4591: }
! 4592:
! 4593: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4594: {
! 4595: zend_op *opline = EX(opline);
! 4596: zend_free_op free_op1;
! 4597:
! 4598: bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
! 4599: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC) TSRMLS_CC);
! 4600: zval_dtor(free_op1.var);
! 4601: ZEND_VM_NEXT_OPCODE();
! 4602: }
! 4603:
! 4604: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4605: {
! 4606: zend_op *opline = EX(opline);
! 4607: zend_free_op free_op1;
! 4608:
! 4609: boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
! 4610: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC) TSRMLS_CC);
! 4611: zval_dtor(free_op1.var);
! 4612: ZEND_VM_NEXT_OPCODE();
! 4613: }
! 4614:
! 4615: static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4616: {
! 4617: zend_op *opline = EX(opline);
! 4618: zend_free_op free_op1;
! 4619: zval z_copy;
! 4620: zval *z = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4621:
! 4622: if (IS_TMP_VAR != IS_CONST &&
! 4623: Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL) {
! 4624: if (IS_TMP_VAR == IS_TMP_VAR) {
! 4625: INIT_PZVAL(z);
! 4626: }
! 4627: if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
! 4628: zend_print_variable(&z_copy);
! 4629: zval_dtor(&z_copy);
! 4630: } else {
! 4631: zend_print_variable(z);
! 4632: }
! 4633: } else {
! 4634: zend_print_variable(z);
! 4635: }
! 4636:
! 4637: zval_dtor(free_op1.var);
! 4638: ZEND_VM_NEXT_OPCODE();
! 4639: }
! 4640:
! 4641: static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4642: {
! 4643: zend_op *opline = EX(opline);
! 4644:
! 4645: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 4646: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
! 4647:
! 4648: return ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4649: }
! 4650:
! 4651: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
! 4652: {
! 4653: zend_op *opline = EX(opline);
! 4654: zend_free_op free_op1;
! 4655: zval *varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4656: zval **retval;
! 4657: zval tmp_varname;
! 4658: HashTable *target_symbol_table;
! 4659:
! 4660: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
! 4661: tmp_varname = *varname;
! 4662: zval_copy_ctor(&tmp_varname);
! 4663: convert_to_string(&tmp_varname);
! 4664: varname = &tmp_varname;
! 4665: }
! 4666:
! 4667: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 4668: 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);
! 4669: zval_dtor(free_op1.var);
! 4670: } else {
! 4671: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
! 4672: /*
! 4673: if (!target_symbol_table) {
! 4674: ZEND_VM_NEXT_OPCODE();
! 4675: }
! 4676: */
! 4677: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) {
! 4678: switch (type) {
! 4679: case BP_VAR_R:
! 4680: case BP_VAR_UNSET:
! 4681: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 4682: /* break missing intentionally */
! 4683: case BP_VAR_IS:
! 4684: retval = &EG(uninitialized_zval_ptr);
! 4685: break;
! 4686: case BP_VAR_RW:
! 4687: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 4688: /* break missing intentionally */
! 4689: case BP_VAR_W: {
! 4690: zval *new_zval = &EG(uninitialized_zval);
! 4691:
! 4692: Z_ADDREF_P(new_zval);
! 4693: zend_hash_update(target_symbol_table, varname->value.str.val, varname->value.str.len+1, &new_zval, sizeof(zval *), (void **) &retval);
! 4694: }
! 4695: break;
! 4696: EMPTY_SWITCH_DEFAULT_CASE()
! 4697: }
! 4698: }
! 4699: switch (opline->op2.u.EA.type) {
! 4700: case ZEND_FETCH_GLOBAL:
! 4701: if (IS_TMP_VAR != IS_TMP_VAR) {
! 4702: zval_dtor(free_op1.var);
! 4703: }
! 4704: break;
! 4705: case ZEND_FETCH_LOCAL:
! 4706: zval_dtor(free_op1.var);
! 4707: break;
! 4708: case ZEND_FETCH_STATIC:
! 4709: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
! 4710: break;
! 4711: case ZEND_FETCH_GLOBAL_LOCK:
! 4712: if (IS_TMP_VAR == IS_VAR && !free_op1.var) {
! 4713: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 4714: }
! 4715: break;
! 4716: }
! 4717: }
! 4718:
! 4719:
! 4720: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
! 4721: zval_dtor(varname);
! 4722: }
! 4723: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 4724: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 4725: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
! 4726: }
! 4727: PZVAL_LOCK(*retval);
! 4728: switch (type) {
! 4729: case BP_VAR_R:
! 4730: case BP_VAR_IS:
! 4731: AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
! 4732: break;
! 4733: case BP_VAR_UNSET: {
! 4734: zend_free_op free_res;
! 4735:
! 4736: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 4737: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 4738: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 4739: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 4740: }
! 4741: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 4742: FREE_OP_VAR_PTR(free_res);
! 4743: break;
! 4744: default:
! 4745: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 4746: break;
! 4747: }
! 4748: }
! 4749: }
! 4750: ZEND_VM_NEXT_OPCODE();
! 4751: }
! 4752:
! 4753: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4754: {
! 4755: return zend_fetch_var_address_helper_SPEC_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4756: }
! 4757:
! 4758: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4759: {
! 4760: return zend_fetch_var_address_helper_SPEC_TMP(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4761: }
! 4762:
! 4763: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4764: {
! 4765: return zend_fetch_var_address_helper_SPEC_TMP(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4766: }
! 4767:
! 4768: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4769: {
! 4770: return zend_fetch_var_address_helper_SPEC_TMP(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4771: }
! 4772:
! 4773: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4774: {
! 4775: return zend_fetch_var_address_helper_SPEC_TMP(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4776: }
! 4777:
! 4778: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4779: {
! 4780: return zend_fetch_var_address_helper_SPEC_TMP(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 4781: }
! 4782:
! 4783: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4784: {
! 4785: zend_op *opline = EX(opline);
! 4786: zend_free_op free_op1;
! 4787: zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4788: int ret;
! 4789:
! 4790: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 4791: ret = Z_LVAL_P(val);
! 4792: } else {
! 4793: ret = i_zend_is_true(val);
! 4794: zval_dtor(free_op1.var);
! 4795: if (UNEXPECTED(EG(exception) != NULL)) {
! 4796: ZEND_VM_CONTINUE();
! 4797: }
! 4798: }
! 4799: if (!ret) {
! 4800: #if DEBUG_ZEND>=2
! 4801: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 4802: #endif
! 4803: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 4804: ZEND_VM_CONTINUE();
! 4805: }
! 4806:
! 4807: ZEND_VM_NEXT_OPCODE();
! 4808: }
! 4809:
! 4810: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4811: {
! 4812: zend_op *opline = EX(opline);
! 4813: zend_free_op free_op1;
! 4814: zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4815: int ret;
! 4816:
! 4817: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 4818: ret = Z_LVAL_P(val);
! 4819: } else {
! 4820: ret = i_zend_is_true(val);
! 4821: zval_dtor(free_op1.var);
! 4822: if (UNEXPECTED(EG(exception) != NULL)) {
! 4823: ZEND_VM_CONTINUE();
! 4824: }
! 4825: }
! 4826: if (ret) {
! 4827: #if DEBUG_ZEND>=2
! 4828: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 4829: #endif
! 4830: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 4831: ZEND_VM_CONTINUE();
! 4832: }
! 4833:
! 4834: ZEND_VM_NEXT_OPCODE();
! 4835: }
! 4836:
! 4837: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4838: {
! 4839: zend_op *opline = EX(opline);
! 4840: zend_free_op free_op1;
! 4841: zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4842: int retval;
! 4843:
! 4844: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 4845: retval = Z_LVAL_P(val);
! 4846: } else {
! 4847: retval = i_zend_is_true(val);
! 4848: zval_dtor(free_op1.var);
! 4849: if (UNEXPECTED(EG(exception) != NULL)) {
! 4850: ZEND_VM_CONTINUE();
! 4851: }
! 4852: }
! 4853: if (EXPECTED(retval != 0)) {
! 4854: #if DEBUG_ZEND>=2
! 4855: printf("Conditional jmp on true to %d\n", opline->extended_value);
! 4856: #endif
! 4857: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 4858: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 4859: } else {
! 4860: #if DEBUG_ZEND>=2
! 4861: printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
! 4862: #endif
! 4863: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
! 4864: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 4865: }
! 4866: }
! 4867:
! 4868: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4869: {
! 4870: zend_op *opline = EX(opline);
! 4871: zend_free_op free_op1;
! 4872: zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4873: int retval;
! 4874:
! 4875: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 4876: retval = Z_LVAL_P(val);
! 4877: } else {
! 4878: retval = i_zend_is_true(val);
! 4879: zval_dtor(free_op1.var);
! 4880: if (UNEXPECTED(EG(exception) != NULL)) {
! 4881: ZEND_VM_CONTINUE();
! 4882: }
! 4883: }
! 4884: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 4885: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 4886: if (!retval) {
! 4887: #if DEBUG_ZEND>=2
! 4888: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 4889: #endif
! 4890: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 4891: ZEND_VM_CONTINUE();
! 4892: }
! 4893: ZEND_VM_NEXT_OPCODE();
! 4894: }
! 4895:
! 4896: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4897: {
! 4898: zend_op *opline = EX(opline);
! 4899: zend_free_op free_op1;
! 4900: zval *val = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4901: int retval;
! 4902:
! 4903: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 4904: retval = Z_LVAL_P(val);
! 4905: } else {
! 4906: retval = i_zend_is_true(val);
! 4907: zval_dtor(free_op1.var);
! 4908: if (UNEXPECTED(EG(exception) != NULL)) {
! 4909: ZEND_VM_CONTINUE();
! 4910: }
! 4911: }
! 4912: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 4913: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 4914: if (retval) {
! 4915: #if DEBUG_ZEND>=2
! 4916: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 4917: #endif
! 4918: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 4919: ZEND_VM_CONTINUE();
! 4920: }
! 4921: ZEND_VM_NEXT_OPCODE();
! 4922: }
! 4923:
! 4924: static int ZEND_FASTCALL ZEND_FREE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4925: {
! 4926: zendi_zval_dtor(EX_T(EX(opline)->op1.u.var).tmp_var);
! 4927: ZEND_VM_NEXT_OPCODE();
! 4928: }
! 4929:
! 4930: static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 4931: {
! 4932: zend_op *opline = EX(opline);
! 4933: zval *retval_ptr;
! 4934: zval **retval_ptr_ptr;
! 4935: zend_free_op free_op1;
! 4936:
! 4937: if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
! 4938:
! 4939: if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
! 4940: /* Not supposed to happen, but we'll allow it */
! 4941: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 4942: goto return_by_value;
! 4943: }
! 4944:
! 4945: retval_ptr_ptr = NULL;
! 4946:
! 4947: if (IS_TMP_VAR == IS_VAR && !retval_ptr_ptr) {
! 4948: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
! 4949: }
! 4950:
! 4951: if (IS_TMP_VAR == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
! 4952: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 4953: EX_T(opline->op1.u.var).var.fcall_returned_reference) {
! 4954: } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 4955: if (IS_TMP_VAR == IS_VAR && !1) {
! 4956: PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 4957: }
! 4958: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 4959: goto return_by_value;
! 4960: }
! 4961: }
! 4962:
! 4963: if (EG(return_value_ptr_ptr)) {
! 4964: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
! 4965: Z_ADDREF_PP(retval_ptr_ptr);
! 4966:
! 4967: (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
! 4968: }
! 4969: } else {
! 4970: return_by_value:
! 4971:
! 4972: retval_ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 4973:
! 4974: if (!EG(return_value_ptr_ptr)) {
! 4975: if (IS_TMP_VAR == IS_TMP_VAR) {
! 4976: zval_dtor(free_op1.var);
! 4977: }
! 4978: } else if (!1) { /* Not a temp var */
! 4979: if (IS_TMP_VAR == IS_CONST ||
! 4980: EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
! 4981: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
! 4982: zval *ret;
! 4983:
! 4984: ALLOC_ZVAL(ret);
! 4985: INIT_PZVAL_COPY(ret, retval_ptr);
! 4986: zval_copy_ctor(ret);
! 4987: *EG(return_value_ptr_ptr) = ret;
! 4988: } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
! 4989: retval_ptr == &EG(uninitialized_zval)) {
! 4990: zval *ret;
! 4991:
! 4992: ALLOC_INIT_ZVAL(ret);
! 4993: *EG(return_value_ptr_ptr) = ret;
! 4994: } else {
! 4995: *EG(return_value_ptr_ptr) = retval_ptr;
! 4996: Z_ADDREF_P(retval_ptr);
! 4997: }
! 4998: } else {
! 4999: zval *ret;
! 5000:
! 5001: ALLOC_ZVAL(ret);
! 5002: INIT_PZVAL_COPY(ret, retval_ptr);
! 5003: *EG(return_value_ptr_ptr) = ret;
! 5004: }
! 5005: }
! 5006:
! 5007: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 5008: }
! 5009:
! 5010: static int ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5011: {
! 5012: zend_op *opline = EX(opline);
! 5013: zval *value;
! 5014: zval *exception;
! 5015: zend_free_op free_op1;
! 5016:
! 5017: value = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5018:
! 5019: if (IS_TMP_VAR == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
! 5020: zend_error_noreturn(E_ERROR, "Can only throw objects");
! 5021: }
! 5022: zend_exception_save(TSRMLS_C);
! 5023: /* Not sure if a complete copy is what we want here */
! 5024: ALLOC_ZVAL(exception);
! 5025: INIT_PZVAL_COPY(exception, value);
! 5026: if (!1) {
! 5027: zval_copy_ctor(exception);
! 5028: }
! 5029:
! 5030: zend_throw_exception_object(exception TSRMLS_CC);
! 5031: zend_exception_restore(TSRMLS_C);
! 5032:
! 5033: ZEND_VM_NEXT_OPCODE();
! 5034: }
! 5035:
! 5036: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5037: {
! 5038: zend_op *opline = EX(opline);
! 5039: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
! 5040: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 5041: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
! 5042: }
! 5043: {
! 5044: zval *valptr;
! 5045: zval *value;
! 5046: zend_free_op free_op1;
! 5047:
! 5048: value = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5049:
! 5050: ALLOC_ZVAL(valptr);
! 5051: INIT_PZVAL_COPY(valptr, value);
! 5052: if (!1) {
! 5053: zval_copy_ctor(valptr);
! 5054: }
! 5055: zend_vm_stack_push(valptr TSRMLS_CC);
! 5056:
! 5057: }
! 5058: ZEND_VM_NEXT_OPCODE();
! 5059: }
! 5060:
! 5061: static int ZEND_FASTCALL ZEND_BOOL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5062: {
! 5063: zend_op *opline = EX(opline);
! 5064: zend_free_op free_op1;
! 5065:
! 5066: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
! 5067: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
! 5068: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 5069: zval_dtor(free_op1.var);
! 5070:
! 5071: ZEND_VM_NEXT_OPCODE();
! 5072: }
! 5073:
! 5074: static int ZEND_FASTCALL ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5075: {
! 5076: zend_op *opline = EX(opline);
! 5077: zend_free_op free_op1;
! 5078: zval *obj = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5079: zend_class_entry *ce;
! 5080: zend_function *clone;
! 5081: zend_object_clone_obj_t clone_call;
! 5082:
! 5083: if (IS_TMP_VAR == IS_CONST ||
! 5084: (IS_TMP_VAR == IS_VAR && !obj) ||
! 5085: Z_TYPE_P(obj) != IS_OBJECT) {
! 5086: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
! 5087: }
! 5088:
! 5089: ce = Z_OBJCE_P(obj);
! 5090: clone = ce ? ce->clone : NULL;
! 5091: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
! 5092: if (!clone_call) {
! 5093: if (ce) {
! 5094: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
! 5095: } else {
! 5096: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
! 5097: }
! 5098: }
! 5099:
! 5100: if (ce && clone) {
! 5101: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
! 5102: /* Ensure that if we're calling a private function, we're allowed to do so.
! 5103: */
! 5104: if (ce != EG(scope)) {
! 5105: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 5106: }
! 5107: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
! 5108: /* Ensure that if we're calling a protected function, we're allowed to do so.
! 5109: */
! 5110: if (!zend_check_protected(clone->common.scope, EG(scope))) {
! 5111: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 5112: }
! 5113: }
! 5114: }
! 5115:
! 5116: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 5117: if (!EG(exception)) {
! 5118: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 5119: Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
! 5120: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
! 5121: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 5122: Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 5123: if (!RETURN_VALUE_USED(opline) || EG(exception)) {
! 5124: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 5125: }
! 5126: }
! 5127:
! 5128: ZEND_VM_NEXT_OPCODE();
! 5129: }
! 5130:
! 5131: static int ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5132: {
! 5133: zend_op *opline = EX(opline);
! 5134: zend_free_op free_op1;
! 5135: zval *expr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5136: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5137:
! 5138: if (opline->extended_value != IS_STRING) {
! 5139: *result = *expr;
! 5140: if (!1) {
! 5141: zendi_zval_copy_ctor(*result);
! 5142: }
! 5143: }
! 5144: switch (opline->extended_value) {
! 5145: case IS_NULL:
! 5146: convert_to_null(result);
! 5147: break;
! 5148: case IS_BOOL:
! 5149: convert_to_boolean(result);
! 5150: break;
! 5151: case IS_LONG:
! 5152: convert_to_long(result);
! 5153: break;
! 5154: case IS_DOUBLE:
! 5155: convert_to_double(result);
! 5156: break;
! 5157: case IS_STRING: {
! 5158: zval var_copy;
! 5159: int use_copy;
! 5160:
! 5161: zend_make_printable_zval(expr, &var_copy, &use_copy);
! 5162: if (use_copy) {
! 5163: *result = var_copy;
! 5164: if (1) {
! 5165: zval_dtor(free_op1.var);
! 5166: }
! 5167: } else {
! 5168: *result = *expr;
! 5169: if (!1) {
! 5170: zendi_zval_copy_ctor(*result);
! 5171: }
! 5172: }
! 5173: break;
! 5174: }
! 5175: case IS_ARRAY:
! 5176: convert_to_array(result);
! 5177: break;
! 5178: case IS_OBJECT:
! 5179: convert_to_object(result);
! 5180: break;
! 5181: }
! 5182:
! 5183: ZEND_VM_NEXT_OPCODE();
! 5184: }
! 5185:
! 5186: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5187: {
! 5188: zend_op *opline = EX(opline);
! 5189: zend_op_array *new_op_array=NULL;
! 5190: int return_value_used;
! 5191: zend_free_op free_op1;
! 5192: zval *inc_filename = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5193: zval tmp_inc_filename;
! 5194: zend_bool failure_retval=0;
! 5195:
! 5196: if (inc_filename->type!=IS_STRING) {
! 5197: tmp_inc_filename = *inc_filename;
! 5198: zval_copy_ctor(&tmp_inc_filename);
! 5199: convert_to_string(&tmp_inc_filename);
! 5200: inc_filename = &tmp_inc_filename;
! 5201: }
! 5202:
! 5203: return_value_used = RETURN_VALUE_USED(opline);
! 5204:
! 5205: if (Z_LVAL(opline->op2.u.constant) != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
! 5206: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE || Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE) {
! 5207: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 5208: } else {
! 5209: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 5210: }
! 5211: } else {
! 5212: switch (Z_LVAL(opline->op2.u.constant)) {
! 5213: case ZEND_INCLUDE_ONCE:
! 5214: case ZEND_REQUIRE_ONCE: {
! 5215: zend_file_handle file_handle;
! 5216: char *resolved_path;
! 5217:
! 5218: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
! 5219: if (resolved_path) {
! 5220: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
! 5221: } else {
! 5222: resolved_path = Z_STRVAL_P(inc_filename);
! 5223: }
! 5224:
! 5225: if (failure_retval) {
! 5226: /* do nothing, file already included */
! 5227: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
! 5228:
! 5229: if (!file_handle.opened_path) {
! 5230: file_handle.opened_path = estrdup(resolved_path);
! 5231: }
! 5232:
! 5233: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
! 5234: new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
! 5235: zend_destroy_file_handle(&file_handle TSRMLS_CC);
! 5236: } else {
! 5237: zend_file_handle_dtor(&file_handle TSRMLS_CC);
! 5238: failure_retval=1;
! 5239: }
! 5240: } else {
! 5241: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
! 5242: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 5243: } else {
! 5244: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 5245: }
! 5246: }
! 5247: if (resolved_path != Z_STRVAL_P(inc_filename)) {
! 5248: efree(resolved_path);
! 5249: }
! 5250: }
! 5251: break;
! 5252: case ZEND_INCLUDE:
! 5253: case ZEND_REQUIRE:
! 5254: new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
! 5255: break;
! 5256: case ZEND_EVAL: {
! 5257: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
! 5258:
! 5259: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
! 5260: efree(eval_desc);
! 5261: }
! 5262: break;
! 5263: EMPTY_SWITCH_DEFAULT_CASE()
! 5264: }
! 5265: }
! 5266: if (inc_filename==&tmp_inc_filename) {
! 5267: zval_dtor(&tmp_inc_filename);
! 5268: }
! 5269: zval_dtor(free_op1.var);
! 5270: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 5271: if (new_op_array && !EG(exception)) {
! 5272: EX(original_return_value) = EG(return_value_ptr_ptr);
! 5273: EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
! 5274: EG(active_op_array) = new_op_array;
! 5275: EX_T(opline->result.u.var).var.ptr = NULL;
! 5276:
! 5277: EX(current_object) = EX(object);
! 5278:
! 5279: EX(function_state).function = (zend_function *) new_op_array;
! 5280: EX(object) = NULL;
! 5281:
! 5282: if (!EG(active_symbol_table)) {
! 5283: zend_rebuild_symbol_table(TSRMLS_C);
! 5284: }
! 5285:
! 5286: if (zend_execute == execute) {
! 5287: EX(call_opline) = opline;
! 5288: ZEND_VM_ENTER();
! 5289: } else {
! 5290: zend_execute(new_op_array TSRMLS_CC);
! 5291: }
! 5292:
! 5293: EX(function_state).function = (zend_function *) EX(op_array);
! 5294: EX(object) = EX(current_object);
! 5295:
! 5296: if (return_value_used) {
! 5297: if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
! 5298: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 5299: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 5300: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
! 5301: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 5302: }
! 5303: }
! 5304:
! 5305: EG(opline_ptr) = &EX(opline);
! 5306: EG(active_op_array) = EX(op_array);
! 5307: EG(return_value_ptr_ptr) = EX(original_return_value);
! 5308: destroy_op_array(new_op_array TSRMLS_CC);
! 5309: efree(new_op_array);
! 5310: if (EG(exception)) {
! 5311: zend_throw_exception_internal(NULL TSRMLS_CC);
! 5312: }
! 5313: } else {
! 5314: if (return_value_used) {
! 5315: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 5316: INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
! 5317: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
! 5318: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 5319: }
! 5320: }
! 5321: ZEND_VM_NEXT_OPCODE();
! 5322: }
! 5323:
! 5324: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5325: {
! 5326: zend_op *opline = EX(opline);
! 5327: zval tmp, *varname;
! 5328: HashTable *target_symbol_table;
! 5329: zend_free_op free_op1;
! 5330:
! 5331: if (IS_TMP_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 5332: if (EG(active_symbol_table)) {
! 5333: zend_execute_data *ex = EX(prev_execute_data);
! 5334: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 5335:
! 5336: if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
! 5337: while (ex && ex->symbol_table == EG(active_symbol_table)) {
! 5338: int i;
! 5339:
! 5340: if (ex->op_array) {
! 5341: for (i = 0; i < ex->op_array->last_var; i++) {
! 5342: if (ex->op_array->vars[i].hash_value == cv->hash_value &&
! 5343: ex->op_array->vars[i].name_len == cv->name_len &&
! 5344: !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
! 5345: ex->CVs[i] = NULL;
! 5346: break;
! 5347: }
! 5348: }
! 5349: }
! 5350: ex = ex->prev_execute_data;
! 5351: }
! 5352: }
! 5353: EX(CVs)[opline->op1.u.var] = NULL;
! 5354: } else if (EX(CVs)[opline->op1.u.var]) {
! 5355: zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
! 5356: EX(CVs)[opline->op1.u.var] = NULL;
! 5357: }
! 5358: ZEND_VM_NEXT_OPCODE();
! 5359: }
! 5360:
! 5361: varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5362:
! 5363: if (Z_TYPE_P(varname) != IS_STRING) {
! 5364: tmp = *varname;
! 5365: zval_copy_ctor(&tmp);
! 5366: convert_to_string(&tmp);
! 5367: varname = &tmp;
! 5368: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
! 5369: Z_ADDREF_P(varname);
! 5370: }
! 5371:
! 5372: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 5373: zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
! 5374: } else {
! 5375: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
! 5376:
! 5377: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 5378: if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
! 5379: zend_execute_data *ex = execute_data;
! 5380:
! 5381: do {
! 5382: int i;
! 5383:
! 5384: if (ex->op_array) {
! 5385: for (i = 0; i < ex->op_array->last_var; i++) {
! 5386: if (ex->op_array->vars[i].hash_value == hash_value &&
! 5387: ex->op_array->vars[i].name_len == varname->value.str.len &&
! 5388: !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
! 5389: ex->CVs[i] = NULL;
! 5390: break;
! 5391: }
! 5392: }
! 5393: }
! 5394: ex = ex->prev_execute_data;
! 5395: } while (ex && ex->symbol_table == target_symbol_table);
! 5396: }
! 5397: }
! 5398:
! 5399: if (varname == &tmp) {
! 5400: zval_dtor(&tmp);
! 5401: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
! 5402: zval_ptr_dtor(&varname);
! 5403: }
! 5404: zval_dtor(free_op1.var);
! 5405: ZEND_VM_NEXT_OPCODE();
! 5406: }
! 5407:
! 5408: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5409: {
! 5410: zend_op *opline = EX(opline);
! 5411: zend_free_op free_op1;
! 5412: zval *array_ptr, **array_ptr_ptr;
! 5413: HashTable *fe_ht;
! 5414: zend_object_iterator *iter = NULL;
! 5415: zend_class_entry *ce = NULL;
! 5416: zend_bool is_empty = 0;
! 5417:
! 5418: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 5419: array_ptr_ptr = NULL;
! 5420: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
! 5421: ALLOC_INIT_ZVAL(array_ptr);
! 5422: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
! 5423: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
! 5424: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
! 5425: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 5426: }
! 5427:
! 5428: ce = Z_OBJCE_PP(array_ptr_ptr);
! 5429: if (!ce || ce->get_iterator == NULL) {
! 5430: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 5431: Z_ADDREF_PP(array_ptr_ptr);
! 5432: }
! 5433: array_ptr = *array_ptr_ptr;
! 5434: } else {
! 5435: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
! 5436: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 5437: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
! 5438: Z_SET_ISREF_PP(array_ptr_ptr);
! 5439: }
! 5440: }
! 5441: array_ptr = *array_ptr_ptr;
! 5442: Z_ADDREF_P(array_ptr);
! 5443: }
! 5444: } else {
! 5445: array_ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5446: if (1) { /* IS_TMP_VAR */
! 5447: zval *tmp;
! 5448:
! 5449: ALLOC_ZVAL(tmp);
! 5450: INIT_PZVAL_COPY(tmp, array_ptr);
! 5451: array_ptr = tmp;
! 5452: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 5453: ce = Z_OBJCE_P(array_ptr);
! 5454: if (ce && ce->get_iterator) {
! 5455: Z_DELREF_P(array_ptr);
! 5456: }
! 5457: }
! 5458: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 5459: ce = Z_OBJCE_P(array_ptr);
! 5460: if (!ce || !ce->get_iterator) {
! 5461: Z_ADDREF_P(array_ptr);
! 5462: }
! 5463: } else if (IS_TMP_VAR == IS_CONST ||
! 5464: ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
! 5465: !Z_ISREF_P(array_ptr) &&
! 5466: Z_REFCOUNT_P(array_ptr) > 1)) {
! 5467: zval *tmp;
! 5468:
! 5469: ALLOC_ZVAL(tmp);
! 5470: INIT_PZVAL_COPY(tmp, array_ptr);
! 5471: zval_copy_ctor(tmp);
! 5472: array_ptr = tmp;
! 5473: } else {
! 5474: Z_ADDREF_P(array_ptr);
! 5475: }
! 5476: }
! 5477:
! 5478: if (ce && ce->get_iterator) {
! 5479: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
! 5480:
! 5481: if (iter && !EG(exception)) {
! 5482: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
! 5483: } else {
! 5484: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 5485:
! 5486: } else {
! 5487:
! 5488: }
! 5489: if (!EG(exception)) {
! 5490: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
! 5491: }
! 5492: zend_throw_exception_internal(NULL TSRMLS_CC);
! 5493: ZEND_VM_NEXT_OPCODE();
! 5494: }
! 5495: }
! 5496:
! 5497: AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
! 5498: PZVAL_LOCK(array_ptr);
! 5499:
! 5500: if (iter) {
! 5501: iter->index = 0;
! 5502: if (iter->funcs->rewind) {
! 5503: iter->funcs->rewind(iter TSRMLS_CC);
! 5504: if (EG(exception)) {
! 5505: Z_DELREF_P(array_ptr);
! 5506: zval_ptr_dtor(&array_ptr);
! 5507: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 5508:
! 5509: } else {
! 5510:
! 5511: }
! 5512: ZEND_VM_NEXT_OPCODE();
! 5513: }
! 5514: }
! 5515: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
! 5516: if (EG(exception)) {
! 5517: Z_DELREF_P(array_ptr);
! 5518: zval_ptr_dtor(&array_ptr);
! 5519: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 5520:
! 5521: } else {
! 5522:
! 5523: }
! 5524: ZEND_VM_NEXT_OPCODE();
! 5525: }
! 5526: iter->index = -1; /* will be set to 0 before using next handler */
! 5527: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
! 5528: zend_hash_internal_pointer_reset(fe_ht);
! 5529: if (ce) {
! 5530: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
! 5531: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
! 5532: char *str_key;
! 5533: uint str_key_len;
! 5534: ulong int_key;
! 5535: zend_uchar key_type;
! 5536:
! 5537: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
! 5538: if (key_type != HASH_KEY_NON_EXISTANT &&
! 5539: (key_type == HASH_KEY_IS_LONG ||
! 5540: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
! 5541: break;
! 5542: }
! 5543: zend_hash_move_forward(fe_ht);
! 5544: }
! 5545: }
! 5546: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
! 5547: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
! 5548: } else {
! 5549: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
! 5550: is_empty = 1;
! 5551: }
! 5552:
! 5553: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 5554:
! 5555: } else {
! 5556:
! 5557: }
! 5558: if (is_empty) {
! 5559: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 5560: } else {
! 5561: ZEND_VM_NEXT_OPCODE();
! 5562: }
! 5563: }
! 5564:
! 5565: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5566: {
! 5567: zend_op *opline = EX(opline);
! 5568: zval **value;
! 5569: zend_bool isset = 1;
! 5570:
! 5571: if (IS_TMP_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 5572: if (EX(CVs)[opline->op1.u.var]) {
! 5573: value = EX(CVs)[opline->op1.u.var];
! 5574: } else if (EG(active_symbol_table)) {
! 5575: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 5576:
! 5577: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
! 5578: isset = 0;
! 5579: }
! 5580: } else {
! 5581: isset = 0;
! 5582: }
! 5583: } else {
! 5584: HashTable *target_symbol_table;
! 5585: zend_free_op free_op1;
! 5586: zval tmp, *varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5587:
! 5588: if (Z_TYPE_P(varname) != IS_STRING) {
! 5589: tmp = *varname;
! 5590: zval_copy_ctor(&tmp);
! 5591: convert_to_string(&tmp);
! 5592: varname = &tmp;
! 5593: }
! 5594:
! 5595: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 5596: 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);
! 5597: if (!value) {
! 5598: isset = 0;
! 5599: }
! 5600: } else {
! 5601: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 5602: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
! 5603: isset = 0;
! 5604: }
! 5605: }
! 5606:
! 5607: if (varname == &tmp) {
! 5608: zval_dtor(&tmp);
! 5609: }
! 5610: zval_dtor(free_op1.var);
! 5611: }
! 5612:
! 5613: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 5614:
! 5615: switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
! 5616: case ZEND_ISSET:
! 5617: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 5618: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 5619: } else {
! 5620: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
! 5621: }
! 5622: break;
! 5623: case ZEND_ISEMPTY:
! 5624: if (!isset || !i_zend_is_true(*value)) {
! 5625: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 5626: } else {
! 5627: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 5628: }
! 5629: break;
! 5630: }
! 5631:
! 5632: ZEND_VM_NEXT_OPCODE();
! 5633: }
! 5634:
! 5635: static int ZEND_FASTCALL ZEND_EXIT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5636: {
! 5637: #if 0 || (IS_TMP_VAR != IS_UNUSED)
! 5638: zend_op *opline = EX(opline);
! 5639: if (IS_TMP_VAR != IS_UNUSED) {
! 5640: zend_free_op free_op1;
! 5641: zval *ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5642:
! 5643: if (Z_TYPE_P(ptr) == IS_LONG) {
! 5644: EG(exit_status) = Z_LVAL_P(ptr);
! 5645: } else {
! 5646: zend_print_variable(ptr);
! 5647: }
! 5648: zval_dtor(free_op1.var);
! 5649: }
! 5650: #endif
! 5651: zend_bailout();
! 5652: ZEND_VM_NEXT_OPCODE();
! 5653: }
! 5654:
! 5655: static int ZEND_FASTCALL ZEND_END_SILENCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5656: {
! 5657: zend_op *opline = EX(opline);
! 5658: zval restored_error_reporting;
! 5659:
! 5660: if (!EG(error_reporting) && Z_LVAL(EX_T(opline->op1.u.var).tmp_var) != 0) {
! 5661: Z_TYPE(restored_error_reporting) = IS_LONG;
! 5662: Z_LVAL(restored_error_reporting) = Z_LVAL(EX_T(opline->op1.u.var).tmp_var);
! 5663: convert_to_string(&restored_error_reporting);
! 5664: 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);
! 5665: zendi_zval_dtor(restored_error_reporting);
! 5666: }
! 5667: if (EX(old_error_reporting) == &EX_T(opline->op1.u.var).tmp_var) {
! 5668: EX(old_error_reporting) = NULL;
! 5669: }
! 5670: ZEND_VM_NEXT_OPCODE();
! 5671: }
! 5672:
! 5673: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5674: {
! 5675: zend_op *opline = EX(opline);
! 5676: zend_free_op free_op1;
! 5677: zval *value = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5678:
! 5679: if (i_zend_is_true(value)) {
! 5680: EX_T(opline->result.u.var).tmp_var = *value;
! 5681: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 5682: zval_dtor(free_op1.var);
! 5683: #if DEBUG_ZEND>=2
! 5684: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 5685: #endif
! 5686: ZEND_VM_JMP(opline->op2.u.jmp_addr);
! 5687: }
! 5688:
! 5689: zval_dtor(free_op1.var);
! 5690: ZEND_VM_NEXT_OPCODE();
! 5691: }
! 5692:
! 5693: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5694: {
! 5695: zend_op *opline = EX(opline);
! 5696: zend_free_op free_op1;
! 5697: zval *value = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5698:
! 5699: EX_T(opline->result.u.var).tmp_var = *value;
! 5700: if (!1) {
! 5701: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 5702: }
! 5703:
! 5704: ZEND_VM_NEXT_OPCODE();
! 5705: }
! 5706:
! 5707: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5708: {
! 5709: zend_op *opline = EX(opline);
! 5710: zend_free_op free_op1;
! 5711: zval *expr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5712: zend_bool result;
! 5713:
! 5714: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
! 5715: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.u.var).class_entry TSRMLS_CC);
! 5716: } else {
! 5717: result = 0;
! 5718: }
! 5719: ZVAL_BOOL(&EX_T(opline->result.u.var).tmp_var, result);
! 5720: zval_dtor(free_op1.var);
! 5721: ZEND_VM_NEXT_OPCODE();
! 5722: }
! 5723:
! 5724: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5725: {
! 5726: zend_op *opline = EX(opline);
! 5727: zend_free_op free_op1;
! 5728:
! 5729: add_function(&EX_T(opline->result.u.var).tmp_var,
! 5730: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5731: &opline->op2.u.constant TSRMLS_CC);
! 5732: zval_dtor(free_op1.var);
! 5733:
! 5734: ZEND_VM_NEXT_OPCODE();
! 5735: }
! 5736:
! 5737: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5738: {
! 5739: zend_op *opline = EX(opline);
! 5740: zend_free_op free_op1;
! 5741:
! 5742: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 5743: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5744: &opline->op2.u.constant TSRMLS_CC);
! 5745: zval_dtor(free_op1.var);
! 5746:
! 5747: ZEND_VM_NEXT_OPCODE();
! 5748: }
! 5749:
! 5750: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5751: {
! 5752: zend_op *opline = EX(opline);
! 5753: zend_free_op free_op1;
! 5754:
! 5755: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 5756: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5757: &opline->op2.u.constant TSRMLS_CC);
! 5758: zval_dtor(free_op1.var);
! 5759:
! 5760: ZEND_VM_NEXT_OPCODE();
! 5761: }
! 5762:
! 5763: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5764: {
! 5765: zend_op *opline = EX(opline);
! 5766: zend_free_op free_op1;
! 5767:
! 5768: div_function(&EX_T(opline->result.u.var).tmp_var,
! 5769: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5770: &opline->op2.u.constant TSRMLS_CC);
! 5771: zval_dtor(free_op1.var);
! 5772:
! 5773: ZEND_VM_NEXT_OPCODE();
! 5774: }
! 5775:
! 5776: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5777: {
! 5778: zend_op *opline = EX(opline);
! 5779: zend_free_op free_op1;
! 5780:
! 5781: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 5782: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5783: &opline->op2.u.constant TSRMLS_CC);
! 5784: zval_dtor(free_op1.var);
! 5785:
! 5786: ZEND_VM_NEXT_OPCODE();
! 5787: }
! 5788:
! 5789: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5790: {
! 5791: zend_op *opline = EX(opline);
! 5792: zend_free_op free_op1;
! 5793:
! 5794: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 5795: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5796: &opline->op2.u.constant TSRMLS_CC);
! 5797: zval_dtor(free_op1.var);
! 5798:
! 5799: ZEND_VM_NEXT_OPCODE();
! 5800: }
! 5801:
! 5802: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5803: {
! 5804: zend_op *opline = EX(opline);
! 5805: zend_free_op free_op1;
! 5806:
! 5807: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 5808: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5809: &opline->op2.u.constant TSRMLS_CC);
! 5810: zval_dtor(free_op1.var);
! 5811:
! 5812: ZEND_VM_NEXT_OPCODE();
! 5813: }
! 5814:
! 5815: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5816: {
! 5817: zend_op *opline = EX(opline);
! 5818: zend_free_op free_op1;
! 5819:
! 5820: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 5821: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5822: &opline->op2.u.constant TSRMLS_CC);
! 5823: zval_dtor(free_op1.var);
! 5824:
! 5825: ZEND_VM_NEXT_OPCODE();
! 5826: }
! 5827:
! 5828: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5829: {
! 5830: zend_op *opline = EX(opline);
! 5831: zend_free_op free_op1;
! 5832:
! 5833: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 5834: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5835: &opline->op2.u.constant TSRMLS_CC);
! 5836: zval_dtor(free_op1.var);
! 5837:
! 5838: ZEND_VM_NEXT_OPCODE();
! 5839: }
! 5840:
! 5841: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5842: {
! 5843: zend_op *opline = EX(opline);
! 5844: zend_free_op free_op1;
! 5845: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5846:
! 5847: is_identical_function(result,
! 5848: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5849: &opline->op2.u.constant TSRMLS_CC);
! 5850: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 5851: zval_dtor(free_op1.var);
! 5852:
! 5853: ZEND_VM_NEXT_OPCODE();
! 5854: }
! 5855:
! 5856: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5857: {
! 5858: zend_op *opline = EX(opline);
! 5859: zend_free_op free_op1;
! 5860: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5861:
! 5862: compare_function(result,
! 5863: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5864: &opline->op2.u.constant TSRMLS_CC);
! 5865: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 5866: zval_dtor(free_op1.var);
! 5867:
! 5868: ZEND_VM_NEXT_OPCODE();
! 5869: }
! 5870:
! 5871: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5872: {
! 5873: zend_op *opline = EX(opline);
! 5874: zend_free_op free_op1;
! 5875: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5876:
! 5877: compare_function(result,
! 5878: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5879: &opline->op2.u.constant TSRMLS_CC);
! 5880: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 5881: zval_dtor(free_op1.var);
! 5882:
! 5883: ZEND_VM_NEXT_OPCODE();
! 5884: }
! 5885:
! 5886: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5887: {
! 5888: zend_op *opline = EX(opline);
! 5889: zend_free_op free_op1;
! 5890: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5891:
! 5892: compare_function(result,
! 5893: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5894: &opline->op2.u.constant TSRMLS_CC);
! 5895: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 5896: zval_dtor(free_op1.var);
! 5897:
! 5898: ZEND_VM_NEXT_OPCODE();
! 5899: }
! 5900:
! 5901: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5902: {
! 5903: zend_op *opline = EX(opline);
! 5904: zend_free_op free_op1;
! 5905: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 5906:
! 5907: compare_function(result,
! 5908: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5909: &opline->op2.u.constant TSRMLS_CC);
! 5910: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 5911: zval_dtor(free_op1.var);
! 5912:
! 5913: ZEND_VM_NEXT_OPCODE();
! 5914: }
! 5915:
! 5916: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5917: {
! 5918: zend_op *opline = EX(opline);
! 5919: zend_free_op free_op1;
! 5920:
! 5921: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 5922: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5923: &opline->op2.u.constant TSRMLS_CC);
! 5924: zval_dtor(free_op1.var);
! 5925:
! 5926: ZEND_VM_NEXT_OPCODE();
! 5927: }
! 5928:
! 5929: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5930: {
! 5931: zend_op *opline = EX(opline);
! 5932: zend_free_op free_op1;
! 5933:
! 5934: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 5935: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5936: &opline->op2.u.constant TSRMLS_CC);
! 5937: zval_dtor(free_op1.var);
! 5938:
! 5939: ZEND_VM_NEXT_OPCODE();
! 5940: }
! 5941:
! 5942: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5943: {
! 5944: zend_op *opline = EX(opline);
! 5945: zend_free_op free_op1;
! 5946:
! 5947: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 5948: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5949: &opline->op2.u.constant TSRMLS_CC);
! 5950: zval_dtor(free_op1.var);
! 5951:
! 5952: ZEND_VM_NEXT_OPCODE();
! 5953: }
! 5954:
! 5955: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5956: {
! 5957: zend_op *opline = EX(opline);
! 5958: zend_free_op free_op1;
! 5959:
! 5960: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 5961: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 5962: &opline->op2.u.constant TSRMLS_CC);
! 5963: zval_dtor(free_op1.var);
! 5964:
! 5965: ZEND_VM_NEXT_OPCODE();
! 5966: }
! 5967:
! 5968: static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5969: {
! 5970: zend_op *opline = EX(opline);
! 5971: zend_free_op free_op1;
! 5972: zval *container = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 5973:
! 5974: if (Z_TYPE_P(container) != IS_ARRAY) {
! 5975: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 5976: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 5977: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 5978: }
! 5979: } else {
! 5980:
! 5981: zval *dim = &opline->op2.u.constant;
! 5982:
! 5983: 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));
! 5984: SELECTIVE_PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr, &opline->result);
! 5985:
! 5986: }
! 5987: ZEND_VM_NEXT_OPCODE();
! 5988: }
! 5989:
! 5990: static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 5991: {
! 5992: zend_op *opline = EX(opline);
! 5993: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 5994:
! 5995: if (IS_TMP_VAR == IS_UNUSED) {
! 5996: /* Initialize for erealloc in add_char_to_string */
! 5997: Z_STRVAL_P(str) = NULL;
! 5998: Z_STRLEN_P(str) = 0;
! 5999: Z_TYPE_P(str) = IS_STRING;
! 6000:
! 6001: INIT_PZVAL(str);
! 6002: }
! 6003:
! 6004: add_char_to_string(str, str, &opline->op2.u.constant);
! 6005:
! 6006: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
! 6007: ZEND_VM_NEXT_OPCODE();
! 6008: }
! 6009:
! 6010: static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6011: {
! 6012: zend_op *opline = EX(opline);
! 6013: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 6014:
! 6015: if (IS_TMP_VAR == IS_UNUSED) {
! 6016: /* Initialize for erealloc in add_string_to_string */
! 6017: Z_STRVAL_P(str) = NULL;
! 6018: Z_STRLEN_P(str) = 0;
! 6019: Z_TYPE_P(str) = IS_STRING;
! 6020:
! 6021: INIT_PZVAL(str);
! 6022: }
! 6023:
! 6024: add_string_to_string(str, str, &opline->op2.u.constant);
! 6025:
! 6026: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
! 6027: ZEND_VM_NEXT_OPCODE();
! 6028: }
! 6029:
! 6030: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6031: {
! 6032: zend_op *opline = EX(opline);
! 6033: zval *function_name;
! 6034: char *function_name_strval;
! 6035: int function_name_strlen;
! 6036: zend_free_op free_op1;
! 6037:
! 6038: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 6039:
! 6040: function_name = &opline->op2.u.constant;
! 6041:
! 6042: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 6043: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 6044: }
! 6045:
! 6046: function_name_strval = Z_STRVAL_P(function_name);
! 6047: function_name_strlen = Z_STRLEN_P(function_name);
! 6048:
! 6049: EX(object) = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6050:
! 6051: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 6052: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 6053: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 6054: }
! 6055:
! 6056: /* First, locate the function. */
! 6057: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 6058: if (!EX(fbc)) {
! 6059: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 6060: }
! 6061:
! 6062: EX(called_scope) = Z_OBJCE_P(EX(object));
! 6063: } else {
! 6064: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 6065: }
! 6066:
! 6067: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 6068: EX(object) = NULL;
! 6069: } else {
! 6070: if (!PZVAL_IS_REF(EX(object))) {
! 6071: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 6072: } else {
! 6073: zval *this_ptr;
! 6074: ALLOC_ZVAL(this_ptr);
! 6075: INIT_PZVAL_COPY(this_ptr, EX(object));
! 6076: zval_copy_ctor(this_ptr);
! 6077: EX(object) = this_ptr;
! 6078: }
! 6079: }
! 6080:
! 6081:
! 6082: ZEND_VM_NEXT_OPCODE();
! 6083: }
! 6084:
! 6085: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6086: {
! 6087: zend_op *opline = EX(opline);
! 6088: int switch_expr_is_overloaded=0;
! 6089: zend_free_op free_op1;
! 6090:
! 6091: if (IS_TMP_VAR==IS_VAR) {
! 6092: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 6093: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 6094: } else {
! 6095: switch_expr_is_overloaded = 1;
! 6096: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 6097: }
! 6098: }
! 6099: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 6100: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6101: &opline->op2.u.constant TSRMLS_CC);
! 6102:
! 6103: if (switch_expr_is_overloaded) {
! 6104: /* We only free op1 if this is a string offset,
! 6105: * Since if it is a TMP_VAR, it'll be reused by
! 6106: * other CASE opcodes (whereas string offsets
! 6107: * are allocated at each get_zval_ptr())
! 6108: */
! 6109: zval_dtor(free_op1.var);
! 6110: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 6111: EX_T(opline->op1.u.var).var.ptr = NULL;
! 6112: }
! 6113: ZEND_VM_NEXT_OPCODE();
! 6114: }
! 6115:
! 6116: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6117: {
! 6118: zend_op *opline = EX(opline);
! 6119: zend_free_op free_op1;
! 6120: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 6121: zval *expr_ptr;
! 6122: zval *offset=&opline->op2.u.constant;
! 6123:
! 6124: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 6125: zval **expr_ptr_ptr = NULL;
! 6126:
! 6127: if (opline->extended_value) {
! 6128: expr_ptr_ptr=NULL;
! 6129: expr_ptr = *expr_ptr_ptr;
! 6130: } else {
! 6131: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6132: }
! 6133: #else
! 6134: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6135: #endif
! 6136:
! 6137: if (1) { /* temporary variable */
! 6138: zval *new_expr;
! 6139:
! 6140: ALLOC_ZVAL(new_expr);
! 6141: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 6142: expr_ptr = new_expr;
! 6143: } else {
! 6144: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 6145: if (opline->extended_value) {
! 6146: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 6147: expr_ptr = *expr_ptr_ptr;
! 6148: Z_ADDREF_P(expr_ptr);
! 6149: } else
! 6150: #endif
! 6151: if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 6152: zval *new_expr;
! 6153:
! 6154: ALLOC_ZVAL(new_expr);
! 6155: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 6156: expr_ptr = new_expr;
! 6157: zendi_zval_copy_ctor(*expr_ptr);
! 6158: } else {
! 6159: Z_ADDREF_P(expr_ptr);
! 6160: }
! 6161: }
! 6162: if (offset) {
! 6163: switch (Z_TYPE_P(offset)) {
! 6164: case IS_DOUBLE:
! 6165: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 6166: break;
! 6167: case IS_LONG:
! 6168: case IS_BOOL:
! 6169: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 6170: break;
! 6171: case IS_STRING:
! 6172: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 6173: break;
! 6174: case IS_NULL:
! 6175: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 6176: break;
! 6177: default:
! 6178: zend_error(E_WARNING, "Illegal offset type");
! 6179: zval_ptr_dtor(&expr_ptr);
! 6180: /* do nothing */
! 6181: break;
! 6182: }
! 6183:
! 6184: } else {
! 6185: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 6186: }
! 6187: if (opline->extended_value) {
! 6188:
! 6189: } else {
! 6190:
! 6191: }
! 6192: ZEND_VM_NEXT_OPCODE();
! 6193: }
! 6194:
! 6195: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6196: {
! 6197: zend_op *opline = EX(opline);
! 6198:
! 6199: array_init(&EX_T(opline->result.u.var).tmp_var);
! 6200: if (IS_TMP_VAR == IS_UNUSED) {
! 6201: ZEND_VM_NEXT_OPCODE();
! 6202: #if 0 || IS_TMP_VAR != IS_UNUSED
! 6203: } else {
! 6204: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 6205: #endif
! 6206: }
! 6207: }
! 6208:
! 6209: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6210: {
! 6211: zend_op *opline = EX(opline);
! 6212: zend_free_op free_op1, free_op2;
! 6213:
! 6214: add_function(&EX_T(opline->result.u.var).tmp_var,
! 6215: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6216: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6217: zval_dtor(free_op1.var);
! 6218: zval_dtor(free_op2.var);
! 6219: ZEND_VM_NEXT_OPCODE();
! 6220: }
! 6221:
! 6222: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6223: {
! 6224: zend_op *opline = EX(opline);
! 6225: zend_free_op free_op1, free_op2;
! 6226:
! 6227: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 6228: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6229: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6230: zval_dtor(free_op1.var);
! 6231: zval_dtor(free_op2.var);
! 6232: ZEND_VM_NEXT_OPCODE();
! 6233: }
! 6234:
! 6235: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6236: {
! 6237: zend_op *opline = EX(opline);
! 6238: zend_free_op free_op1, free_op2;
! 6239:
! 6240: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 6241: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6242: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6243: zval_dtor(free_op1.var);
! 6244: zval_dtor(free_op2.var);
! 6245: ZEND_VM_NEXT_OPCODE();
! 6246: }
! 6247:
! 6248: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6249: {
! 6250: zend_op *opline = EX(opline);
! 6251: zend_free_op free_op1, free_op2;
! 6252:
! 6253: div_function(&EX_T(opline->result.u.var).tmp_var,
! 6254: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6255: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6256: zval_dtor(free_op1.var);
! 6257: zval_dtor(free_op2.var);
! 6258: ZEND_VM_NEXT_OPCODE();
! 6259: }
! 6260:
! 6261: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6262: {
! 6263: zend_op *opline = EX(opline);
! 6264: zend_free_op free_op1, free_op2;
! 6265:
! 6266: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 6267: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6268: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6269: zval_dtor(free_op1.var);
! 6270: zval_dtor(free_op2.var);
! 6271: ZEND_VM_NEXT_OPCODE();
! 6272: }
! 6273:
! 6274: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6275: {
! 6276: zend_op *opline = EX(opline);
! 6277: zend_free_op free_op1, free_op2;
! 6278:
! 6279: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 6280: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6281: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6282: zval_dtor(free_op1.var);
! 6283: zval_dtor(free_op2.var);
! 6284: ZEND_VM_NEXT_OPCODE();
! 6285: }
! 6286:
! 6287: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6288: {
! 6289: zend_op *opline = EX(opline);
! 6290: zend_free_op free_op1, free_op2;
! 6291:
! 6292: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 6293: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6294: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6295: zval_dtor(free_op1.var);
! 6296: zval_dtor(free_op2.var);
! 6297: ZEND_VM_NEXT_OPCODE();
! 6298: }
! 6299:
! 6300: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6301: {
! 6302: zend_op *opline = EX(opline);
! 6303: zend_free_op free_op1, free_op2;
! 6304:
! 6305: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 6306: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6307: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6308: zval_dtor(free_op1.var);
! 6309: zval_dtor(free_op2.var);
! 6310: ZEND_VM_NEXT_OPCODE();
! 6311: }
! 6312:
! 6313: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6314: {
! 6315: zend_op *opline = EX(opline);
! 6316: zend_free_op free_op1, free_op2;
! 6317:
! 6318: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 6319: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6320: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6321: zval_dtor(free_op1.var);
! 6322: zval_dtor(free_op2.var);
! 6323: ZEND_VM_NEXT_OPCODE();
! 6324: }
! 6325:
! 6326: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6327: {
! 6328: zend_op *opline = EX(opline);
! 6329: zend_free_op free_op1, free_op2;
! 6330: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6331:
! 6332: is_identical_function(result,
! 6333: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6334: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6335: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 6336: zval_dtor(free_op1.var);
! 6337: zval_dtor(free_op2.var);
! 6338: ZEND_VM_NEXT_OPCODE();
! 6339: }
! 6340:
! 6341: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6342: {
! 6343: zend_op *opline = EX(opline);
! 6344: zend_free_op free_op1, free_op2;
! 6345: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6346:
! 6347: compare_function(result,
! 6348: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6349: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6350: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 6351: zval_dtor(free_op1.var);
! 6352: zval_dtor(free_op2.var);
! 6353: ZEND_VM_NEXT_OPCODE();
! 6354: }
! 6355:
! 6356: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6357: {
! 6358: zend_op *opline = EX(opline);
! 6359: zend_free_op free_op1, free_op2;
! 6360: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6361:
! 6362: compare_function(result,
! 6363: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6364: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6365: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 6366: zval_dtor(free_op1.var);
! 6367: zval_dtor(free_op2.var);
! 6368: ZEND_VM_NEXT_OPCODE();
! 6369: }
! 6370:
! 6371: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6372: {
! 6373: zend_op *opline = EX(opline);
! 6374: zend_free_op free_op1, free_op2;
! 6375: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6376:
! 6377: compare_function(result,
! 6378: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6379: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6380: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 6381: zval_dtor(free_op1.var);
! 6382: zval_dtor(free_op2.var);
! 6383: ZEND_VM_NEXT_OPCODE();
! 6384: }
! 6385:
! 6386: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6387: {
! 6388: zend_op *opline = EX(opline);
! 6389: zend_free_op free_op1, free_op2;
! 6390: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6391:
! 6392: compare_function(result,
! 6393: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6394: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6395: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 6396: zval_dtor(free_op1.var);
! 6397: zval_dtor(free_op2.var);
! 6398: ZEND_VM_NEXT_OPCODE();
! 6399: }
! 6400:
! 6401: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6402: {
! 6403: zend_op *opline = EX(opline);
! 6404: zend_free_op free_op1, free_op2;
! 6405:
! 6406: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 6407: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6408: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6409: zval_dtor(free_op1.var);
! 6410: zval_dtor(free_op2.var);
! 6411: ZEND_VM_NEXT_OPCODE();
! 6412: }
! 6413:
! 6414: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6415: {
! 6416: zend_op *opline = EX(opline);
! 6417: zend_free_op free_op1, free_op2;
! 6418:
! 6419: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 6420: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6421: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6422: zval_dtor(free_op1.var);
! 6423: zval_dtor(free_op2.var);
! 6424: ZEND_VM_NEXT_OPCODE();
! 6425: }
! 6426:
! 6427: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6428: {
! 6429: zend_op *opline = EX(opline);
! 6430: zend_free_op free_op1, free_op2;
! 6431:
! 6432: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 6433: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6434: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6435: zval_dtor(free_op1.var);
! 6436: zval_dtor(free_op2.var);
! 6437: ZEND_VM_NEXT_OPCODE();
! 6438: }
! 6439:
! 6440: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6441: {
! 6442: zend_op *opline = EX(opline);
! 6443: zend_free_op free_op1, free_op2;
! 6444:
! 6445: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 6446: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6447: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6448: zval_dtor(free_op1.var);
! 6449: zval_dtor(free_op2.var);
! 6450: ZEND_VM_NEXT_OPCODE();
! 6451: }
! 6452:
! 6453: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6454: {
! 6455: zend_op *opline = EX(opline);
! 6456: zend_free_op free_op2;
! 6457: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 6458: zval *var = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 6459: zval var_copy;
! 6460: int use_copy = 0;
! 6461:
! 6462: if (IS_TMP_VAR == IS_UNUSED) {
! 6463: /* Initialize for erealloc in add_string_to_string */
! 6464: Z_STRVAL_P(str) = NULL;
! 6465: Z_STRLEN_P(str) = 0;
! 6466: Z_TYPE_P(str) = IS_STRING;
! 6467:
! 6468: INIT_PZVAL(str);
! 6469: }
! 6470:
! 6471: if (Z_TYPE_P(var) != IS_STRING) {
! 6472: zend_make_printable_zval(var, &var_copy, &use_copy);
! 6473:
! 6474: if (use_copy) {
! 6475: var = &var_copy;
! 6476: }
! 6477: }
! 6478: add_string_to_string(str, str, var);
! 6479:
! 6480: if (use_copy) {
! 6481: zval_dtor(var);
! 6482: }
! 6483: /* original comment, possibly problematic:
! 6484: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 6485: * (Zeev): I don't think it's problematic, we only use variables
! 6486: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 6487: * string offsets or overloaded objects
! 6488: */
! 6489: zval_dtor(free_op2.var);
! 6490:
! 6491: ZEND_VM_NEXT_OPCODE();
! 6492: }
! 6493:
! 6494: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6495: {
! 6496: zend_op *opline = EX(opline);
! 6497: zval *function_name;
! 6498: char *function_name_strval;
! 6499: int function_name_strlen;
! 6500: zend_free_op free_op1, free_op2;
! 6501:
! 6502: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 6503:
! 6504: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 6505:
! 6506: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 6507: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 6508: }
! 6509:
! 6510: function_name_strval = Z_STRVAL_P(function_name);
! 6511: function_name_strlen = Z_STRLEN_P(function_name);
! 6512:
! 6513: EX(object) = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6514:
! 6515: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 6516: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 6517: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 6518: }
! 6519:
! 6520: /* First, locate the function. */
! 6521: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 6522: if (!EX(fbc)) {
! 6523: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 6524: }
! 6525:
! 6526: EX(called_scope) = Z_OBJCE_P(EX(object));
! 6527: } else {
! 6528: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 6529: }
! 6530:
! 6531: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 6532: EX(object) = NULL;
! 6533: } else {
! 6534: if (!PZVAL_IS_REF(EX(object))) {
! 6535: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 6536: } else {
! 6537: zval *this_ptr;
! 6538: ALLOC_ZVAL(this_ptr);
! 6539: INIT_PZVAL_COPY(this_ptr, EX(object));
! 6540: zval_copy_ctor(this_ptr);
! 6541: EX(object) = this_ptr;
! 6542: }
! 6543: }
! 6544:
! 6545: zval_dtor(free_op2.var);
! 6546:
! 6547: ZEND_VM_NEXT_OPCODE();
! 6548: }
! 6549:
! 6550: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6551: {
! 6552: zend_op *opline = EX(opline);
! 6553: int switch_expr_is_overloaded=0;
! 6554: zend_free_op free_op1, free_op2;
! 6555:
! 6556: if (IS_TMP_VAR==IS_VAR) {
! 6557: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 6558: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 6559: } else {
! 6560: switch_expr_is_overloaded = 1;
! 6561: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 6562: }
! 6563: }
! 6564: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 6565: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6566: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6567:
! 6568: zval_dtor(free_op2.var);
! 6569: if (switch_expr_is_overloaded) {
! 6570: /* We only free op1 if this is a string offset,
! 6571: * Since if it is a TMP_VAR, it'll be reused by
! 6572: * other CASE opcodes (whereas string offsets
! 6573: * are allocated at each get_zval_ptr())
! 6574: */
! 6575: zval_dtor(free_op1.var);
! 6576: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 6577: EX_T(opline->op1.u.var).var.ptr = NULL;
! 6578: }
! 6579: ZEND_VM_NEXT_OPCODE();
! 6580: }
! 6581:
! 6582: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6583: {
! 6584: zend_op *opline = EX(opline);
! 6585: zend_free_op free_op1, free_op2;
! 6586: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 6587: zval *expr_ptr;
! 6588: zval *offset=_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 6589:
! 6590: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 6591: zval **expr_ptr_ptr = NULL;
! 6592:
! 6593: if (opline->extended_value) {
! 6594: expr_ptr_ptr=NULL;
! 6595: expr_ptr = *expr_ptr_ptr;
! 6596: } else {
! 6597: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6598: }
! 6599: #else
! 6600: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6601: #endif
! 6602:
! 6603: if (1) { /* temporary variable */
! 6604: zval *new_expr;
! 6605:
! 6606: ALLOC_ZVAL(new_expr);
! 6607: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 6608: expr_ptr = new_expr;
! 6609: } else {
! 6610: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 6611: if (opline->extended_value) {
! 6612: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 6613: expr_ptr = *expr_ptr_ptr;
! 6614: Z_ADDREF_P(expr_ptr);
! 6615: } else
! 6616: #endif
! 6617: if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 6618: zval *new_expr;
! 6619:
! 6620: ALLOC_ZVAL(new_expr);
! 6621: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 6622: expr_ptr = new_expr;
! 6623: zendi_zval_copy_ctor(*expr_ptr);
! 6624: } else {
! 6625: Z_ADDREF_P(expr_ptr);
! 6626: }
! 6627: }
! 6628: if (offset) {
! 6629: switch (Z_TYPE_P(offset)) {
! 6630: case IS_DOUBLE:
! 6631: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 6632: break;
! 6633: case IS_LONG:
! 6634: case IS_BOOL:
! 6635: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 6636: break;
! 6637: case IS_STRING:
! 6638: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 6639: break;
! 6640: case IS_NULL:
! 6641: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 6642: break;
! 6643: default:
! 6644: zend_error(E_WARNING, "Illegal offset type");
! 6645: zval_ptr_dtor(&expr_ptr);
! 6646: /* do nothing */
! 6647: break;
! 6648: }
! 6649: zval_dtor(free_op2.var);
! 6650: } else {
! 6651: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 6652: }
! 6653: if (opline->extended_value) {
! 6654:
! 6655: } else {
! 6656:
! 6657: }
! 6658: ZEND_VM_NEXT_OPCODE();
! 6659: }
! 6660:
! 6661: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6662: {
! 6663: zend_op *opline = EX(opline);
! 6664:
! 6665: array_init(&EX_T(opline->result.u.var).tmp_var);
! 6666: if (IS_TMP_VAR == IS_UNUSED) {
! 6667: ZEND_VM_NEXT_OPCODE();
! 6668: #if 0 || IS_TMP_VAR != IS_UNUSED
! 6669: } else {
! 6670: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 6671: #endif
! 6672: }
! 6673: }
! 6674:
! 6675: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6676: {
! 6677: zend_op *opline = EX(opline);
! 6678: zend_free_op free_op1, free_op2;
! 6679:
! 6680: add_function(&EX_T(opline->result.u.var).tmp_var,
! 6681: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6682: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6683: zval_dtor(free_op1.var);
! 6684: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6685: ZEND_VM_NEXT_OPCODE();
! 6686: }
! 6687:
! 6688: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6689: {
! 6690: zend_op *opline = EX(opline);
! 6691: zend_free_op free_op1, free_op2;
! 6692:
! 6693: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 6694: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6695: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6696: zval_dtor(free_op1.var);
! 6697: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6698: ZEND_VM_NEXT_OPCODE();
! 6699: }
! 6700:
! 6701: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6702: {
! 6703: zend_op *opline = EX(opline);
! 6704: zend_free_op free_op1, free_op2;
! 6705:
! 6706: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 6707: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6708: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6709: zval_dtor(free_op1.var);
! 6710: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6711: ZEND_VM_NEXT_OPCODE();
! 6712: }
! 6713:
! 6714: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6715: {
! 6716: zend_op *opline = EX(opline);
! 6717: zend_free_op free_op1, free_op2;
! 6718:
! 6719: div_function(&EX_T(opline->result.u.var).tmp_var,
! 6720: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6721: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6722: zval_dtor(free_op1.var);
! 6723: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6724: ZEND_VM_NEXT_OPCODE();
! 6725: }
! 6726:
! 6727: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6728: {
! 6729: zend_op *opline = EX(opline);
! 6730: zend_free_op free_op1, free_op2;
! 6731:
! 6732: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 6733: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6734: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6735: zval_dtor(free_op1.var);
! 6736: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6737: ZEND_VM_NEXT_OPCODE();
! 6738: }
! 6739:
! 6740: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6741: {
! 6742: zend_op *opline = EX(opline);
! 6743: zend_free_op free_op1, free_op2;
! 6744:
! 6745: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 6746: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6747: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6748: zval_dtor(free_op1.var);
! 6749: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6750: ZEND_VM_NEXT_OPCODE();
! 6751: }
! 6752:
! 6753: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6754: {
! 6755: zend_op *opline = EX(opline);
! 6756: zend_free_op free_op1, free_op2;
! 6757:
! 6758: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 6759: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6760: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6761: zval_dtor(free_op1.var);
! 6762: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6763: ZEND_VM_NEXT_OPCODE();
! 6764: }
! 6765:
! 6766: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6767: {
! 6768: zend_op *opline = EX(opline);
! 6769: zend_free_op free_op1, free_op2;
! 6770:
! 6771: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 6772: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6773: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6774: zval_dtor(free_op1.var);
! 6775: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6776: ZEND_VM_NEXT_OPCODE();
! 6777: }
! 6778:
! 6779: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6780: {
! 6781: zend_op *opline = EX(opline);
! 6782: zend_free_op free_op1, free_op2;
! 6783:
! 6784: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 6785: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6786: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6787: zval_dtor(free_op1.var);
! 6788: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6789: ZEND_VM_NEXT_OPCODE();
! 6790: }
! 6791:
! 6792: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6793: {
! 6794: zend_op *opline = EX(opline);
! 6795: zend_free_op free_op1, free_op2;
! 6796: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6797:
! 6798: is_identical_function(result,
! 6799: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6800: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6801: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 6802: zval_dtor(free_op1.var);
! 6803: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6804: ZEND_VM_NEXT_OPCODE();
! 6805: }
! 6806:
! 6807: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6808: {
! 6809: zend_op *opline = EX(opline);
! 6810: zend_free_op free_op1, free_op2;
! 6811: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6812:
! 6813: compare_function(result,
! 6814: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6815: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6816: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 6817: zval_dtor(free_op1.var);
! 6818: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6819: ZEND_VM_NEXT_OPCODE();
! 6820: }
! 6821:
! 6822: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6823: {
! 6824: zend_op *opline = EX(opline);
! 6825: zend_free_op free_op1, free_op2;
! 6826: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6827:
! 6828: compare_function(result,
! 6829: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6830: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6831: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 6832: zval_dtor(free_op1.var);
! 6833: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6834: ZEND_VM_NEXT_OPCODE();
! 6835: }
! 6836:
! 6837: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6838: {
! 6839: zend_op *opline = EX(opline);
! 6840: zend_free_op free_op1, free_op2;
! 6841: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6842:
! 6843: compare_function(result,
! 6844: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6845: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6846: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 6847: zval_dtor(free_op1.var);
! 6848: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6849: ZEND_VM_NEXT_OPCODE();
! 6850: }
! 6851:
! 6852: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6853: {
! 6854: zend_op *opline = EX(opline);
! 6855: zend_free_op free_op1, free_op2;
! 6856: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 6857:
! 6858: compare_function(result,
! 6859: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6860: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6861: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 6862: zval_dtor(free_op1.var);
! 6863: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6864: ZEND_VM_NEXT_OPCODE();
! 6865: }
! 6866:
! 6867: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6868: {
! 6869: zend_op *opline = EX(opline);
! 6870: zend_free_op free_op1, free_op2;
! 6871:
! 6872: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 6873: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6874: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6875: zval_dtor(free_op1.var);
! 6876: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6877: ZEND_VM_NEXT_OPCODE();
! 6878: }
! 6879:
! 6880: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6881: {
! 6882: zend_op *opline = EX(opline);
! 6883: zend_free_op free_op1, free_op2;
! 6884:
! 6885: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 6886: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6887: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6888: zval_dtor(free_op1.var);
! 6889: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6890: ZEND_VM_NEXT_OPCODE();
! 6891: }
! 6892:
! 6893: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6894: {
! 6895: zend_op *opline = EX(opline);
! 6896: zend_free_op free_op1, free_op2;
! 6897:
! 6898: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 6899: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6900: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6901: zval_dtor(free_op1.var);
! 6902: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6903: ZEND_VM_NEXT_OPCODE();
! 6904: }
! 6905:
! 6906: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6907: {
! 6908: zend_op *opline = EX(opline);
! 6909: zend_free_op free_op1, free_op2;
! 6910:
! 6911: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 6912: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 6913: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 6914: zval_dtor(free_op1.var);
! 6915: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6916: ZEND_VM_NEXT_OPCODE();
! 6917: }
! 6918:
! 6919: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6920: {
! 6921: zend_op *opline = EX(opline);
! 6922: zend_free_op free_op2;
! 6923: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 6924: zval *var = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 6925: zval var_copy;
! 6926: int use_copy = 0;
! 6927:
! 6928: if (IS_TMP_VAR == IS_UNUSED) {
! 6929: /* Initialize for erealloc in add_string_to_string */
! 6930: Z_STRVAL_P(str) = NULL;
! 6931: Z_STRLEN_P(str) = 0;
! 6932: Z_TYPE_P(str) = IS_STRING;
! 6933:
! 6934: INIT_PZVAL(str);
! 6935: }
! 6936:
! 6937: if (Z_TYPE_P(var) != IS_STRING) {
! 6938: zend_make_printable_zval(var, &var_copy, &use_copy);
! 6939:
! 6940: if (use_copy) {
! 6941: var = &var_copy;
! 6942: }
! 6943: }
! 6944: add_string_to_string(str, str, var);
! 6945:
! 6946: if (use_copy) {
! 6947: zval_dtor(var);
! 6948: }
! 6949: /* original comment, possibly problematic:
! 6950: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 6951: * (Zeev): I don't think it's problematic, we only use variables
! 6952: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 6953: * string offsets or overloaded objects
! 6954: */
! 6955: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 6956:
! 6957: ZEND_VM_NEXT_OPCODE();
! 6958: }
! 6959:
! 6960: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 6961: {
! 6962: zend_op *opline = EX(opline);
! 6963: zval *function_name;
! 6964: char *function_name_strval;
! 6965: int function_name_strlen;
! 6966: zend_free_op free_op1, free_op2;
! 6967:
! 6968: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 6969:
! 6970: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 6971:
! 6972: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 6973: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 6974: }
! 6975:
! 6976: function_name_strval = Z_STRVAL_P(function_name);
! 6977: function_name_strlen = Z_STRLEN_P(function_name);
! 6978:
! 6979: EX(object) = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 6980:
! 6981: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 6982: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 6983: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 6984: }
! 6985:
! 6986: /* First, locate the function. */
! 6987: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 6988: if (!EX(fbc)) {
! 6989: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 6990: }
! 6991:
! 6992: EX(called_scope) = Z_OBJCE_P(EX(object));
! 6993: } else {
! 6994: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 6995: }
! 6996:
! 6997: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 6998: EX(object) = NULL;
! 6999: } else {
! 7000: if (!PZVAL_IS_REF(EX(object))) {
! 7001: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 7002: } else {
! 7003: zval *this_ptr;
! 7004: ALLOC_ZVAL(this_ptr);
! 7005: INIT_PZVAL_COPY(this_ptr, EX(object));
! 7006: zval_copy_ctor(this_ptr);
! 7007: EX(object) = this_ptr;
! 7008: }
! 7009: }
! 7010:
! 7011: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 7012:
! 7013: ZEND_VM_NEXT_OPCODE();
! 7014: }
! 7015:
! 7016: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7017: {
! 7018: zend_op *opline = EX(opline);
! 7019: int switch_expr_is_overloaded=0;
! 7020: zend_free_op free_op1, free_op2;
! 7021:
! 7022: if (IS_TMP_VAR==IS_VAR) {
! 7023: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 7024: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 7025: } else {
! 7026: switch_expr_is_overloaded = 1;
! 7027: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 7028: }
! 7029: }
! 7030: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 7031: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7032: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 7033:
! 7034: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 7035: if (switch_expr_is_overloaded) {
! 7036: /* We only free op1 if this is a string offset,
! 7037: * Since if it is a TMP_VAR, it'll be reused by
! 7038: * other CASE opcodes (whereas string offsets
! 7039: * are allocated at each get_zval_ptr())
! 7040: */
! 7041: zval_dtor(free_op1.var);
! 7042: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 7043: EX_T(opline->op1.u.var).var.ptr = NULL;
! 7044: }
! 7045: ZEND_VM_NEXT_OPCODE();
! 7046: }
! 7047:
! 7048: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7049: {
! 7050: zend_op *opline = EX(opline);
! 7051: zend_free_op free_op1, free_op2;
! 7052: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 7053: zval *expr_ptr;
! 7054: zval *offset=_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 7055:
! 7056: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7057: zval **expr_ptr_ptr = NULL;
! 7058:
! 7059: if (opline->extended_value) {
! 7060: expr_ptr_ptr=NULL;
! 7061: expr_ptr = *expr_ptr_ptr;
! 7062: } else {
! 7063: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7064: }
! 7065: #else
! 7066: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7067: #endif
! 7068:
! 7069: if (1) { /* temporary variable */
! 7070: zval *new_expr;
! 7071:
! 7072: ALLOC_ZVAL(new_expr);
! 7073: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7074: expr_ptr = new_expr;
! 7075: } else {
! 7076: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7077: if (opline->extended_value) {
! 7078: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 7079: expr_ptr = *expr_ptr_ptr;
! 7080: Z_ADDREF_P(expr_ptr);
! 7081: } else
! 7082: #endif
! 7083: if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 7084: zval *new_expr;
! 7085:
! 7086: ALLOC_ZVAL(new_expr);
! 7087: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7088: expr_ptr = new_expr;
! 7089: zendi_zval_copy_ctor(*expr_ptr);
! 7090: } else {
! 7091: Z_ADDREF_P(expr_ptr);
! 7092: }
! 7093: }
! 7094: if (offset) {
! 7095: switch (Z_TYPE_P(offset)) {
! 7096: case IS_DOUBLE:
! 7097: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 7098: break;
! 7099: case IS_LONG:
! 7100: case IS_BOOL:
! 7101: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 7102: break;
! 7103: case IS_STRING:
! 7104: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 7105: break;
! 7106: case IS_NULL:
! 7107: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 7108: break;
! 7109: default:
! 7110: zend_error(E_WARNING, "Illegal offset type");
! 7111: zval_ptr_dtor(&expr_ptr);
! 7112: /* do nothing */
! 7113: break;
! 7114: }
! 7115: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 7116: } else {
! 7117: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 7118: }
! 7119: if (opline->extended_value) {
! 7120:
! 7121: } else {
! 7122:
! 7123: }
! 7124: ZEND_VM_NEXT_OPCODE();
! 7125: }
! 7126:
! 7127: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7128: {
! 7129: zend_op *opline = EX(opline);
! 7130:
! 7131: array_init(&EX_T(opline->result.u.var).tmp_var);
! 7132: if (IS_TMP_VAR == IS_UNUSED) {
! 7133: ZEND_VM_NEXT_OPCODE();
! 7134: #if 0 || IS_TMP_VAR != IS_UNUSED
! 7135: } else {
! 7136: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 7137: #endif
! 7138: }
! 7139: }
! 7140:
! 7141: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7142: {
! 7143: zend_op *opline = EX(opline);
! 7144: zend_free_op free_op1;
! 7145: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 7146: zval *expr_ptr;
! 7147: zval *offset=NULL;
! 7148:
! 7149: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7150: zval **expr_ptr_ptr = NULL;
! 7151:
! 7152: if (opline->extended_value) {
! 7153: expr_ptr_ptr=NULL;
! 7154: expr_ptr = *expr_ptr_ptr;
! 7155: } else {
! 7156: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7157: }
! 7158: #else
! 7159: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7160: #endif
! 7161:
! 7162: if (1) { /* temporary variable */
! 7163: zval *new_expr;
! 7164:
! 7165: ALLOC_ZVAL(new_expr);
! 7166: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7167: expr_ptr = new_expr;
! 7168: } else {
! 7169: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7170: if (opline->extended_value) {
! 7171: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 7172: expr_ptr = *expr_ptr_ptr;
! 7173: Z_ADDREF_P(expr_ptr);
! 7174: } else
! 7175: #endif
! 7176: if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 7177: zval *new_expr;
! 7178:
! 7179: ALLOC_ZVAL(new_expr);
! 7180: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7181: expr_ptr = new_expr;
! 7182: zendi_zval_copy_ctor(*expr_ptr);
! 7183: } else {
! 7184: Z_ADDREF_P(expr_ptr);
! 7185: }
! 7186: }
! 7187: if (offset) {
! 7188: switch (Z_TYPE_P(offset)) {
! 7189: case IS_DOUBLE:
! 7190: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 7191: break;
! 7192: case IS_LONG:
! 7193: case IS_BOOL:
! 7194: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 7195: break;
! 7196: case IS_STRING:
! 7197: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 7198: break;
! 7199: case IS_NULL:
! 7200: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 7201: break;
! 7202: default:
! 7203: zend_error(E_WARNING, "Illegal offset type");
! 7204: zval_ptr_dtor(&expr_ptr);
! 7205: /* do nothing */
! 7206: break;
! 7207: }
! 7208:
! 7209: } else {
! 7210: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 7211: }
! 7212: if (opline->extended_value) {
! 7213:
! 7214: } else {
! 7215:
! 7216: }
! 7217: ZEND_VM_NEXT_OPCODE();
! 7218: }
! 7219:
! 7220: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7221: {
! 7222: zend_op *opline = EX(opline);
! 7223:
! 7224: array_init(&EX_T(opline->result.u.var).tmp_var);
! 7225: if (IS_TMP_VAR == IS_UNUSED) {
! 7226: ZEND_VM_NEXT_OPCODE();
! 7227: #if 0 || IS_TMP_VAR != IS_UNUSED
! 7228: } else {
! 7229: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 7230: #endif
! 7231: }
! 7232: }
! 7233:
! 7234: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7235: {
! 7236: zend_op *opline = EX(opline);
! 7237: zend_free_op free_op1;
! 7238:
! 7239: add_function(&EX_T(opline->result.u.var).tmp_var,
! 7240: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7241: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7242: zval_dtor(free_op1.var);
! 7243:
! 7244: ZEND_VM_NEXT_OPCODE();
! 7245: }
! 7246:
! 7247: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7248: {
! 7249: zend_op *opline = EX(opline);
! 7250: zend_free_op free_op1;
! 7251:
! 7252: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 7253: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7254: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7255: zval_dtor(free_op1.var);
! 7256:
! 7257: ZEND_VM_NEXT_OPCODE();
! 7258: }
! 7259:
! 7260: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7261: {
! 7262: zend_op *opline = EX(opline);
! 7263: zend_free_op free_op1;
! 7264:
! 7265: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 7266: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7267: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7268: zval_dtor(free_op1.var);
! 7269:
! 7270: ZEND_VM_NEXT_OPCODE();
! 7271: }
! 7272:
! 7273: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7274: {
! 7275: zend_op *opline = EX(opline);
! 7276: zend_free_op free_op1;
! 7277:
! 7278: div_function(&EX_T(opline->result.u.var).tmp_var,
! 7279: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7280: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7281: zval_dtor(free_op1.var);
! 7282:
! 7283: ZEND_VM_NEXT_OPCODE();
! 7284: }
! 7285:
! 7286: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7287: {
! 7288: zend_op *opline = EX(opline);
! 7289: zend_free_op free_op1;
! 7290:
! 7291: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 7292: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7293: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7294: zval_dtor(free_op1.var);
! 7295:
! 7296: ZEND_VM_NEXT_OPCODE();
! 7297: }
! 7298:
! 7299: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7300: {
! 7301: zend_op *opline = EX(opline);
! 7302: zend_free_op free_op1;
! 7303:
! 7304: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 7305: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7306: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7307: zval_dtor(free_op1.var);
! 7308:
! 7309: ZEND_VM_NEXT_OPCODE();
! 7310: }
! 7311:
! 7312: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7313: {
! 7314: zend_op *opline = EX(opline);
! 7315: zend_free_op free_op1;
! 7316:
! 7317: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 7318: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7319: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7320: zval_dtor(free_op1.var);
! 7321:
! 7322: ZEND_VM_NEXT_OPCODE();
! 7323: }
! 7324:
! 7325: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7326: {
! 7327: zend_op *opline = EX(opline);
! 7328: zend_free_op free_op1;
! 7329:
! 7330: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 7331: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7332: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7333: zval_dtor(free_op1.var);
! 7334:
! 7335: ZEND_VM_NEXT_OPCODE();
! 7336: }
! 7337:
! 7338: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7339: {
! 7340: zend_op *opline = EX(opline);
! 7341: zend_free_op free_op1;
! 7342:
! 7343: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 7344: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7345: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7346: zval_dtor(free_op1.var);
! 7347:
! 7348: ZEND_VM_NEXT_OPCODE();
! 7349: }
! 7350:
! 7351: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7352: {
! 7353: zend_op *opline = EX(opline);
! 7354: zend_free_op free_op1;
! 7355: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 7356:
! 7357: is_identical_function(result,
! 7358: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7359: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7360: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 7361: zval_dtor(free_op1.var);
! 7362:
! 7363: ZEND_VM_NEXT_OPCODE();
! 7364: }
! 7365:
! 7366: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7367: {
! 7368: zend_op *opline = EX(opline);
! 7369: zend_free_op free_op1;
! 7370: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 7371:
! 7372: compare_function(result,
! 7373: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7374: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7375: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 7376: zval_dtor(free_op1.var);
! 7377:
! 7378: ZEND_VM_NEXT_OPCODE();
! 7379: }
! 7380:
! 7381: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7382: {
! 7383: zend_op *opline = EX(opline);
! 7384: zend_free_op free_op1;
! 7385: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 7386:
! 7387: compare_function(result,
! 7388: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7389: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7390: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 7391: zval_dtor(free_op1.var);
! 7392:
! 7393: ZEND_VM_NEXT_OPCODE();
! 7394: }
! 7395:
! 7396: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7397: {
! 7398: zend_op *opline = EX(opline);
! 7399: zend_free_op free_op1;
! 7400: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 7401:
! 7402: compare_function(result,
! 7403: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7404: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7405: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 7406: zval_dtor(free_op1.var);
! 7407:
! 7408: ZEND_VM_NEXT_OPCODE();
! 7409: }
! 7410:
! 7411: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7412: {
! 7413: zend_op *opline = EX(opline);
! 7414: zend_free_op free_op1;
! 7415: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 7416:
! 7417: compare_function(result,
! 7418: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7419: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7420: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 7421: zval_dtor(free_op1.var);
! 7422:
! 7423: ZEND_VM_NEXT_OPCODE();
! 7424: }
! 7425:
! 7426: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7427: {
! 7428: zend_op *opline = EX(opline);
! 7429: zend_free_op free_op1;
! 7430:
! 7431: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 7432: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7433: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7434: zval_dtor(free_op1.var);
! 7435:
! 7436: ZEND_VM_NEXT_OPCODE();
! 7437: }
! 7438:
! 7439: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7440: {
! 7441: zend_op *opline = EX(opline);
! 7442: zend_free_op free_op1;
! 7443:
! 7444: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 7445: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7446: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7447: zval_dtor(free_op1.var);
! 7448:
! 7449: ZEND_VM_NEXT_OPCODE();
! 7450: }
! 7451:
! 7452: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7453: {
! 7454: zend_op *opline = EX(opline);
! 7455: zend_free_op free_op1;
! 7456:
! 7457: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 7458: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7459: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7460: zval_dtor(free_op1.var);
! 7461:
! 7462: ZEND_VM_NEXT_OPCODE();
! 7463: }
! 7464:
! 7465: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7466: {
! 7467: zend_op *opline = EX(opline);
! 7468: zend_free_op free_op1;
! 7469:
! 7470: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 7471: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7472: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7473: zval_dtor(free_op1.var);
! 7474:
! 7475: ZEND_VM_NEXT_OPCODE();
! 7476: }
! 7477:
! 7478: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7479: {
! 7480: zend_op *opline = EX(opline);
! 7481:
! 7482: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 7483: zval *var = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 7484: zval var_copy;
! 7485: int use_copy = 0;
! 7486:
! 7487: if (IS_TMP_VAR == IS_UNUSED) {
! 7488: /* Initialize for erealloc in add_string_to_string */
! 7489: Z_STRVAL_P(str) = NULL;
! 7490: Z_STRLEN_P(str) = 0;
! 7491: Z_TYPE_P(str) = IS_STRING;
! 7492:
! 7493: INIT_PZVAL(str);
! 7494: }
! 7495:
! 7496: if (Z_TYPE_P(var) != IS_STRING) {
! 7497: zend_make_printable_zval(var, &var_copy, &use_copy);
! 7498:
! 7499: if (use_copy) {
! 7500: var = &var_copy;
! 7501: }
! 7502: }
! 7503: add_string_to_string(str, str, var);
! 7504:
! 7505: if (use_copy) {
! 7506: zval_dtor(var);
! 7507: }
! 7508: /* original comment, possibly problematic:
! 7509: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 7510: * (Zeev): I don't think it's problematic, we only use variables
! 7511: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 7512: * string offsets or overloaded objects
! 7513: */
! 7514:
! 7515: ZEND_VM_NEXT_OPCODE();
! 7516: }
! 7517:
! 7518: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7519: {
! 7520: zend_op *opline = EX(opline);
! 7521: zval *function_name;
! 7522: char *function_name_strval;
! 7523: int function_name_strlen;
! 7524: zend_free_op free_op1;
! 7525:
! 7526: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 7527:
! 7528: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 7529:
! 7530: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 7531: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 7532: }
! 7533:
! 7534: function_name_strval = Z_STRVAL_P(function_name);
! 7535: function_name_strlen = Z_STRLEN_P(function_name);
! 7536:
! 7537: EX(object) = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7538:
! 7539: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 7540: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 7541: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 7542: }
! 7543:
! 7544: /* First, locate the function. */
! 7545: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 7546: if (!EX(fbc)) {
! 7547: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 7548: }
! 7549:
! 7550: EX(called_scope) = Z_OBJCE_P(EX(object));
! 7551: } else {
! 7552: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 7553: }
! 7554:
! 7555: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 7556: EX(object) = NULL;
! 7557: } else {
! 7558: if (!PZVAL_IS_REF(EX(object))) {
! 7559: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 7560: } else {
! 7561: zval *this_ptr;
! 7562: ALLOC_ZVAL(this_ptr);
! 7563: INIT_PZVAL_COPY(this_ptr, EX(object));
! 7564: zval_copy_ctor(this_ptr);
! 7565: EX(object) = this_ptr;
! 7566: }
! 7567: }
! 7568:
! 7569:
! 7570: ZEND_VM_NEXT_OPCODE();
! 7571: }
! 7572:
! 7573: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7574: {
! 7575: zend_op *opline = EX(opline);
! 7576: int switch_expr_is_overloaded=0;
! 7577: zend_free_op free_op1;
! 7578:
! 7579: if (IS_TMP_VAR==IS_VAR) {
! 7580: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 7581: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 7582: } else {
! 7583: switch_expr_is_overloaded = 1;
! 7584: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 7585: }
! 7586: }
! 7587: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 7588: _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 7589: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 7590:
! 7591: if (switch_expr_is_overloaded) {
! 7592: /* We only free op1 if this is a string offset,
! 7593: * Since if it is a TMP_VAR, it'll be reused by
! 7594: * other CASE opcodes (whereas string offsets
! 7595: * are allocated at each get_zval_ptr())
! 7596: */
! 7597: zval_dtor(free_op1.var);
! 7598: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 7599: EX_T(opline->op1.u.var).var.ptr = NULL;
! 7600: }
! 7601: ZEND_VM_NEXT_OPCODE();
! 7602: }
! 7603:
! 7604: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7605: {
! 7606: zend_op *opline = EX(opline);
! 7607: zend_free_op free_op1;
! 7608: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 7609: zval *expr_ptr;
! 7610: zval *offset=_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 7611:
! 7612: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7613: zval **expr_ptr_ptr = NULL;
! 7614:
! 7615: if (opline->extended_value) {
! 7616: expr_ptr_ptr=NULL;
! 7617: expr_ptr = *expr_ptr_ptr;
! 7618: } else {
! 7619: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7620: }
! 7621: #else
! 7622: expr_ptr=_get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7623: #endif
! 7624:
! 7625: if (1) { /* temporary variable */
! 7626: zval *new_expr;
! 7627:
! 7628: ALLOC_ZVAL(new_expr);
! 7629: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7630: expr_ptr = new_expr;
! 7631: } else {
! 7632: #if 0 || IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV
! 7633: if (opline->extended_value) {
! 7634: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 7635: expr_ptr = *expr_ptr_ptr;
! 7636: Z_ADDREF_P(expr_ptr);
! 7637: } else
! 7638: #endif
! 7639: if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 7640: zval *new_expr;
! 7641:
! 7642: ALLOC_ZVAL(new_expr);
! 7643: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 7644: expr_ptr = new_expr;
! 7645: zendi_zval_copy_ctor(*expr_ptr);
! 7646: } else {
! 7647: Z_ADDREF_P(expr_ptr);
! 7648: }
! 7649: }
! 7650: if (offset) {
! 7651: switch (Z_TYPE_P(offset)) {
! 7652: case IS_DOUBLE:
! 7653: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 7654: break;
! 7655: case IS_LONG:
! 7656: case IS_BOOL:
! 7657: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 7658: break;
! 7659: case IS_STRING:
! 7660: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 7661: break;
! 7662: case IS_NULL:
! 7663: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 7664: break;
! 7665: default:
! 7666: zend_error(E_WARNING, "Illegal offset type");
! 7667: zval_ptr_dtor(&expr_ptr);
! 7668: /* do nothing */
! 7669: break;
! 7670: }
! 7671:
! 7672: } else {
! 7673: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 7674: }
! 7675: if (opline->extended_value) {
! 7676:
! 7677: } else {
! 7678:
! 7679: }
! 7680: ZEND_VM_NEXT_OPCODE();
! 7681: }
! 7682:
! 7683: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7684: {
! 7685: zend_op *opline = EX(opline);
! 7686:
! 7687: array_init(&EX_T(opline->result.u.var).tmp_var);
! 7688: if (IS_TMP_VAR == IS_UNUSED) {
! 7689: ZEND_VM_NEXT_OPCODE();
! 7690: #if 0 || IS_TMP_VAR != IS_UNUSED
! 7691: } else {
! 7692: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 7693: #endif
! 7694: }
! 7695: }
! 7696:
! 7697: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7698: {
! 7699: zend_op *opline = EX(opline);
! 7700: zend_free_op free_op1;
! 7701:
! 7702: bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
! 7703: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC) TSRMLS_CC);
! 7704: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7705: ZEND_VM_NEXT_OPCODE();
! 7706: }
! 7707:
! 7708: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7709: {
! 7710: zend_op *opline = EX(opline);
! 7711: zend_free_op free_op1;
! 7712:
! 7713: boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
! 7714: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC) TSRMLS_CC);
! 7715: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7716: ZEND_VM_NEXT_OPCODE();
! 7717: }
! 7718:
! 7719: static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7720: {
! 7721: zend_op *opline = EX(opline);
! 7722: zend_free_op free_op1;
! 7723: zval **var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7724:
! 7725: if (IS_VAR == IS_VAR && !var_ptr) {
! 7726: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 7727: }
! 7728: if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 7729: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7730: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 7731: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 7732: }
! 7733: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7734: ZEND_VM_NEXT_OPCODE();
! 7735: }
! 7736:
! 7737: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 7738:
! 7739: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 7740: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 7741: /* proxy object */
! 7742: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 7743: Z_ADDREF_P(val);
! 7744: increment_function(val);
! 7745: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 7746: zval_ptr_dtor(&val);
! 7747: } else {
! 7748: increment_function(*var_ptr);
! 7749: }
! 7750:
! 7751: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7752: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 7753: PZVAL_LOCK(*var_ptr);
! 7754: }
! 7755:
! 7756: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7757: ZEND_VM_NEXT_OPCODE();
! 7758: }
! 7759:
! 7760: static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7761: {
! 7762: zend_op *opline = EX(opline);
! 7763: zend_free_op free_op1;
! 7764: zval **var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7765:
! 7766: if (IS_VAR == IS_VAR && !var_ptr) {
! 7767: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 7768: }
! 7769: if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 7770: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7771: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 7772: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 7773: }
! 7774: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7775: ZEND_VM_NEXT_OPCODE();
! 7776: }
! 7777:
! 7778: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 7779:
! 7780: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 7781: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 7782: /* proxy object */
! 7783: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 7784: Z_ADDREF_P(val);
! 7785: decrement_function(val);
! 7786: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 7787: zval_ptr_dtor(&val);
! 7788: } else {
! 7789: decrement_function(*var_ptr);
! 7790: }
! 7791:
! 7792: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7793: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 7794: PZVAL_LOCK(*var_ptr);
! 7795: }
! 7796:
! 7797: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7798: ZEND_VM_NEXT_OPCODE();
! 7799: }
! 7800:
! 7801: static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7802: {
! 7803: zend_op *opline = EX(opline);
! 7804: zend_free_op free_op1;
! 7805: zval **var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7806:
! 7807: if (IS_VAR == IS_VAR && !var_ptr) {
! 7808: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 7809: }
! 7810: if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 7811: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7812: EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
! 7813: }
! 7814: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7815: ZEND_VM_NEXT_OPCODE();
! 7816: }
! 7817:
! 7818: EX_T(opline->result.u.var).tmp_var = **var_ptr;
! 7819: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 7820:
! 7821: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 7822:
! 7823: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 7824: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 7825: /* proxy object */
! 7826: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 7827: Z_ADDREF_P(val);
! 7828: increment_function(val);
! 7829: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 7830: zval_ptr_dtor(&val);
! 7831: } else {
! 7832: increment_function(*var_ptr);
! 7833: }
! 7834:
! 7835: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7836: ZEND_VM_NEXT_OPCODE();
! 7837: }
! 7838:
! 7839: static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7840: {
! 7841: zend_op *opline = EX(opline);
! 7842: zend_free_op free_op1;
! 7843: zval **var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7844:
! 7845: if (IS_VAR == IS_VAR && !var_ptr) {
! 7846: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 7847: }
! 7848: if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 7849: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7850: EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
! 7851: }
! 7852: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7853: ZEND_VM_NEXT_OPCODE();
! 7854: }
! 7855:
! 7856: EX_T(opline->result.u.var).tmp_var = **var_ptr;
! 7857: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 7858:
! 7859: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 7860:
! 7861: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 7862: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 7863: /* proxy object */
! 7864: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 7865: Z_ADDREF_P(val);
! 7866: decrement_function(val);
! 7867: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 7868: zval_ptr_dtor(&val);
! 7869: } else {
! 7870: decrement_function(*var_ptr);
! 7871: }
! 7872:
! 7873: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7874: ZEND_VM_NEXT_OPCODE();
! 7875: }
! 7876:
! 7877: static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7878: {
! 7879: zend_op *opline = EX(opline);
! 7880: zend_free_op free_op1;
! 7881: zval z_copy;
! 7882: zval *z = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7883:
! 7884: if (IS_VAR != IS_CONST &&
! 7885: Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL) {
! 7886: if (IS_VAR == IS_TMP_VAR) {
! 7887: INIT_PZVAL(z);
! 7888: }
! 7889: if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
! 7890: zend_print_variable(&z_copy);
! 7891: zval_dtor(&z_copy);
! 7892: } else {
! 7893: zend_print_variable(z);
! 7894: }
! 7895: } else {
! 7896: zend_print_variable(z);
! 7897: }
! 7898:
! 7899: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7900: ZEND_VM_NEXT_OPCODE();
! 7901: }
! 7902:
! 7903: static int ZEND_FASTCALL ZEND_PRINT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 7904: {
! 7905: zend_op *opline = EX(opline);
! 7906:
! 7907: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 7908: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
! 7909:
! 7910: return ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 7911: }
! 7912:
! 7913: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
! 7914: {
! 7915: zend_op *opline = EX(opline);
! 7916: zend_free_op free_op1;
! 7917: zval *varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 7918: zval **retval;
! 7919: zval tmp_varname;
! 7920: HashTable *target_symbol_table;
! 7921:
! 7922: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
! 7923: tmp_varname = *varname;
! 7924: zval_copy_ctor(&tmp_varname);
! 7925: convert_to_string(&tmp_varname);
! 7926: varname = &tmp_varname;
! 7927: }
! 7928:
! 7929: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 7930: 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);
! 7931: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7932: } else {
! 7933: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
! 7934: /*
! 7935: if (!target_symbol_table) {
! 7936: ZEND_VM_NEXT_OPCODE();
! 7937: }
! 7938: */
! 7939: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) {
! 7940: switch (type) {
! 7941: case BP_VAR_R:
! 7942: case BP_VAR_UNSET:
! 7943: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 7944: /* break missing intentionally */
! 7945: case BP_VAR_IS:
! 7946: retval = &EG(uninitialized_zval_ptr);
! 7947: break;
! 7948: case BP_VAR_RW:
! 7949: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 7950: /* break missing intentionally */
! 7951: case BP_VAR_W: {
! 7952: zval *new_zval = &EG(uninitialized_zval);
! 7953:
! 7954: Z_ADDREF_P(new_zval);
! 7955: zend_hash_update(target_symbol_table, varname->value.str.val, varname->value.str.len+1, &new_zval, sizeof(zval *), (void **) &retval);
! 7956: }
! 7957: break;
! 7958: EMPTY_SWITCH_DEFAULT_CASE()
! 7959: }
! 7960: }
! 7961: switch (opline->op2.u.EA.type) {
! 7962: case ZEND_FETCH_GLOBAL:
! 7963: if (IS_VAR != IS_TMP_VAR) {
! 7964: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7965: }
! 7966: break;
! 7967: case ZEND_FETCH_LOCAL:
! 7968: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 7969: break;
! 7970: case ZEND_FETCH_STATIC:
! 7971: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
! 7972: break;
! 7973: case ZEND_FETCH_GLOBAL_LOCK:
! 7974: if (IS_VAR == IS_VAR && !free_op1.var) {
! 7975: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 7976: }
! 7977: break;
! 7978: }
! 7979: }
! 7980:
! 7981:
! 7982: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
! 7983: zval_dtor(varname);
! 7984: }
! 7985: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 7986: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 7987: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
! 7988: }
! 7989: PZVAL_LOCK(*retval);
! 7990: switch (type) {
! 7991: case BP_VAR_R:
! 7992: case BP_VAR_IS:
! 7993: AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
! 7994: break;
! 7995: case BP_VAR_UNSET: {
! 7996: zend_free_op free_res;
! 7997:
! 7998: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 7999: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 8000: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 8001: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 8002: }
! 8003: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 8004: FREE_OP_VAR_PTR(free_res);
! 8005: break;
! 8006: default:
! 8007: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 8008: break;
! 8009: }
! 8010: }
! 8011: }
! 8012: ZEND_VM_NEXT_OPCODE();
! 8013: }
! 8014:
! 8015: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8016: {
! 8017: return zend_fetch_var_address_helper_SPEC_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8018: }
! 8019:
! 8020: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8021: {
! 8022: return zend_fetch_var_address_helper_SPEC_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8023: }
! 8024:
! 8025: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8026: {
! 8027: return zend_fetch_var_address_helper_SPEC_VAR(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8028: }
! 8029:
! 8030: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8031: {
! 8032: return zend_fetch_var_address_helper_SPEC_VAR(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8033: }
! 8034:
! 8035: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8036: {
! 8037: return zend_fetch_var_address_helper_SPEC_VAR(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8038: }
! 8039:
! 8040: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8041: {
! 8042: return zend_fetch_var_address_helper_SPEC_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8043: }
! 8044:
! 8045: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8046: {
! 8047: zend_op *opline = EX(opline);
! 8048: zend_free_op free_op1;
! 8049: zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8050: int ret;
! 8051:
! 8052: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 8053: ret = Z_LVAL_P(val);
! 8054: } else {
! 8055: ret = i_zend_is_true(val);
! 8056: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8057: if (UNEXPECTED(EG(exception) != NULL)) {
! 8058: ZEND_VM_CONTINUE();
! 8059: }
! 8060: }
! 8061: if (!ret) {
! 8062: #if DEBUG_ZEND>=2
! 8063: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 8064: #endif
! 8065: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 8066: ZEND_VM_CONTINUE();
! 8067: }
! 8068:
! 8069: ZEND_VM_NEXT_OPCODE();
! 8070: }
! 8071:
! 8072: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8073: {
! 8074: zend_op *opline = EX(opline);
! 8075: zend_free_op free_op1;
! 8076: zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8077: int ret;
! 8078:
! 8079: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 8080: ret = Z_LVAL_P(val);
! 8081: } else {
! 8082: ret = i_zend_is_true(val);
! 8083: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8084: if (UNEXPECTED(EG(exception) != NULL)) {
! 8085: ZEND_VM_CONTINUE();
! 8086: }
! 8087: }
! 8088: if (ret) {
! 8089: #if DEBUG_ZEND>=2
! 8090: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 8091: #endif
! 8092: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 8093: ZEND_VM_CONTINUE();
! 8094: }
! 8095:
! 8096: ZEND_VM_NEXT_OPCODE();
! 8097: }
! 8098:
! 8099: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8100: {
! 8101: zend_op *opline = EX(opline);
! 8102: zend_free_op free_op1;
! 8103: zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8104: int retval;
! 8105:
! 8106: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 8107: retval = Z_LVAL_P(val);
! 8108: } else {
! 8109: retval = i_zend_is_true(val);
! 8110: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8111: if (UNEXPECTED(EG(exception) != NULL)) {
! 8112: ZEND_VM_CONTINUE();
! 8113: }
! 8114: }
! 8115: if (EXPECTED(retval != 0)) {
! 8116: #if DEBUG_ZEND>=2
! 8117: printf("Conditional jmp on true to %d\n", opline->extended_value);
! 8118: #endif
! 8119: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 8120: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 8121: } else {
! 8122: #if DEBUG_ZEND>=2
! 8123: printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
! 8124: #endif
! 8125: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
! 8126: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 8127: }
! 8128: }
! 8129:
! 8130: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8131: {
! 8132: zend_op *opline = EX(opline);
! 8133: zend_free_op free_op1;
! 8134: zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8135: int retval;
! 8136:
! 8137: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 8138: retval = Z_LVAL_P(val);
! 8139: } else {
! 8140: retval = i_zend_is_true(val);
! 8141: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8142: if (UNEXPECTED(EG(exception) != NULL)) {
! 8143: ZEND_VM_CONTINUE();
! 8144: }
! 8145: }
! 8146: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 8147: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 8148: if (!retval) {
! 8149: #if DEBUG_ZEND>=2
! 8150: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 8151: #endif
! 8152: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 8153: ZEND_VM_CONTINUE();
! 8154: }
! 8155: ZEND_VM_NEXT_OPCODE();
! 8156: }
! 8157:
! 8158: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8159: {
! 8160: zend_op *opline = EX(opline);
! 8161: zend_free_op free_op1;
! 8162: zval *val = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8163: int retval;
! 8164:
! 8165: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 8166: retval = Z_LVAL_P(val);
! 8167: } else {
! 8168: retval = i_zend_is_true(val);
! 8169: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8170: if (UNEXPECTED(EG(exception) != NULL)) {
! 8171: ZEND_VM_CONTINUE();
! 8172: }
! 8173: }
! 8174: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 8175: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 8176: if (retval) {
! 8177: #if DEBUG_ZEND>=2
! 8178: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 8179: #endif
! 8180: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 8181: ZEND_VM_CONTINUE();
! 8182: }
! 8183: ZEND_VM_NEXT_OPCODE();
! 8184: }
! 8185:
! 8186: static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8187: {
! 8188: zend_op *opline = EX(opline);
! 8189: zval *retval_ptr;
! 8190: zval **retval_ptr_ptr;
! 8191: zend_free_op free_op1;
! 8192:
! 8193: if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
! 8194:
! 8195: if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
! 8196: /* Not supposed to happen, but we'll allow it */
! 8197: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 8198: goto return_by_value;
! 8199: }
! 8200:
! 8201: retval_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8202:
! 8203: if (IS_VAR == IS_VAR && !retval_ptr_ptr) {
! 8204: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
! 8205: }
! 8206:
! 8207: if (IS_VAR == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
! 8208: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 8209: EX_T(opline->op1.u.var).var.fcall_returned_reference) {
! 8210: } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 8211: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 8212: PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 8213: }
! 8214: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 8215: goto return_by_value;
! 8216: }
! 8217: }
! 8218:
! 8219: if (EG(return_value_ptr_ptr)) {
! 8220: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
! 8221: Z_ADDREF_PP(retval_ptr_ptr);
! 8222:
! 8223: (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
! 8224: }
! 8225: } else {
! 8226: return_by_value:
! 8227:
! 8228: retval_ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8229:
! 8230: if (!EG(return_value_ptr_ptr)) {
! 8231: if (IS_VAR == IS_TMP_VAR) {
! 8232: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8233: }
! 8234: } else if (!0) { /* Not a temp var */
! 8235: if (IS_VAR == IS_CONST ||
! 8236: EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
! 8237: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
! 8238: zval *ret;
! 8239:
! 8240: ALLOC_ZVAL(ret);
! 8241: INIT_PZVAL_COPY(ret, retval_ptr);
! 8242: zval_copy_ctor(ret);
! 8243: *EG(return_value_ptr_ptr) = ret;
! 8244: } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
! 8245: retval_ptr == &EG(uninitialized_zval)) {
! 8246: zval *ret;
! 8247:
! 8248: ALLOC_INIT_ZVAL(ret);
! 8249: *EG(return_value_ptr_ptr) = ret;
! 8250: } else {
! 8251: *EG(return_value_ptr_ptr) = retval_ptr;
! 8252: Z_ADDREF_P(retval_ptr);
! 8253: }
! 8254: } else {
! 8255: zval *ret;
! 8256:
! 8257: ALLOC_ZVAL(ret);
! 8258: INIT_PZVAL_COPY(ret, retval_ptr);
! 8259: *EG(return_value_ptr_ptr) = ret;
! 8260: }
! 8261: }
! 8262: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8263: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8264: }
! 8265:
! 8266: static int ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8267: {
! 8268: zend_op *opline = EX(opline);
! 8269: zval *value;
! 8270: zval *exception;
! 8271: zend_free_op free_op1;
! 8272:
! 8273: value = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8274:
! 8275: if (IS_VAR == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
! 8276: zend_error_noreturn(E_ERROR, "Can only throw objects");
! 8277: }
! 8278: zend_exception_save(TSRMLS_C);
! 8279: /* Not sure if a complete copy is what we want here */
! 8280: ALLOC_ZVAL(exception);
! 8281: INIT_PZVAL_COPY(exception, value);
! 8282: if (!0) {
! 8283: zval_copy_ctor(exception);
! 8284: }
! 8285:
! 8286: zend_throw_exception_object(exception TSRMLS_CC);
! 8287: zend_exception_restore(TSRMLS_C);
! 8288: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8289: ZEND_VM_NEXT_OPCODE();
! 8290: }
! 8291:
! 8292: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8293: {
! 8294: zend_op *opline = EX(opline);
! 8295: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
! 8296: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 8297: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
! 8298: }
! 8299: {
! 8300: zval *valptr;
! 8301: zval *value;
! 8302: zend_free_op free_op1;
! 8303:
! 8304: value = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8305:
! 8306: ALLOC_ZVAL(valptr);
! 8307: INIT_PZVAL_COPY(valptr, value);
! 8308: if (!0) {
! 8309: zval_copy_ctor(valptr);
! 8310: }
! 8311: zend_vm_stack_push(valptr TSRMLS_CC);
! 8312: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8313: }
! 8314: ZEND_VM_NEXT_OPCODE();
! 8315: }
! 8316:
! 8317: static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
! 8318: {
! 8319: zend_op *opline = EX(opline);
! 8320: zval *varptr;
! 8321: zend_free_op free_op1;
! 8322: varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8323:
! 8324: if (varptr == &EG(uninitialized_zval)) {
! 8325: ALLOC_ZVAL(varptr);
! 8326: INIT_ZVAL(*varptr);
! 8327: Z_SET_REFCOUNT_P(varptr, 0);
! 8328: } else if (PZVAL_IS_REF(varptr)) {
! 8329: zval *original_var = varptr;
! 8330:
! 8331: ALLOC_ZVAL(varptr);
! 8332: *varptr = *original_var;
! 8333: Z_UNSET_ISREF_P(varptr);
! 8334: Z_SET_REFCOUNT_P(varptr, 0);
! 8335: zval_copy_ctor(varptr);
! 8336: }
! 8337: Z_ADDREF_P(varptr);
! 8338: zend_vm_stack_push(varptr TSRMLS_CC);
! 8339: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* for string offsets */
! 8340:
! 8341: ZEND_VM_NEXT_OPCODE();
! 8342: }
! 8343:
! 8344: static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8345: {
! 8346: zend_op *opline = EX(opline);
! 8347: zend_free_op free_op1;
! 8348: zval *varptr;
! 8349:
! 8350: if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
! 8351: if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
! 8352: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8353: }
! 8354: } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 8355: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8356: }
! 8357:
! 8358: if (IS_VAR == IS_VAR &&
! 8359: (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
! 8360: EX_T(opline->op1.u.var).var.fcall_returned_reference &&
! 8361: EX_T(opline->op1.u.var).var.ptr) {
! 8362: varptr = EX_T(opline->op1.u.var).var.ptr;
! 8363: PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
! 8364: } else {
! 8365: varptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8366: }
! 8367: if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
! 8368: EX_T(opline->op1.u.var).var.fcall_returned_reference) &&
! 8369: varptr != &EG(uninitialized_zval) &&
! 8370: (PZVAL_IS_REF(varptr) ||
! 8371: (Z_REFCOUNT_P(varptr) == 1 && (IS_VAR == IS_CV || free_op1.var)))) {
! 8372: Z_SET_ISREF_P(varptr);
! 8373: Z_ADDREF_P(varptr);
! 8374: zend_vm_stack_push(varptr TSRMLS_CC);
! 8375: } else {
! 8376: zval *valptr;
! 8377:
! 8378: if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
! 8379: !(opline->extended_value & ZEND_ARG_SEND_SILENT) :
! 8380: !ARG_MAY_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 8381: zend_error(E_STRICT, "Only variables should be passed by reference");
! 8382: }
! 8383: ALLOC_ZVAL(valptr);
! 8384: INIT_PZVAL_COPY(valptr, varptr);
! 8385: if (!0) {
! 8386: zval_copy_ctor(valptr);
! 8387: }
! 8388: zend_vm_stack_push(valptr TSRMLS_CC);
! 8389: }
! 8390: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8391: ZEND_VM_NEXT_OPCODE();
! 8392: }
! 8393:
! 8394: static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8395: {
! 8396: zend_op *opline = EX(opline);
! 8397: zend_free_op free_op1;
! 8398: zval **varptr_ptr;
! 8399: zval *varptr;
! 8400: varptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8401:
! 8402: if (IS_VAR == IS_VAR && !varptr_ptr) {
! 8403: zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
! 8404: }
! 8405:
! 8406: if (IS_VAR == IS_VAR && *varptr_ptr == EG(error_zval_ptr)) {
! 8407: ALLOC_INIT_ZVAL(varptr);
! 8408: zend_vm_stack_push(varptr TSRMLS_CC);
! 8409: ZEND_VM_NEXT_OPCODE();
! 8410: }
! 8411:
! 8412: if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 8413: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8414: }
! 8415:
! 8416: SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr);
! 8417: varptr = *varptr_ptr;
! 8418: Z_ADDREF_P(varptr);
! 8419: zend_vm_stack_push(varptr TSRMLS_CC);
! 8420:
! 8421: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8422: ZEND_VM_NEXT_OPCODE();
! 8423: }
! 8424:
! 8425: static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8426: {
! 8427: zend_op *opline = EX(opline);
! 8428:
! 8429: if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME)
! 8430: && ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 8431: return ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8432: }
! 8433: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 8434: }
! 8435:
! 8436: static int ZEND_FASTCALL ZEND_BOOL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8437: {
! 8438: zend_op *opline = EX(opline);
! 8439: zend_free_op free_op1;
! 8440:
! 8441: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
! 8442: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC));
! 8443: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 8444: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8445:
! 8446: ZEND_VM_NEXT_OPCODE();
! 8447: }
! 8448:
! 8449: static int ZEND_FASTCALL ZEND_SWITCH_FREE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8450: {
! 8451: zend_op *opline = EX(opline);
! 8452:
! 8453: zend_switch_free(&EX_T(opline->op1.u.var), opline->extended_value TSRMLS_CC);
! 8454: ZEND_VM_NEXT_OPCODE();
! 8455: }
! 8456:
! 8457: static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8458: {
! 8459: zend_op *opline = EX(opline);
! 8460: zend_free_op free_op1;
! 8461: zval *obj = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8462: zend_class_entry *ce;
! 8463: zend_function *clone;
! 8464: zend_object_clone_obj_t clone_call;
! 8465:
! 8466: if (IS_VAR == IS_CONST ||
! 8467: (IS_VAR == IS_VAR && !obj) ||
! 8468: Z_TYPE_P(obj) != IS_OBJECT) {
! 8469: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
! 8470: }
! 8471:
! 8472: ce = Z_OBJCE_P(obj);
! 8473: clone = ce ? ce->clone : NULL;
! 8474: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
! 8475: if (!clone_call) {
! 8476: if (ce) {
! 8477: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
! 8478: } else {
! 8479: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
! 8480: }
! 8481: }
! 8482:
! 8483: if (ce && clone) {
! 8484: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
! 8485: /* Ensure that if we're calling a private function, we're allowed to do so.
! 8486: */
! 8487: if (ce != EG(scope)) {
! 8488: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 8489: }
! 8490: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
! 8491: /* Ensure that if we're calling a protected function, we're allowed to do so.
! 8492: */
! 8493: if (!zend_check_protected(clone->common.scope, EG(scope))) {
! 8494: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 8495: }
! 8496: }
! 8497: }
! 8498:
! 8499: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 8500: if (!EG(exception)) {
! 8501: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 8502: Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
! 8503: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
! 8504: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 8505: Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 8506: if (!RETURN_VALUE_USED(opline) || EG(exception)) {
! 8507: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 8508: }
! 8509: }
! 8510: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8511: ZEND_VM_NEXT_OPCODE();
! 8512: }
! 8513:
! 8514: static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8515: {
! 8516: zend_op *opline = EX(opline);
! 8517: zend_free_op free_op1;
! 8518: zval *expr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8519: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 8520:
! 8521: if (opline->extended_value != IS_STRING) {
! 8522: *result = *expr;
! 8523: if (!0) {
! 8524: zendi_zval_copy_ctor(*result);
! 8525: }
! 8526: }
! 8527: switch (opline->extended_value) {
! 8528: case IS_NULL:
! 8529: convert_to_null(result);
! 8530: break;
! 8531: case IS_BOOL:
! 8532: convert_to_boolean(result);
! 8533: break;
! 8534: case IS_LONG:
! 8535: convert_to_long(result);
! 8536: break;
! 8537: case IS_DOUBLE:
! 8538: convert_to_double(result);
! 8539: break;
! 8540: case IS_STRING: {
! 8541: zval var_copy;
! 8542: int use_copy;
! 8543:
! 8544: zend_make_printable_zval(expr, &var_copy, &use_copy);
! 8545: if (use_copy) {
! 8546: *result = var_copy;
! 8547: if (0) {
! 8548: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8549: }
! 8550: } else {
! 8551: *result = *expr;
! 8552: if (!0) {
! 8553: zendi_zval_copy_ctor(*result);
! 8554: }
! 8555: }
! 8556: break;
! 8557: }
! 8558: case IS_ARRAY:
! 8559: convert_to_array(result);
! 8560: break;
! 8561: case IS_OBJECT:
! 8562: convert_to_object(result);
! 8563: break;
! 8564: }
! 8565: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8566: ZEND_VM_NEXT_OPCODE();
! 8567: }
! 8568:
! 8569: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8570: {
! 8571: zend_op *opline = EX(opline);
! 8572: zend_op_array *new_op_array=NULL;
! 8573: int return_value_used;
! 8574: zend_free_op free_op1;
! 8575: zval *inc_filename = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8576: zval tmp_inc_filename;
! 8577: zend_bool failure_retval=0;
! 8578:
! 8579: if (inc_filename->type!=IS_STRING) {
! 8580: tmp_inc_filename = *inc_filename;
! 8581: zval_copy_ctor(&tmp_inc_filename);
! 8582: convert_to_string(&tmp_inc_filename);
! 8583: inc_filename = &tmp_inc_filename;
! 8584: }
! 8585:
! 8586: return_value_used = RETURN_VALUE_USED(opline);
! 8587:
! 8588: if (Z_LVAL(opline->op2.u.constant) != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
! 8589: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE || Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE) {
! 8590: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 8591: } else {
! 8592: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 8593: }
! 8594: } else {
! 8595: switch (Z_LVAL(opline->op2.u.constant)) {
! 8596: case ZEND_INCLUDE_ONCE:
! 8597: case ZEND_REQUIRE_ONCE: {
! 8598: zend_file_handle file_handle;
! 8599: char *resolved_path;
! 8600:
! 8601: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
! 8602: if (resolved_path) {
! 8603: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
! 8604: } else {
! 8605: resolved_path = Z_STRVAL_P(inc_filename);
! 8606: }
! 8607:
! 8608: if (failure_retval) {
! 8609: /* do nothing, file already included */
! 8610: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
! 8611:
! 8612: if (!file_handle.opened_path) {
! 8613: file_handle.opened_path = estrdup(resolved_path);
! 8614: }
! 8615:
! 8616: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
! 8617: new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
! 8618: zend_destroy_file_handle(&file_handle TSRMLS_CC);
! 8619: } else {
! 8620: zend_file_handle_dtor(&file_handle TSRMLS_CC);
! 8621: failure_retval=1;
! 8622: }
! 8623: } else {
! 8624: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
! 8625: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 8626: } else {
! 8627: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 8628: }
! 8629: }
! 8630: if (resolved_path != Z_STRVAL_P(inc_filename)) {
! 8631: efree(resolved_path);
! 8632: }
! 8633: }
! 8634: break;
! 8635: case ZEND_INCLUDE:
! 8636: case ZEND_REQUIRE:
! 8637: new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
! 8638: break;
! 8639: case ZEND_EVAL: {
! 8640: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
! 8641:
! 8642: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
! 8643: efree(eval_desc);
! 8644: }
! 8645: break;
! 8646: EMPTY_SWITCH_DEFAULT_CASE()
! 8647: }
! 8648: }
! 8649: if (inc_filename==&tmp_inc_filename) {
! 8650: zval_dtor(&tmp_inc_filename);
! 8651: }
! 8652: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8653: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 8654: if (new_op_array && !EG(exception)) {
! 8655: EX(original_return_value) = EG(return_value_ptr_ptr);
! 8656: EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
! 8657: EG(active_op_array) = new_op_array;
! 8658: EX_T(opline->result.u.var).var.ptr = NULL;
! 8659:
! 8660: EX(current_object) = EX(object);
! 8661:
! 8662: EX(function_state).function = (zend_function *) new_op_array;
! 8663: EX(object) = NULL;
! 8664:
! 8665: if (!EG(active_symbol_table)) {
! 8666: zend_rebuild_symbol_table(TSRMLS_C);
! 8667: }
! 8668:
! 8669: if (zend_execute == execute) {
! 8670: EX(call_opline) = opline;
! 8671: ZEND_VM_ENTER();
! 8672: } else {
! 8673: zend_execute(new_op_array TSRMLS_CC);
! 8674: }
! 8675:
! 8676: EX(function_state).function = (zend_function *) EX(op_array);
! 8677: EX(object) = EX(current_object);
! 8678:
! 8679: if (return_value_used) {
! 8680: if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
! 8681: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 8682: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 8683: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
! 8684: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 8685: }
! 8686: }
! 8687:
! 8688: EG(opline_ptr) = &EX(opline);
! 8689: EG(active_op_array) = EX(op_array);
! 8690: EG(return_value_ptr_ptr) = EX(original_return_value);
! 8691: destroy_op_array(new_op_array TSRMLS_CC);
! 8692: efree(new_op_array);
! 8693: if (EG(exception)) {
! 8694: zend_throw_exception_internal(NULL TSRMLS_CC);
! 8695: }
! 8696: } else {
! 8697: if (return_value_used) {
! 8698: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 8699: INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
! 8700: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
! 8701: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 8702: }
! 8703: }
! 8704: ZEND_VM_NEXT_OPCODE();
! 8705: }
! 8706:
! 8707: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8708: {
! 8709: zend_op *opline = EX(opline);
! 8710: zval tmp, *varname;
! 8711: HashTable *target_symbol_table;
! 8712: zend_free_op free_op1;
! 8713:
! 8714: if (IS_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 8715: if (EG(active_symbol_table)) {
! 8716: zend_execute_data *ex = EX(prev_execute_data);
! 8717: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 8718:
! 8719: if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
! 8720: while (ex && ex->symbol_table == EG(active_symbol_table)) {
! 8721: int i;
! 8722:
! 8723: if (ex->op_array) {
! 8724: for (i = 0; i < ex->op_array->last_var; i++) {
! 8725: if (ex->op_array->vars[i].hash_value == cv->hash_value &&
! 8726: ex->op_array->vars[i].name_len == cv->name_len &&
! 8727: !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
! 8728: ex->CVs[i] = NULL;
! 8729: break;
! 8730: }
! 8731: }
! 8732: }
! 8733: ex = ex->prev_execute_data;
! 8734: }
! 8735: }
! 8736: EX(CVs)[opline->op1.u.var] = NULL;
! 8737: } else if (EX(CVs)[opline->op1.u.var]) {
! 8738: zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
! 8739: EX(CVs)[opline->op1.u.var] = NULL;
! 8740: }
! 8741: ZEND_VM_NEXT_OPCODE();
! 8742: }
! 8743:
! 8744: varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8745:
! 8746: if (Z_TYPE_P(varname) != IS_STRING) {
! 8747: tmp = *varname;
! 8748: zval_copy_ctor(&tmp);
! 8749: convert_to_string(&tmp);
! 8750: varname = &tmp;
! 8751: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
! 8752: Z_ADDREF_P(varname);
! 8753: }
! 8754:
! 8755: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 8756: zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
! 8757: } else {
! 8758: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
! 8759:
! 8760: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 8761: if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
! 8762: zend_execute_data *ex = execute_data;
! 8763:
! 8764: do {
! 8765: int i;
! 8766:
! 8767: if (ex->op_array) {
! 8768: for (i = 0; i < ex->op_array->last_var; i++) {
! 8769: if (ex->op_array->vars[i].hash_value == hash_value &&
! 8770: ex->op_array->vars[i].name_len == varname->value.str.len &&
! 8771: !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
! 8772: ex->CVs[i] = NULL;
! 8773: break;
! 8774: }
! 8775: }
! 8776: }
! 8777: ex = ex->prev_execute_data;
! 8778: } while (ex && ex->symbol_table == target_symbol_table);
! 8779: }
! 8780: }
! 8781:
! 8782: if (varname == &tmp) {
! 8783: zval_dtor(&tmp);
! 8784: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
! 8785: zval_ptr_dtor(&varname);
! 8786: }
! 8787: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8788: ZEND_VM_NEXT_OPCODE();
! 8789: }
! 8790:
! 8791: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8792: {
! 8793: zend_op *opline = EX(opline);
! 8794: zend_free_op free_op1;
! 8795: zval *array_ptr, **array_ptr_ptr;
! 8796: HashTable *fe_ht;
! 8797: zend_object_iterator *iter = NULL;
! 8798: zend_class_entry *ce = NULL;
! 8799: zend_bool is_empty = 0;
! 8800:
! 8801: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 8802: array_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8803: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
! 8804: ALLOC_INIT_ZVAL(array_ptr);
! 8805: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
! 8806: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
! 8807: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
! 8808: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 8809: }
! 8810:
! 8811: ce = Z_OBJCE_PP(array_ptr_ptr);
! 8812: if (!ce || ce->get_iterator == NULL) {
! 8813: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 8814: Z_ADDREF_PP(array_ptr_ptr);
! 8815: }
! 8816: array_ptr = *array_ptr_ptr;
! 8817: } else {
! 8818: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
! 8819: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 8820: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
! 8821: Z_SET_ISREF_PP(array_ptr_ptr);
! 8822: }
! 8823: }
! 8824: array_ptr = *array_ptr_ptr;
! 8825: Z_ADDREF_P(array_ptr);
! 8826: }
! 8827: } else {
! 8828: array_ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 8829: if (0) { /* IS_TMP_VAR */
! 8830: zval *tmp;
! 8831:
! 8832: ALLOC_ZVAL(tmp);
! 8833: INIT_PZVAL_COPY(tmp, array_ptr);
! 8834: array_ptr = tmp;
! 8835: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 8836: ce = Z_OBJCE_P(array_ptr);
! 8837: if (ce && ce->get_iterator) {
! 8838: Z_DELREF_P(array_ptr);
! 8839: }
! 8840: }
! 8841: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 8842: ce = Z_OBJCE_P(array_ptr);
! 8843: if (!ce || !ce->get_iterator) {
! 8844: Z_ADDREF_P(array_ptr);
! 8845: }
! 8846: } else if (IS_VAR == IS_CONST ||
! 8847: ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
! 8848: !Z_ISREF_P(array_ptr) &&
! 8849: Z_REFCOUNT_P(array_ptr) > 1)) {
! 8850: zval *tmp;
! 8851:
! 8852: ALLOC_ZVAL(tmp);
! 8853: INIT_PZVAL_COPY(tmp, array_ptr);
! 8854: zval_copy_ctor(tmp);
! 8855: array_ptr = tmp;
! 8856: } else {
! 8857: Z_ADDREF_P(array_ptr);
! 8858: }
! 8859: }
! 8860:
! 8861: if (ce && ce->get_iterator) {
! 8862: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
! 8863:
! 8864: if (iter && !EG(exception)) {
! 8865: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
! 8866: } else {
! 8867: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 8868: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8869: } else {
! 8870: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8871: }
! 8872: if (!EG(exception)) {
! 8873: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
! 8874: }
! 8875: zend_throw_exception_internal(NULL TSRMLS_CC);
! 8876: ZEND_VM_NEXT_OPCODE();
! 8877: }
! 8878: }
! 8879:
! 8880: AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
! 8881: PZVAL_LOCK(array_ptr);
! 8882:
! 8883: if (iter) {
! 8884: iter->index = 0;
! 8885: if (iter->funcs->rewind) {
! 8886: iter->funcs->rewind(iter TSRMLS_CC);
! 8887: if (EG(exception)) {
! 8888: Z_DELREF_P(array_ptr);
! 8889: zval_ptr_dtor(&array_ptr);
! 8890: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 8891: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8892: } else {
! 8893: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8894: }
! 8895: ZEND_VM_NEXT_OPCODE();
! 8896: }
! 8897: }
! 8898: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
! 8899: if (EG(exception)) {
! 8900: Z_DELREF_P(array_ptr);
! 8901: zval_ptr_dtor(&array_ptr);
! 8902: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 8903: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8904: } else {
! 8905: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8906: }
! 8907: ZEND_VM_NEXT_OPCODE();
! 8908: }
! 8909: iter->index = -1; /* will be set to 0 before using next handler */
! 8910: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
! 8911: zend_hash_internal_pointer_reset(fe_ht);
! 8912: if (ce) {
! 8913: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
! 8914: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
! 8915: char *str_key;
! 8916: uint str_key_len;
! 8917: ulong int_key;
! 8918: zend_uchar key_type;
! 8919:
! 8920: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
! 8921: if (key_type != HASH_KEY_NON_EXISTANT &&
! 8922: (key_type == HASH_KEY_IS_LONG ||
! 8923: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
! 8924: break;
! 8925: }
! 8926: zend_hash_move_forward(fe_ht);
! 8927: }
! 8928: }
! 8929: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
! 8930: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
! 8931: } else {
! 8932: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
! 8933: is_empty = 1;
! 8934: }
! 8935:
! 8936: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 8937: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8938: } else {
! 8939: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 8940: }
! 8941: if (is_empty) {
! 8942: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 8943: } else {
! 8944: ZEND_VM_NEXT_OPCODE();
! 8945: }
! 8946: }
! 8947:
! 8948: static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 8949: {
! 8950: zend_op *opline = EX(opline);
! 8951:
! 8952: zval *array = EX_T(opline->op1.u.var).var.ptr;
! 8953: zval **value;
! 8954: char *str_key;
! 8955: uint str_key_len;
! 8956: ulong int_key;
! 8957: HashTable *fe_ht;
! 8958: zend_object_iterator *iter = NULL;
! 8959: int key_type = 0;
! 8960: zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY);
! 8961:
! 8962: switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) {
! 8963: default:
! 8964: case ZEND_ITER_INVALID:
! 8965: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
! 8966: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 8967:
! 8968: case ZEND_ITER_PLAIN_OBJECT: {
! 8969: char *class_name, *prop_name;
! 8970: zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
! 8971:
! 8972: fe_ht = HASH_OF(array);
! 8973: zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
! 8974: do {
! 8975: if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
! 8976: /* reached end of iteration */
! 8977: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 8978: }
! 8979: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
! 8980:
! 8981: zend_hash_move_forward(fe_ht);
! 8982: } while (key_type == HASH_KEY_NON_EXISTANT ||
! 8983: (key_type != HASH_KEY_IS_LONG &&
! 8984: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS));
! 8985: zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
! 8986: if (use_key && key_type != HASH_KEY_IS_LONG) {
! 8987: zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name);
! 8988: str_key_len = strlen(prop_name);
! 8989: str_key = estrndup(prop_name, str_key_len);
! 8990: str_key_len++;
! 8991: }
! 8992: break;
! 8993: }
! 8994:
! 8995: case ZEND_ITER_PLAIN_ARRAY:
! 8996: fe_ht = HASH_OF(array);
! 8997: zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
! 8998: if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
! 8999: /* reached end of iteration */
! 9000: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 9001: }
! 9002: if (use_key) {
! 9003: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
! 9004: }
! 9005: zend_hash_move_forward(fe_ht);
! 9006: zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.u.var).fe.fe_pos);
! 9007: break;
! 9008:
! 9009: case ZEND_ITER_OBJECT:
! 9010: /* !iter happens from exception */
! 9011: if (iter && ++iter->index > 0) {
! 9012: /* This could cause an endless loop if index becomes zero again.
! 9013: * In case that ever happens we need an additional flag. */
! 9014: iter->funcs->move_forward(iter TSRMLS_CC);
! 9015: if (EG(exception)) {
! 9016: Z_DELREF_P(array);
! 9017: zval_ptr_dtor(&array);
! 9018: ZEND_VM_NEXT_OPCODE();
! 9019: }
! 9020: }
! 9021: /* If index is zero we come from FE_RESET and checked valid() already. */
! 9022: if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
! 9023: /* reached end of iteration */
! 9024: if (EG(exception)) {
! 9025: Z_DELREF_P(array);
! 9026: zval_ptr_dtor(&array);
! 9027: ZEND_VM_NEXT_OPCODE();
! 9028: }
! 9029: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 9030: }
! 9031: iter->funcs->get_current_data(iter, &value TSRMLS_CC);
! 9032: if (EG(exception)) {
! 9033: Z_DELREF_P(array);
! 9034: zval_ptr_dtor(&array);
! 9035: ZEND_VM_NEXT_OPCODE();
! 9036: }
! 9037: if (!value) {
! 9038: /* failure in get_current_data */
! 9039: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 9040: }
! 9041: if (use_key) {
! 9042: if (iter->funcs->get_current_key) {
! 9043: key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
! 9044: if (EG(exception)) {
! 9045: Z_DELREF_P(array);
! 9046: zval_ptr_dtor(&array);
! 9047: ZEND_VM_NEXT_OPCODE();
! 9048: }
! 9049: } else {
! 9050: key_type = HASH_KEY_IS_LONG;
! 9051: int_key = iter->index;
! 9052: }
! 9053: }
! 9054: break;
! 9055: }
! 9056:
! 9057: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
! 9058: SEPARATE_ZVAL_IF_NOT_REF(value);
! 9059: Z_SET_ISREF_PP(value);
! 9060: EX_T(opline->result.u.var).var.ptr_ptr = value;
! 9061: Z_ADDREF_PP(value);
! 9062: } else {
! 9063: AI_SET_PTR(EX_T(opline->result.u.var).var, *value);
! 9064: PZVAL_LOCK(*value);
! 9065: }
! 9066:
! 9067: if (use_key) {
! 9068: zend_op *op_data = opline+1;
! 9069: zval *key = &EX_T(op_data->result.u.var).tmp_var;
! 9070:
! 9071: switch (key_type) {
! 9072: case HASH_KEY_IS_STRING:
! 9073: Z_STRVAL_P(key) = str_key;
! 9074: Z_STRLEN_P(key) = str_key_len-1;
! 9075: Z_TYPE_P(key) = IS_STRING;
! 9076: break;
! 9077: case HASH_KEY_IS_LONG:
! 9078: Z_LVAL_P(key) = int_key;
! 9079: Z_TYPE_P(key) = IS_LONG;
! 9080: break;
! 9081: default:
! 9082: case HASH_KEY_NON_EXISTANT:
! 9083: ZVAL_NULL(key);
! 9084: break;
! 9085: }
! 9086: }
! 9087:
! 9088: ZEND_VM_INC_OPCODE();
! 9089: ZEND_VM_NEXT_OPCODE();
! 9090: }
! 9091:
! 9092: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9093: {
! 9094: zend_op *opline = EX(opline);
! 9095: zval **value;
! 9096: zend_bool isset = 1;
! 9097:
! 9098: if (IS_VAR == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 9099: if (EX(CVs)[opline->op1.u.var]) {
! 9100: value = EX(CVs)[opline->op1.u.var];
! 9101: } else if (EG(active_symbol_table)) {
! 9102: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 9103:
! 9104: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
! 9105: isset = 0;
! 9106: }
! 9107: } else {
! 9108: isset = 0;
! 9109: }
! 9110: } else {
! 9111: HashTable *target_symbol_table;
! 9112: zend_free_op free_op1;
! 9113: zval tmp, *varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9114:
! 9115: if (Z_TYPE_P(varname) != IS_STRING) {
! 9116: tmp = *varname;
! 9117: zval_copy_ctor(&tmp);
! 9118: convert_to_string(&tmp);
! 9119: varname = &tmp;
! 9120: }
! 9121:
! 9122: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 9123: 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);
! 9124: if (!value) {
! 9125: isset = 0;
! 9126: }
! 9127: } else {
! 9128: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 9129: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
! 9130: isset = 0;
! 9131: }
! 9132: }
! 9133:
! 9134: if (varname == &tmp) {
! 9135: zval_dtor(&tmp);
! 9136: }
! 9137: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9138: }
! 9139:
! 9140: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 9141:
! 9142: switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
! 9143: case ZEND_ISSET:
! 9144: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 9145: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 9146: } else {
! 9147: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
! 9148: }
! 9149: break;
! 9150: case ZEND_ISEMPTY:
! 9151: if (!isset || !i_zend_is_true(*value)) {
! 9152: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 9153: } else {
! 9154: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 9155: }
! 9156: break;
! 9157: }
! 9158:
! 9159: ZEND_VM_NEXT_OPCODE();
! 9160: }
! 9161:
! 9162: static int ZEND_FASTCALL ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9163: {
! 9164: #if 0 || (IS_VAR != IS_UNUSED)
! 9165: zend_op *opline = EX(opline);
! 9166: if (IS_VAR != IS_UNUSED) {
! 9167: zend_free_op free_op1;
! 9168: zval *ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9169:
! 9170: if (Z_TYPE_P(ptr) == IS_LONG) {
! 9171: EG(exit_status) = Z_LVAL_P(ptr);
! 9172: } else {
! 9173: zend_print_variable(ptr);
! 9174: }
! 9175: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9176: }
! 9177: #endif
! 9178: zend_bailout();
! 9179: ZEND_VM_NEXT_OPCODE();
! 9180: }
! 9181:
! 9182: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9183: {
! 9184: zend_op *opline = EX(opline);
! 9185: zend_free_op free_op1;
! 9186: zval *value = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9187:
! 9188: if (i_zend_is_true(value)) {
! 9189: EX_T(opline->result.u.var).tmp_var = *value;
! 9190: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 9191: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9192: #if DEBUG_ZEND>=2
! 9193: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 9194: #endif
! 9195: ZEND_VM_JMP(opline->op2.u.jmp_addr);
! 9196: }
! 9197:
! 9198: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9199: ZEND_VM_NEXT_OPCODE();
! 9200: }
! 9201:
! 9202: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9203: {
! 9204: zend_op *opline = EX(opline);
! 9205: zend_free_op free_op1;
! 9206: zval *value = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9207:
! 9208: EX_T(opline->result.u.var).tmp_var = *value;
! 9209: if (!0) {
! 9210: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 9211: }
! 9212: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9213: ZEND_VM_NEXT_OPCODE();
! 9214: }
! 9215:
! 9216: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9217: {
! 9218: zend_op *opline = EX(opline);
! 9219: zend_free_op free_op1;
! 9220: zval *expr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9221: zend_bool result;
! 9222:
! 9223: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
! 9224: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.u.var).class_entry TSRMLS_CC);
! 9225: } else {
! 9226: result = 0;
! 9227: }
! 9228: ZVAL_BOOL(&EX_T(opline->result.u.var).tmp_var, result);
! 9229: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9230: ZEND_VM_NEXT_OPCODE();
! 9231: }
! 9232:
! 9233: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9234: {
! 9235: zend_op *opline = EX(opline);
! 9236: zend_free_op free_op1;
! 9237:
! 9238: add_function(&EX_T(opline->result.u.var).tmp_var,
! 9239: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9240: &opline->op2.u.constant TSRMLS_CC);
! 9241: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9242:
! 9243: ZEND_VM_NEXT_OPCODE();
! 9244: }
! 9245:
! 9246: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9247: {
! 9248: zend_op *opline = EX(opline);
! 9249: zend_free_op free_op1;
! 9250:
! 9251: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 9252: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9253: &opline->op2.u.constant TSRMLS_CC);
! 9254: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9255:
! 9256: ZEND_VM_NEXT_OPCODE();
! 9257: }
! 9258:
! 9259: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9260: {
! 9261: zend_op *opline = EX(opline);
! 9262: zend_free_op free_op1;
! 9263:
! 9264: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 9265: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9266: &opline->op2.u.constant TSRMLS_CC);
! 9267: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9268:
! 9269: ZEND_VM_NEXT_OPCODE();
! 9270: }
! 9271:
! 9272: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9273: {
! 9274: zend_op *opline = EX(opline);
! 9275: zend_free_op free_op1;
! 9276:
! 9277: div_function(&EX_T(opline->result.u.var).tmp_var,
! 9278: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9279: &opline->op2.u.constant TSRMLS_CC);
! 9280: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9281:
! 9282: ZEND_VM_NEXT_OPCODE();
! 9283: }
! 9284:
! 9285: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9286: {
! 9287: zend_op *opline = EX(opline);
! 9288: zend_free_op free_op1;
! 9289:
! 9290: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 9291: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9292: &opline->op2.u.constant TSRMLS_CC);
! 9293: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9294:
! 9295: ZEND_VM_NEXT_OPCODE();
! 9296: }
! 9297:
! 9298: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9299: {
! 9300: zend_op *opline = EX(opline);
! 9301: zend_free_op free_op1;
! 9302:
! 9303: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 9304: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9305: &opline->op2.u.constant TSRMLS_CC);
! 9306: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9307:
! 9308: ZEND_VM_NEXT_OPCODE();
! 9309: }
! 9310:
! 9311: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9312: {
! 9313: zend_op *opline = EX(opline);
! 9314: zend_free_op free_op1;
! 9315:
! 9316: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 9317: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9318: &opline->op2.u.constant TSRMLS_CC);
! 9319: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9320:
! 9321: ZEND_VM_NEXT_OPCODE();
! 9322: }
! 9323:
! 9324: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9325: {
! 9326: zend_op *opline = EX(opline);
! 9327: zend_free_op free_op1;
! 9328:
! 9329: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 9330: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9331: &opline->op2.u.constant TSRMLS_CC);
! 9332: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9333:
! 9334: ZEND_VM_NEXT_OPCODE();
! 9335: }
! 9336:
! 9337: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9338: {
! 9339: zend_op *opline = EX(opline);
! 9340: zend_free_op free_op1;
! 9341:
! 9342: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 9343: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9344: &opline->op2.u.constant TSRMLS_CC);
! 9345: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9346:
! 9347: ZEND_VM_NEXT_OPCODE();
! 9348: }
! 9349:
! 9350: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9351: {
! 9352: zend_op *opline = EX(opline);
! 9353: zend_free_op free_op1;
! 9354: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 9355:
! 9356: is_identical_function(result,
! 9357: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9358: &opline->op2.u.constant TSRMLS_CC);
! 9359: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 9360: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9361:
! 9362: ZEND_VM_NEXT_OPCODE();
! 9363: }
! 9364:
! 9365: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9366: {
! 9367: zend_op *opline = EX(opline);
! 9368: zend_free_op free_op1;
! 9369: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 9370:
! 9371: compare_function(result,
! 9372: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9373: &opline->op2.u.constant TSRMLS_CC);
! 9374: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 9375: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9376:
! 9377: ZEND_VM_NEXT_OPCODE();
! 9378: }
! 9379:
! 9380: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9381: {
! 9382: zend_op *opline = EX(opline);
! 9383: zend_free_op free_op1;
! 9384: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 9385:
! 9386: compare_function(result,
! 9387: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9388: &opline->op2.u.constant TSRMLS_CC);
! 9389: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 9390: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9391:
! 9392: ZEND_VM_NEXT_OPCODE();
! 9393: }
! 9394:
! 9395: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9396: {
! 9397: zend_op *opline = EX(opline);
! 9398: zend_free_op free_op1;
! 9399: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 9400:
! 9401: compare_function(result,
! 9402: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9403: &opline->op2.u.constant TSRMLS_CC);
! 9404: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 9405: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9406:
! 9407: ZEND_VM_NEXT_OPCODE();
! 9408: }
! 9409:
! 9410: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9411: {
! 9412: zend_op *opline = EX(opline);
! 9413: zend_free_op free_op1;
! 9414: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 9415:
! 9416: compare_function(result,
! 9417: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9418: &opline->op2.u.constant TSRMLS_CC);
! 9419: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 9420: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9421:
! 9422: ZEND_VM_NEXT_OPCODE();
! 9423: }
! 9424:
! 9425: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9426: {
! 9427: zend_op *opline = EX(opline);
! 9428: zend_free_op free_op1;
! 9429:
! 9430: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 9431: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9432: &opline->op2.u.constant TSRMLS_CC);
! 9433: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9434:
! 9435: ZEND_VM_NEXT_OPCODE();
! 9436: }
! 9437:
! 9438: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9439: {
! 9440: zend_op *opline = EX(opline);
! 9441: zend_free_op free_op1;
! 9442:
! 9443: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 9444: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9445: &opline->op2.u.constant TSRMLS_CC);
! 9446: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9447:
! 9448: ZEND_VM_NEXT_OPCODE();
! 9449: }
! 9450:
! 9451: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9452: {
! 9453: zend_op *opline = EX(opline);
! 9454: zend_free_op free_op1;
! 9455:
! 9456: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 9457: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9458: &opline->op2.u.constant TSRMLS_CC);
! 9459: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9460:
! 9461: ZEND_VM_NEXT_OPCODE();
! 9462: }
! 9463:
! 9464: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9465: {
! 9466: zend_op *opline = EX(opline);
! 9467: zend_free_op free_op1;
! 9468:
! 9469: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 9470: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 9471: &opline->op2.u.constant TSRMLS_CC);
! 9472: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9473:
! 9474: ZEND_VM_NEXT_OPCODE();
! 9475: }
! 9476:
! 9477: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 9478: {
! 9479: zend_op *opline = EX(opline);
! 9480: zend_op *op_data = opline+1;
! 9481: zend_free_op free_op1, free_op_data1;
! 9482: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9483: zval *object;
! 9484: zval *property = &opline->op2.u.constant;
! 9485: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 9486: znode *result = &opline->result;
! 9487: int have_get_ptr = 0;
! 9488:
! 9489: if (IS_VAR == IS_VAR && !object_ptr) {
! 9490: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 9491: }
! 9492:
! 9493: EX_T(result->u.var).var.ptr_ptr = NULL;
! 9494: make_real_object(object_ptr TSRMLS_CC);
! 9495: object = *object_ptr;
! 9496:
! 9497: if (Z_TYPE_P(object) != IS_OBJECT) {
! 9498: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 9499:
! 9500: FREE_OP(free_op_data1);
! 9501:
! 9502: if (!RETURN_VALUE_UNUSED(result)) {
! 9503: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 9504: EX_T(result->u.var).var.ptr_ptr = NULL;
! 9505: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 9506: }
! 9507: } else {
! 9508: /* here we are sure we are dealing with an object */
! 9509: if (0) {
! 9510: MAKE_REAL_ZVAL_PTR(property);
! 9511: }
! 9512:
! 9513: /* here property is a string */
! 9514: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 9515: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 9516: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 9517: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 9518: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 9519:
! 9520: have_get_ptr = 1;
! 9521: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 9522: if (!RETURN_VALUE_UNUSED(result)) {
! 9523: EX_T(result->u.var).var.ptr = *zptr;
! 9524: EX_T(result->u.var).var.ptr_ptr = NULL;
! 9525: PZVAL_LOCK(*zptr);
! 9526: }
! 9527: }
! 9528: }
! 9529:
! 9530: if (!have_get_ptr) {
! 9531: zval *z = NULL;
! 9532:
! 9533: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 9534: if (Z_OBJ_HT_P(object)->read_property) {
! 9535: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 9536: }
! 9537: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 9538: if (Z_OBJ_HT_P(object)->read_dimension) {
! 9539: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 9540: }
! 9541: }
! 9542: if (z) {
! 9543: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 9544: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 9545:
! 9546: if (Z_REFCOUNT_P(z) == 0) {
! 9547: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 9548: zval_dtor(z);
! 9549: FREE_ZVAL(z);
! 9550: }
! 9551: z = value;
! 9552: }
! 9553: Z_ADDREF_P(z);
! 9554: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 9555: binary_op(z, z, value TSRMLS_CC);
! 9556: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 9557: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 9558: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 9559: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 9560: }
! 9561: if (!RETURN_VALUE_UNUSED(result)) {
! 9562: EX_T(result->u.var).var.ptr = z;
! 9563: EX_T(result->u.var).var.ptr_ptr = NULL;
! 9564: PZVAL_LOCK(z);
! 9565: }
! 9566: zval_ptr_dtor(&z);
! 9567: } else {
! 9568: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 9569: if (!RETURN_VALUE_UNUSED(result)) {
! 9570: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 9571: EX_T(result->u.var).var.ptr_ptr = NULL;
! 9572: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 9573: }
! 9574: }
! 9575: }
! 9576:
! 9577: if (0) {
! 9578: zval_ptr_dtor(&property);
! 9579: } else {
! 9580:
! 9581: }
! 9582: FREE_OP(free_op_data1);
! 9583: }
! 9584:
! 9585: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9586: /* assign_obj has two opcodes! */
! 9587: ZEND_VM_INC_OPCODE();
! 9588: ZEND_VM_NEXT_OPCODE();
! 9589: }
! 9590:
! 9591: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 9592: {
! 9593: zend_op *opline = EX(opline);
! 9594: zend_free_op free_op1, free_op_data2, free_op_data1;
! 9595: zval **var_ptr;
! 9596: zval *value;
! 9597:
! 9598: switch (opline->extended_value) {
! 9599: case ZEND_ASSIGN_OBJ:
! 9600: return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9601: break;
! 9602: case ZEND_ASSIGN_DIM: {
! 9603: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9604:
! 9605: if (IS_VAR == IS_VAR && !container) {
! 9606: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 9607: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 9608: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 9609: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 9610: }
! 9611: return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9612: } else {
! 9613: zend_op *op_data = opline+1;
! 9614: zval *dim = &opline->op2.u.constant;
! 9615:
! 9616: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 9617: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 9618: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 9619: ZEND_VM_INC_OPCODE();
! 9620: }
! 9621: }
! 9622: break;
! 9623: default:
! 9624: value = &opline->op2.u.constant;
! 9625: var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9626: /* do nothing */
! 9627: break;
! 9628: }
! 9629:
! 9630: if (!var_ptr) {
! 9631: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 9632: }
! 9633:
! 9634: if (*var_ptr == EG(error_zval_ptr)) {
! 9635: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 9636: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 9637: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 9638: }
! 9639:
! 9640: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9641: ZEND_VM_NEXT_OPCODE();
! 9642: }
! 9643:
! 9644: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 9645:
! 9646: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 9647: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 9648: /* proxy object */
! 9649: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 9650: Z_ADDREF_P(objval);
! 9651: binary_op(objval, objval, value TSRMLS_CC);
! 9652: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 9653: zval_ptr_dtor(&objval);
! 9654: } else {
! 9655: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 9656: }
! 9657:
! 9658: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 9659: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 9660: PZVAL_LOCK(*var_ptr);
! 9661: }
! 9662:
! 9663: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 9664: FREE_OP(free_op_data1);
! 9665: FREE_OP_VAR_PTR(free_op_data2);
! 9666: }
! 9667: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9668: ZEND_VM_NEXT_OPCODE();
! 9669: }
! 9670:
! 9671: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9672: {
! 9673: return zend_binary_assign_op_helper_SPEC_VAR_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9674: }
! 9675:
! 9676: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9677: {
! 9678: return zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9679: }
! 9680:
! 9681: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9682: {
! 9683: return zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9684: }
! 9685:
! 9686: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9687: {
! 9688: return zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9689: }
! 9690:
! 9691: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9692: {
! 9693: return zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9694: }
! 9695:
! 9696: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9697: {
! 9698: return zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9699: }
! 9700:
! 9701: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9702: {
! 9703: return zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9704: }
! 9705:
! 9706: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9707: {
! 9708: return zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9709: }
! 9710:
! 9711: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9712: {
! 9713: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9714: }
! 9715:
! 9716: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9717: {
! 9718: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9719: }
! 9720:
! 9721: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9722: {
! 9723: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9724: }
! 9725:
! 9726: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 9727: {
! 9728: zend_op *opline = EX(opline);
! 9729: zend_free_op free_op1;
! 9730: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9731: zval *object;
! 9732: zval *property = &opline->op2.u.constant;
! 9733: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 9734: int have_get_ptr = 0;
! 9735:
! 9736: if (IS_VAR == IS_VAR && !object_ptr) {
! 9737: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 9738: }
! 9739:
! 9740: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 9741: object = *object_ptr;
! 9742:
! 9743: if (Z_TYPE_P(object) != IS_OBJECT) {
! 9744: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 9745:
! 9746: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 9747: *retval = EG(uninitialized_zval_ptr);
! 9748: PZVAL_LOCK(*retval);
! 9749: }
! 9750: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9751: ZEND_VM_NEXT_OPCODE();
! 9752: }
! 9753:
! 9754: /* here we are sure we are dealing with an object */
! 9755:
! 9756: if (0) {
! 9757: MAKE_REAL_ZVAL_PTR(property);
! 9758: }
! 9759:
! 9760: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 9761: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 9762: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 9763: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 9764:
! 9765: have_get_ptr = 1;
! 9766: incdec_op(*zptr);
! 9767: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 9768: *retval = *zptr;
! 9769: PZVAL_LOCK(*retval);
! 9770: }
! 9771: }
! 9772: }
! 9773:
! 9774: if (!have_get_ptr) {
! 9775: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 9776: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 9777:
! 9778: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 9779: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 9780:
! 9781: if (Z_REFCOUNT_P(z) == 0) {
! 9782: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 9783: zval_dtor(z);
! 9784: FREE_ZVAL(z);
! 9785: }
! 9786: z = value;
! 9787: }
! 9788: Z_ADDREF_P(z);
! 9789: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 9790: incdec_op(z);
! 9791: *retval = z;
! 9792: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 9793: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 9794: zval_ptr_dtor(&z);
! 9795: } else {
! 9796: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 9797: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 9798: *retval = EG(uninitialized_zval_ptr);
! 9799: PZVAL_LOCK(*retval);
! 9800: }
! 9801: }
! 9802: }
! 9803:
! 9804: if (0) {
! 9805: zval_ptr_dtor(&property);
! 9806: } else {
! 9807:
! 9808: }
! 9809: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9810: ZEND_VM_NEXT_OPCODE();
! 9811: }
! 9812:
! 9813: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9814: {
! 9815: return zend_pre_incdec_property_helper_SPEC_VAR_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9816: }
! 9817:
! 9818: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9819: {
! 9820: return zend_pre_incdec_property_helper_SPEC_VAR_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9821: }
! 9822:
! 9823: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 9824: {
! 9825: zend_op *opline = EX(opline);
! 9826: zend_free_op free_op1;
! 9827: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9828: zval *object;
! 9829: zval *property = &opline->op2.u.constant;
! 9830: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 9831: int have_get_ptr = 0;
! 9832:
! 9833: if (IS_VAR == IS_VAR && !object_ptr) {
! 9834: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 9835: }
! 9836:
! 9837: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 9838: object = *object_ptr;
! 9839:
! 9840: if (Z_TYPE_P(object) != IS_OBJECT) {
! 9841: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 9842:
! 9843: *retval = *EG(uninitialized_zval_ptr);
! 9844: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9845: ZEND_VM_NEXT_OPCODE();
! 9846: }
! 9847:
! 9848: /* here we are sure we are dealing with an object */
! 9849:
! 9850: if (0) {
! 9851: MAKE_REAL_ZVAL_PTR(property);
! 9852: }
! 9853:
! 9854: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 9855: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 9856: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 9857: have_get_ptr = 1;
! 9858: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 9859:
! 9860: *retval = **zptr;
! 9861: zendi_zval_copy_ctor(*retval);
! 9862:
! 9863: incdec_op(*zptr);
! 9864:
! 9865: }
! 9866: }
! 9867:
! 9868: if (!have_get_ptr) {
! 9869: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 9870: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 9871: zval *z_copy;
! 9872:
! 9873: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 9874: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 9875:
! 9876: if (Z_REFCOUNT_P(z) == 0) {
! 9877: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 9878: zval_dtor(z);
! 9879: FREE_ZVAL(z);
! 9880: }
! 9881: z = value;
! 9882: }
! 9883: *retval = *z;
! 9884: zendi_zval_copy_ctor(*retval);
! 9885: ALLOC_ZVAL(z_copy);
! 9886: *z_copy = *z;
! 9887: zendi_zval_copy_ctor(*z_copy);
! 9888: INIT_PZVAL(z_copy);
! 9889: incdec_op(z_copy);
! 9890: Z_ADDREF_P(z);
! 9891: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 9892: zval_ptr_dtor(&z_copy);
! 9893: zval_ptr_dtor(&z);
! 9894: } else {
! 9895: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 9896: *retval = *EG(uninitialized_zval_ptr);
! 9897: }
! 9898: }
! 9899:
! 9900: if (0) {
! 9901: zval_ptr_dtor(&property);
! 9902: } else {
! 9903:
! 9904: }
! 9905: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9906: ZEND_VM_NEXT_OPCODE();
! 9907: }
! 9908:
! 9909: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9910: {
! 9911: return zend_post_incdec_property_helper_SPEC_VAR_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9912: }
! 9913:
! 9914: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9915: {
! 9916: return zend_post_incdec_property_helper_SPEC_VAR_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 9917: }
! 9918:
! 9919: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9920: {
! 9921: zend_op *opline = EX(opline);
! 9922: zend_free_op free_op1;
! 9923: zval *dim = &opline->op2.u.constant;
! 9924: zval **container;
! 9925:
! 9926: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 9927: IS_VAR != IS_CV &&
! 9928: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 9929: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 9930: }
! 9931: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9932: if (IS_VAR == IS_VAR && !container) {
! 9933: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 9934: }
! 9935: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 9936:
! 9937: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9938: ZEND_VM_NEXT_OPCODE();
! 9939: }
! 9940:
! 9941: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9942: {
! 9943: zend_op *opline = EX(opline);
! 9944: zend_free_op free_op1;
! 9945: zval *dim = &opline->op2.u.constant;
! 9946: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9947:
! 9948: if (IS_VAR == IS_VAR && !container) {
! 9949: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 9950: }
! 9951: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 9952:
! 9953: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 9954: READY_TO_DESTROY(free_op1.var)) {
! 9955: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 9956: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 9957: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 9958: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 9959: }
! 9960: }
! 9961: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9962:
! 9963: /* We are going to assign the result by reference */
! 9964: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 9965: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 9966: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 9967: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 9968: }
! 9969:
! 9970: ZEND_VM_NEXT_OPCODE();
! 9971: }
! 9972:
! 9973: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9974: {
! 9975: zend_op *opline = EX(opline);
! 9976: zend_free_op free_op1;
! 9977: zval *dim = &opline->op2.u.constant;
! 9978: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 9979:
! 9980: if (IS_VAR == IS_VAR && !container) {
! 9981: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 9982: }
! 9983: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 9984:
! 9985: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 9986: READY_TO_DESTROY(free_op1.var)) {
! 9987: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 9988: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 9989: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 9990: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 9991: }
! 9992: }
! 9993: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 9994: ZEND_VM_NEXT_OPCODE();
! 9995: }
! 9996:
! 9997: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 9998: {
! 9999: zend_op *opline = EX(opline);
! 10000: zend_free_op free_op1;
! 10001: zval *dim = &opline->op2.u.constant;
! 10002: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10003:
! 10004: if (IS_VAR == IS_VAR && !container) {
! 10005: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10006: }
! 10007: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 10008:
! 10009: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10010: ZEND_VM_NEXT_OPCODE();
! 10011: }
! 10012:
! 10013: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10014: {
! 10015: zend_op *opline = EX(opline);
! 10016: zend_free_op free_op1;
! 10017: zval *dim = &opline->op2.u.constant;
! 10018: zval **container;
! 10019:
! 10020: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 10021: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10022: if (IS_VAR == IS_VAR && !container) {
! 10023: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10024: }
! 10025: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 10026: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10027: READY_TO_DESTROY(free_op1.var)) {
! 10028: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10029: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10030: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10031: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10032: }
! 10033: }
! 10034: } else {
! 10035: if (IS_CONST == IS_UNUSED) {
! 10036: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 10037: }
! 10038: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10039: if (IS_VAR == IS_VAR && !container) {
! 10040: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10041: }
! 10042: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 10043: }
! 10044:
! 10045: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10046: ZEND_VM_NEXT_OPCODE();
! 10047: }
! 10048:
! 10049: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10050: {
! 10051: zend_op *opline = EX(opline);
! 10052: zend_free_op free_op1;
! 10053: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10054: zval *dim = &opline->op2.u.constant;
! 10055:
! 10056: /* Not needed in DIM_UNSET
! 10057: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 10058: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 10059: }
! 10060: */
! 10061: if (IS_VAR == IS_CV) {
! 10062: if (container != &EG(uninitialized_zval_ptr)) {
! 10063: SEPARATE_ZVAL_IF_NOT_REF(container);
! 10064: }
! 10065: }
! 10066: if (IS_VAR == IS_VAR && !container) {
! 10067: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10068: }
! 10069: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 10070:
! 10071: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10072: READY_TO_DESTROY(free_op1.var)) {
! 10073: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10074: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10075: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10076: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10077: }
! 10078: }
! 10079: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10080: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 10081: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 10082: } else {
! 10083: zend_free_op free_res;
! 10084:
! 10085: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 10086: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 10087: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 10088: }
! 10089: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 10090: FREE_OP_VAR_PTR(free_res);
! 10091: }
! 10092: ZEND_VM_NEXT_OPCODE();
! 10093: }
! 10094:
! 10095: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
! 10096: {
! 10097: zend_op *opline = EX(opline);
! 10098: zend_free_op free_op1;
! 10099: zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10100:
! 10101: zval *offset = &opline->op2.u.constant;
! 10102:
! 10103: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 10104: if (type != BP_VAR_IS) {
! 10105: zend_error(E_NOTICE, "Trying to get property of non-object");
! 10106: }
! 10107: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10108: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 10109: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 10110: }
! 10111:
! 10112: } else {
! 10113: zval *retval;
! 10114:
! 10115: if (0) {
! 10116: MAKE_REAL_ZVAL_PTR(offset);
! 10117: }
! 10118:
! 10119: /* here we are sure we are dealing with an object */
! 10120: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 10121:
! 10122: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 10123: if (Z_REFCOUNT_P(retval) == 0) {
! 10124: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 10125: zval_dtor(retval);
! 10126: FREE_ZVAL(retval);
! 10127: }
! 10128: } else {
! 10129: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 10130: PZVAL_LOCK(retval);
! 10131: }
! 10132:
! 10133: if (0) {
! 10134: zval_ptr_dtor(&offset);
! 10135: } else {
! 10136:
! 10137: }
! 10138: }
! 10139:
! 10140: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10141: ZEND_VM_NEXT_OPCODE();
! 10142: }
! 10143:
! 10144: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10145: {
! 10146: return zend_fetch_property_address_read_helper_SPEC_VAR_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 10147: }
! 10148:
! 10149: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10150: {
! 10151: zend_op *opline = EX(opline);
! 10152: zend_free_op free_op1;
! 10153: zval *property = &opline->op2.u.constant;
! 10154: zval **container;
! 10155:
! 10156: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 10157: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 10158: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 10159: }
! 10160:
! 10161: if (0) {
! 10162: MAKE_REAL_ZVAL_PTR(property);
! 10163: }
! 10164: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10165: if (IS_VAR == IS_VAR && !container) {
! 10166: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 10167: }
! 10168: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 10169: if (0) {
! 10170: zval_ptr_dtor(&property);
! 10171: } else {
! 10172:
! 10173: }
! 10174: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10175: READY_TO_DESTROY(free_op1.var)) {
! 10176: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10177: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10178: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10179: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10180: }
! 10181: }
! 10182: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10183:
! 10184: /* We are going to assign the result by reference */
! 10185: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 10186: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 10187: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 10188: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 10189: }
! 10190:
! 10191: ZEND_VM_NEXT_OPCODE();
! 10192: }
! 10193:
! 10194: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10195: {
! 10196: zend_op *opline = EX(opline);
! 10197: zend_free_op free_op1;
! 10198: zval *property = &opline->op2.u.constant;
! 10199: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10200:
! 10201: if (0) {
! 10202: MAKE_REAL_ZVAL_PTR(property);
! 10203: }
! 10204: if (IS_VAR == IS_VAR && !container) {
! 10205: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 10206: }
! 10207: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 10208: if (0) {
! 10209: zval_ptr_dtor(&property);
! 10210: } else {
! 10211:
! 10212: }
! 10213: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10214: READY_TO_DESTROY(free_op1.var)) {
! 10215: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10216: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10217: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10218: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10219: }
! 10220: }
! 10221: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10222: ZEND_VM_NEXT_OPCODE();
! 10223: }
! 10224:
! 10225: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10226: {
! 10227: return zend_fetch_property_address_read_helper_SPEC_VAR_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 10228: }
! 10229:
! 10230: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10231: {
! 10232: zend_op *opline = EX(opline);
! 10233:
! 10234: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 10235: /* Behave like FETCH_OBJ_W */
! 10236: zend_free_op free_op1;
! 10237: zval *property = &opline->op2.u.constant;
! 10238: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10239:
! 10240: if (0) {
! 10241: MAKE_REAL_ZVAL_PTR(property);
! 10242: }
! 10243: if (IS_VAR == IS_VAR && !container) {
! 10244: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 10245: }
! 10246: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 10247: if (0) {
! 10248: zval_ptr_dtor(&property);
! 10249: } else {
! 10250:
! 10251: }
! 10252: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10253: READY_TO_DESTROY(free_op1.var)) {
! 10254: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10255: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10256: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10257: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10258: }
! 10259: }
! 10260: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10261: ZEND_VM_NEXT_OPCODE();
! 10262: } else {
! 10263: return zend_fetch_property_address_read_helper_SPEC_VAR_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 10264: }
! 10265: }
! 10266:
! 10267: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10268: {
! 10269: zend_op *opline = EX(opline);
! 10270: zend_free_op free_op1, free_res;
! 10271: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10272: zval *property = &opline->op2.u.constant;
! 10273:
! 10274: if (IS_VAR == IS_CV) {
! 10275: if (container != &EG(uninitialized_zval_ptr)) {
! 10276: SEPARATE_ZVAL_IF_NOT_REF(container);
! 10277: }
! 10278: }
! 10279: if (0) {
! 10280: MAKE_REAL_ZVAL_PTR(property);
! 10281: }
! 10282: if (IS_VAR == IS_VAR && !container) {
! 10283: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 10284: }
! 10285: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 10286: if (0) {
! 10287: zval_ptr_dtor(&property);
! 10288: } else {
! 10289:
! 10290: }
! 10291: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 10292: READY_TO_DESTROY(free_op1.var)) {
! 10293: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 10294: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 10295: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 10296: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 10297: }
! 10298: }
! 10299: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10300:
! 10301: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 10302: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 10303: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 10304: }
! 10305: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 10306: FREE_OP_VAR_PTR(free_res);
! 10307: ZEND_VM_NEXT_OPCODE();
! 10308: }
! 10309:
! 10310: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10311: {
! 10312: zend_op *opline = EX(opline);
! 10313: zend_op *op_data = opline+1;
! 10314: zend_free_op free_op1;
! 10315: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10316: zval *property_name = &opline->op2.u.constant;
! 10317:
! 10318: if (0) {
! 10319: MAKE_REAL_ZVAL_PTR(property_name);
! 10320: }
! 10321: if (IS_VAR == IS_VAR && !object_ptr) {
! 10322: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10323: }
! 10324: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 10325: if (0) {
! 10326: zval_ptr_dtor(&property_name);
! 10327: } else {
! 10328:
! 10329: }
! 10330: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10331: /* assign_obj has two opcodes! */
! 10332: ZEND_VM_INC_OPCODE();
! 10333: ZEND_VM_NEXT_OPCODE();
! 10334: }
! 10335:
! 10336: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10337: {
! 10338: zend_op *opline = EX(opline);
! 10339: zend_op *op_data = opline+1;
! 10340: zend_free_op free_op1;
! 10341: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10342:
! 10343: if (IS_VAR == IS_VAR && !object_ptr) {
! 10344: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 10345: }
! 10346: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 10347:
! 10348: zval *property_name = &opline->op2.u.constant;
! 10349:
! 10350: if (0) {
! 10351: MAKE_REAL_ZVAL_PTR(property_name);
! 10352: }
! 10353: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 10354: if (0) {
! 10355: zval_ptr_dtor(&property_name);
! 10356: } else {
! 10357:
! 10358: }
! 10359: } else {
! 10360: zend_free_op free_op_data1, free_op_data2;
! 10361: zval *value;
! 10362: zval *dim = &opline->op2.u.constant;
! 10363: zval **variable_ptr_ptr;
! 10364:
! 10365: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 10366:
! 10367: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 10368: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 10369: if (!variable_ptr_ptr) {
! 10370: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 10371: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10372: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 10373: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 10374: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 10375: 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);
! 10376: }
! 10377: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10378: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 10379: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 10380: }
! 10381: } else {
! 10382: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 10383: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10384: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 10385: PZVAL_LOCK(value);
! 10386: }
! 10387: }
! 10388: FREE_OP_VAR_PTR(free_op_data2);
! 10389: FREE_OP_IF_VAR(free_op_data1);
! 10390: }
! 10391: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10392: /* assign_dim has two opcodes! */
! 10393: ZEND_VM_INC_OPCODE();
! 10394: ZEND_VM_NEXT_OPCODE();
! 10395: }
! 10396:
! 10397: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10398: {
! 10399: zend_op *opline = EX(opline);
! 10400: zend_free_op free_op1;
! 10401: zval *value = &opline->op2.u.constant;
! 10402: zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10403:
! 10404: if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
! 10405: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
! 10406: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10407: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 10408: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 10409: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 10410: 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);
! 10411: }
! 10412: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10413: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 10414: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 10415: }
! 10416: } else {
! 10417: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 10418: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 10419: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 10420: PZVAL_LOCK(value);
! 10421: }
! 10422: }
! 10423:
! 10424: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10425:
! 10426: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 10427:
! 10428: ZEND_VM_NEXT_OPCODE();
! 10429: }
! 10430:
! 10431: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10432: {
! 10433: zend_op *opline = EX(opline);
! 10434: zval *function_name;
! 10435: char *function_name_strval;
! 10436: int function_name_strlen;
! 10437: zend_free_op free_op1;
! 10438:
! 10439: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 10440:
! 10441: function_name = &opline->op2.u.constant;
! 10442:
! 10443: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 10444: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 10445: }
! 10446:
! 10447: function_name_strval = Z_STRVAL_P(function_name);
! 10448: function_name_strlen = Z_STRLEN_P(function_name);
! 10449:
! 10450: EX(object) = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10451:
! 10452: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 10453: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 10454: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 10455: }
! 10456:
! 10457: /* First, locate the function. */
! 10458: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 10459: if (!EX(fbc)) {
! 10460: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 10461: }
! 10462:
! 10463: EX(called_scope) = Z_OBJCE_P(EX(object));
! 10464: } else {
! 10465: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 10466: }
! 10467:
! 10468: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 10469: EX(object) = NULL;
! 10470: } else {
! 10471: if (!PZVAL_IS_REF(EX(object))) {
! 10472: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 10473: } else {
! 10474: zval *this_ptr;
! 10475: ALLOC_ZVAL(this_ptr);
! 10476: INIT_PZVAL_COPY(this_ptr, EX(object));
! 10477: zval_copy_ctor(this_ptr);
! 10478: EX(object) = this_ptr;
! 10479: }
! 10480: }
! 10481:
! 10482: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10483:
! 10484: ZEND_VM_NEXT_OPCODE();
! 10485: }
! 10486:
! 10487: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10488: {
! 10489: zend_op *opline = EX(opline);
! 10490: zval *function_name;
! 10491: zend_class_entry *ce;
! 10492:
! 10493: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 10494:
! 10495: if (IS_VAR == IS_CONST) {
! 10496: /* no function found. try a static method in class */
! 10497: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 10498: if (!ce) {
! 10499: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 10500: }
! 10501: EX(called_scope) = ce;
! 10502: } else {
! 10503: ce = EX_T(opline->op1.u.var).class_entry;
! 10504:
! 10505: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 10506: EX(called_scope) = EG(called_scope);
! 10507: } else {
! 10508: EX(called_scope) = ce;
! 10509: }
! 10510: }
! 10511: if(IS_CONST != IS_UNUSED) {
! 10512: char *function_name_strval = NULL;
! 10513: int function_name_strlen = 0;
! 10514:
! 10515:
! 10516: if (IS_CONST == IS_CONST) {
! 10517: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 10518: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 10519: } else {
! 10520: function_name = &opline->op2.u.constant;
! 10521:
! 10522: if (Z_TYPE_P(function_name) != IS_STRING) {
! 10523: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 10524: } else {
! 10525: function_name_strval = Z_STRVAL_P(function_name);
! 10526: function_name_strlen = Z_STRLEN_P(function_name);
! 10527: }
! 10528: }
! 10529:
! 10530: if (function_name_strval) {
! 10531: if (ce->get_static_method) {
! 10532: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 10533: } else {
! 10534: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 10535: }
! 10536: if (!EX(fbc)) {
! 10537: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 10538: }
! 10539: }
! 10540:
! 10541: if (IS_CONST != IS_CONST) {
! 10542:
! 10543: }
! 10544: } else {
! 10545: if(!ce->constructor) {
! 10546: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 10547: }
! 10548: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 10549: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 10550: }
! 10551: EX(fbc) = ce->constructor;
! 10552: }
! 10553:
! 10554: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 10555: EX(object) = NULL;
! 10556: } else {
! 10557: if (EG(This) &&
! 10558: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 10559: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 10560: /* We are calling method of the other (incompatible) class,
! 10561: but passing $this. This is done for compatibility with php-4. */
! 10562: int severity;
! 10563: char *verb;
! 10564: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 10565: severity = E_STRICT;
! 10566: verb = "should not";
! 10567: } else {
! 10568: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 10569: severity = E_ERROR;
! 10570: verb = "cannot";
! 10571: }
! 10572: 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);
! 10573:
! 10574: }
! 10575: if ((EX(object) = EG(This))) {
! 10576: Z_ADDREF_P(EX(object));
! 10577: EX(called_scope) = Z_OBJCE_P(EX(object));
! 10578: }
! 10579: }
! 10580:
! 10581: ZEND_VM_NEXT_OPCODE();
! 10582: }
! 10583:
! 10584: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10585: {
! 10586: zend_op *opline = EX(opline);
! 10587: int switch_expr_is_overloaded=0;
! 10588: zend_free_op free_op1;
! 10589:
! 10590: if (IS_VAR==IS_VAR) {
! 10591: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 10592: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 10593: } else {
! 10594: switch_expr_is_overloaded = 1;
! 10595: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 10596: }
! 10597: }
! 10598: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 10599: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 10600: &opline->op2.u.constant TSRMLS_CC);
! 10601:
! 10602: if (switch_expr_is_overloaded) {
! 10603: /* We only free op1 if this is a string offset,
! 10604: * Since if it is a TMP_VAR, it'll be reused by
! 10605: * other CASE opcodes (whereas string offsets
! 10606: * are allocated at each get_zval_ptr())
! 10607: */
! 10608: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10609: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 10610: EX_T(opline->op1.u.var).var.ptr = NULL;
! 10611: }
! 10612: ZEND_VM_NEXT_OPCODE();
! 10613: }
! 10614:
! 10615: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10616: {
! 10617: zend_op *opline = EX(opline);
! 10618:
! 10619: if (IS_VAR == IS_UNUSED) {
! 10620: /* namespaced constant */
! 10621: 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)) {
! 10622: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
! 10623: char *actual = (char *)zend_memrchr(Z_STRVAL(opline->op2.u.constant), '\\', Z_STRLEN(opline->op2.u.constant));
! 10624: if(!actual) {
! 10625: actual = Z_STRVAL(opline->op2.u.constant);
! 10626: } else {
! 10627: actual++;
! 10628: }
! 10629: /* non-qualified constant - allow text substitution */
! 10630: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
! 10631: 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);
! 10632: } else {
! 10633: zend_error_noreturn(E_ERROR, "Undefined constant '%s'",
! 10634: Z_STRVAL(opline->op2.u.constant), Z_STRVAL(opline->op2.u.constant));
! 10635: }
! 10636: }
! 10637: ZEND_VM_NEXT_OPCODE();
! 10638: } else {
! 10639: /* class constant */
! 10640: zend_class_entry *ce;
! 10641: zval **value;
! 10642:
! 10643: if (IS_VAR == IS_CONST) {
! 10644:
! 10645: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 10646: if (!ce) {
! 10647: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 10648: }
! 10649: } else {
! 10650: ce = EX_T(opline->op1.u.var).class_entry;
! 10651: }
! 10652:
! 10653: if (zend_hash_find(&ce->constants_table, Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void **) &value) == SUCCESS) {
! 10654: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
! 10655: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
! 10656: zend_class_entry *old_scope = EG(scope);
! 10657:
! 10658: EG(scope) = ce;
! 10659: zval_update_constant(value, (void *) 1 TSRMLS_CC);
! 10660: EG(scope) = old_scope;
! 10661: }
! 10662: EX_T(opline->result.u.var).tmp_var = **value;
! 10663: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 10664: } else {
! 10665: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 10666: }
! 10667:
! 10668: ZEND_VM_NEXT_OPCODE();
! 10669: }
! 10670: }
! 10671:
! 10672: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10673: {
! 10674: zend_op *opline = EX(opline);
! 10675: zend_free_op free_op1;
! 10676: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 10677: zval *expr_ptr;
! 10678: zval *offset=&opline->op2.u.constant;
! 10679:
! 10680: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 10681: zval **expr_ptr_ptr = NULL;
! 10682:
! 10683: if (opline->extended_value) {
! 10684: expr_ptr_ptr=_get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10685: expr_ptr = *expr_ptr_ptr;
! 10686: } else {
! 10687: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10688: }
! 10689: #else
! 10690: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10691: #endif
! 10692:
! 10693: if (0) { /* temporary variable */
! 10694: zval *new_expr;
! 10695:
! 10696: ALLOC_ZVAL(new_expr);
! 10697: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 10698: expr_ptr = new_expr;
! 10699: } else {
! 10700: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 10701: if (opline->extended_value) {
! 10702: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 10703: expr_ptr = *expr_ptr_ptr;
! 10704: Z_ADDREF_P(expr_ptr);
! 10705: } else
! 10706: #endif
! 10707: if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 10708: zval *new_expr;
! 10709:
! 10710: ALLOC_ZVAL(new_expr);
! 10711: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 10712: expr_ptr = new_expr;
! 10713: zendi_zval_copy_ctor(*expr_ptr);
! 10714: } else {
! 10715: Z_ADDREF_P(expr_ptr);
! 10716: }
! 10717: }
! 10718: if (offset) {
! 10719: switch (Z_TYPE_P(offset)) {
! 10720: case IS_DOUBLE:
! 10721: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 10722: break;
! 10723: case IS_LONG:
! 10724: case IS_BOOL:
! 10725: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 10726: break;
! 10727: case IS_STRING:
! 10728: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 10729: break;
! 10730: case IS_NULL:
! 10731: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 10732: break;
! 10733: default:
! 10734: zend_error(E_WARNING, "Illegal offset type");
! 10735: zval_ptr_dtor(&expr_ptr);
! 10736: /* do nothing */
! 10737: break;
! 10738: }
! 10739:
! 10740: } else {
! 10741: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 10742: }
! 10743: if (opline->extended_value) {
! 10744: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10745: } else {
! 10746: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10747: }
! 10748: ZEND_VM_NEXT_OPCODE();
! 10749: }
! 10750:
! 10751: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10752: {
! 10753: zend_op *opline = EX(opline);
! 10754:
! 10755: array_init(&EX_T(opline->result.u.var).tmp_var);
! 10756: if (IS_VAR == IS_UNUSED) {
! 10757: ZEND_VM_NEXT_OPCODE();
! 10758: #if 0 || IS_VAR != IS_UNUSED
! 10759: } else {
! 10760: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 10761: #endif
! 10762: }
! 10763: }
! 10764:
! 10765: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10766: {
! 10767: zend_op *opline = EX(opline);
! 10768: zend_free_op free_op1;
! 10769: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10770: zval *offset;
! 10771:
! 10772: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 10773: SEPARATE_ZVAL_IF_NOT_REF(container);
! 10774: }
! 10775: offset = &opline->op2.u.constant;
! 10776:
! 10777: if (IS_VAR != IS_VAR || container) {
! 10778: switch (Z_TYPE_PP(container)) {
! 10779: case IS_ARRAY: {
! 10780: HashTable *ht = Z_ARRVAL_PP(container);
! 10781:
! 10782: switch (Z_TYPE_P(offset)) {
! 10783: case IS_DOUBLE:
! 10784: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 10785: break;
! 10786: case IS_RESOURCE:
! 10787: case IS_BOOL:
! 10788: case IS_LONG:
! 10789: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 10790: break;
! 10791: case IS_STRING:
! 10792: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 10793: Z_ADDREF_P(offset);
! 10794: }
! 10795: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 10796: ht == &EG(symbol_table)) {
! 10797: zend_execute_data *ex;
! 10798: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 10799:
! 10800: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 10801: if (ex->op_array && ex->symbol_table == ht) {
! 10802: int i;
! 10803:
! 10804: for (i = 0; i < ex->op_array->last_var; i++) {
! 10805: if (ex->op_array->vars[i].hash_value == hash_value &&
! 10806: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 10807: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 10808: ex->CVs[i] = NULL;
! 10809: break;
! 10810: }
! 10811: }
! 10812: }
! 10813: }
! 10814: }
! 10815: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 10816: zval_ptr_dtor(&offset);
! 10817: }
! 10818: break;
! 10819: case IS_NULL:
! 10820: zend_hash_del(ht, "", sizeof(""));
! 10821: break;
! 10822: default:
! 10823: zend_error(E_WARNING, "Illegal offset type in unset");
! 10824: break;
! 10825: }
! 10826:
! 10827: break;
! 10828: }
! 10829: case IS_OBJECT:
! 10830: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 10831: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 10832: }
! 10833: if (0) {
! 10834: MAKE_REAL_ZVAL_PTR(offset);
! 10835: }
! 10836: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 10837: if (0) {
! 10838: zval_ptr_dtor(&offset);
! 10839: } else {
! 10840:
! 10841: }
! 10842: break;
! 10843: case IS_STRING:
! 10844: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 10845: ZEND_VM_CONTINUE(); /* bailed out before */
! 10846: default:
! 10847:
! 10848: break;
! 10849: }
! 10850: } else {
! 10851:
! 10852: }
! 10853: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10854:
! 10855: ZEND_VM_NEXT_OPCODE();
! 10856: }
! 10857:
! 10858: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 10859: {
! 10860: zend_op *opline = EX(opline);
! 10861: zend_free_op free_op1;
! 10862: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10863: zval *offset = &opline->op2.u.constant;
! 10864:
! 10865: if (IS_VAR != IS_VAR || container) {
! 10866: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 10867: SEPARATE_ZVAL_IF_NOT_REF(container);
! 10868: }
! 10869: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 10870: if (0) {
! 10871: MAKE_REAL_ZVAL_PTR(offset);
! 10872: }
! 10873: if (Z_OBJ_HT_P(*container)->unset_property) {
! 10874: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 10875: } else {
! 10876: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 10877: }
! 10878: if (0) {
! 10879: zval_ptr_dtor(&offset);
! 10880: } else {
! 10881:
! 10882: }
! 10883: } else {
! 10884:
! 10885: }
! 10886: } else {
! 10887:
! 10888: }
! 10889: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 10890:
! 10891: ZEND_VM_NEXT_OPCODE();
! 10892: }
! 10893:
! 10894: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 10895: {
! 10896: zend_op *opline = EX(opline);
! 10897: zend_free_op free_op1;
! 10898: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 10899: zval **value = NULL;
! 10900: int result = 0;
! 10901:
! 10902: if (IS_VAR != IS_VAR || container) {
! 10903:
! 10904: zval *offset = &opline->op2.u.constant;
! 10905:
! 10906: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 10907: HashTable *ht;
! 10908: int isset = 0;
! 10909:
! 10910: ht = Z_ARRVAL_PP(container);
! 10911:
! 10912: switch (Z_TYPE_P(offset)) {
! 10913: case IS_DOUBLE:
! 10914: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 10915: isset = 1;
! 10916: }
! 10917: break;
! 10918: case IS_RESOURCE:
! 10919: case IS_BOOL:
! 10920: case IS_LONG:
! 10921: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 10922: isset = 1;
! 10923: }
! 10924: break;
! 10925: case IS_STRING:
! 10926: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 10927: isset = 1;
! 10928: }
! 10929: break;
! 10930: case IS_NULL:
! 10931: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 10932: isset = 1;
! 10933: }
! 10934: break;
! 10935: default:
! 10936: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 10937:
! 10938: break;
! 10939: }
! 10940:
! 10941: switch (opline->extended_value) {
! 10942: case ZEND_ISSET:
! 10943: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 10944: result = 0;
! 10945: } else {
! 10946: result = isset;
! 10947: }
! 10948: break;
! 10949: case ZEND_ISEMPTY:
! 10950: if (!isset || !i_zend_is_true(*value)) {
! 10951: result = 0;
! 10952: } else {
! 10953: result = 1;
! 10954: }
! 10955: break;
! 10956: }
! 10957:
! 10958: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 10959: if (0) {
! 10960: MAKE_REAL_ZVAL_PTR(offset);
! 10961: }
! 10962: if (prop_dim) {
! 10963: if (Z_OBJ_HT_P(*container)->has_property) {
! 10964: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 10965: } else {
! 10966: zend_error(E_NOTICE, "Trying to check property of non-object");
! 10967: result = 0;
! 10968: }
! 10969: } else {
! 10970: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 10971: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 10972: } else {
! 10973: zend_error(E_NOTICE, "Trying to check element of non-array");
! 10974: result = 0;
! 10975: }
! 10976: }
! 10977: if (0) {
! 10978: zval_ptr_dtor(&offset);
! 10979: } else {
! 10980:
! 10981: }
! 10982: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 10983: zval tmp;
! 10984:
! 10985: if (Z_TYPE_P(offset) != IS_LONG) {
! 10986: tmp = *offset;
! 10987: zval_copy_ctor(&tmp);
! 10988: convert_to_long(&tmp);
! 10989: offset = &tmp;
! 10990: }
! 10991: if (Z_TYPE_P(offset) == IS_LONG) {
! 10992: switch (opline->extended_value) {
! 10993: case ZEND_ISSET:
! 10994: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 10995: result = 1;
! 10996: }
! 10997: break;
! 10998: case ZEND_ISEMPTY:
! 10999: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 11000: result = 1;
! 11001: }
! 11002: break;
! 11003: }
! 11004: }
! 11005:
! 11006: } else {
! 11007:
! 11008: }
! 11009: }
! 11010:
! 11011: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 11012:
! 11013: switch (opline->extended_value) {
! 11014: case ZEND_ISSET:
! 11015: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 11016: break;
! 11017: case ZEND_ISEMPTY:
! 11018: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 11019: break;
! 11020: }
! 11021:
! 11022: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11023:
! 11024: ZEND_VM_NEXT_OPCODE();
! 11025: }
! 11026:
! 11027: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11028: {
! 11029: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11030: }
! 11031:
! 11032: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11033: {
! 11034: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11035: }
! 11036:
! 11037: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11038: {
! 11039: zend_op *opline = EX(opline);
! 11040: zend_free_op free_op1, free_op2;
! 11041:
! 11042: add_function(&EX_T(opline->result.u.var).tmp_var,
! 11043: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11044: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11045: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11046: zval_dtor(free_op2.var);
! 11047: ZEND_VM_NEXT_OPCODE();
! 11048: }
! 11049:
! 11050: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11051: {
! 11052: zend_op *opline = EX(opline);
! 11053: zend_free_op free_op1, free_op2;
! 11054:
! 11055: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 11056: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11057: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11058: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11059: zval_dtor(free_op2.var);
! 11060: ZEND_VM_NEXT_OPCODE();
! 11061: }
! 11062:
! 11063: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11064: {
! 11065: zend_op *opline = EX(opline);
! 11066: zend_free_op free_op1, free_op2;
! 11067:
! 11068: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 11069: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11070: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11071: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11072: zval_dtor(free_op2.var);
! 11073: ZEND_VM_NEXT_OPCODE();
! 11074: }
! 11075:
! 11076: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11077: {
! 11078: zend_op *opline = EX(opline);
! 11079: zend_free_op free_op1, free_op2;
! 11080:
! 11081: div_function(&EX_T(opline->result.u.var).tmp_var,
! 11082: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11083: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11084: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11085: zval_dtor(free_op2.var);
! 11086: ZEND_VM_NEXT_OPCODE();
! 11087: }
! 11088:
! 11089: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11090: {
! 11091: zend_op *opline = EX(opline);
! 11092: zend_free_op free_op1, free_op2;
! 11093:
! 11094: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 11095: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11096: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11097: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11098: zval_dtor(free_op2.var);
! 11099: ZEND_VM_NEXT_OPCODE();
! 11100: }
! 11101:
! 11102: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11103: {
! 11104: zend_op *opline = EX(opline);
! 11105: zend_free_op free_op1, free_op2;
! 11106:
! 11107: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 11108: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11109: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11110: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11111: zval_dtor(free_op2.var);
! 11112: ZEND_VM_NEXT_OPCODE();
! 11113: }
! 11114:
! 11115: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11116: {
! 11117: zend_op *opline = EX(opline);
! 11118: zend_free_op free_op1, free_op2;
! 11119:
! 11120: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 11121: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11122: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11123: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11124: zval_dtor(free_op2.var);
! 11125: ZEND_VM_NEXT_OPCODE();
! 11126: }
! 11127:
! 11128: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11129: {
! 11130: zend_op *opline = EX(opline);
! 11131: zend_free_op free_op1, free_op2;
! 11132:
! 11133: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 11134: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11135: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11136: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11137: zval_dtor(free_op2.var);
! 11138: ZEND_VM_NEXT_OPCODE();
! 11139: }
! 11140:
! 11141: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11142: {
! 11143: zend_op *opline = EX(opline);
! 11144: zend_free_op free_op1, free_op2;
! 11145:
! 11146: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 11147: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11148: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11149: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11150: zval_dtor(free_op2.var);
! 11151: ZEND_VM_NEXT_OPCODE();
! 11152: }
! 11153:
! 11154: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11155: {
! 11156: zend_op *opline = EX(opline);
! 11157: zend_free_op free_op1, free_op2;
! 11158: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 11159:
! 11160: is_identical_function(result,
! 11161: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11162: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11163: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 11164: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11165: zval_dtor(free_op2.var);
! 11166: ZEND_VM_NEXT_OPCODE();
! 11167: }
! 11168:
! 11169: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11170: {
! 11171: zend_op *opline = EX(opline);
! 11172: zend_free_op free_op1, free_op2;
! 11173: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 11174:
! 11175: compare_function(result,
! 11176: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11177: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11178: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 11179: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11180: zval_dtor(free_op2.var);
! 11181: ZEND_VM_NEXT_OPCODE();
! 11182: }
! 11183:
! 11184: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11185: {
! 11186: zend_op *opline = EX(opline);
! 11187: zend_free_op free_op1, free_op2;
! 11188: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 11189:
! 11190: compare_function(result,
! 11191: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11192: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11193: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 11194: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11195: zval_dtor(free_op2.var);
! 11196: ZEND_VM_NEXT_OPCODE();
! 11197: }
! 11198:
! 11199: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11200: {
! 11201: zend_op *opline = EX(opline);
! 11202: zend_free_op free_op1, free_op2;
! 11203: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 11204:
! 11205: compare_function(result,
! 11206: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11207: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11208: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 11209: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11210: zval_dtor(free_op2.var);
! 11211: ZEND_VM_NEXT_OPCODE();
! 11212: }
! 11213:
! 11214: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11215: {
! 11216: zend_op *opline = EX(opline);
! 11217: zend_free_op free_op1, free_op2;
! 11218: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 11219:
! 11220: compare_function(result,
! 11221: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11222: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11223: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 11224: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11225: zval_dtor(free_op2.var);
! 11226: ZEND_VM_NEXT_OPCODE();
! 11227: }
! 11228:
! 11229: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11230: {
! 11231: zend_op *opline = EX(opline);
! 11232: zend_free_op free_op1, free_op2;
! 11233:
! 11234: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 11235: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11236: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11237: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11238: zval_dtor(free_op2.var);
! 11239: ZEND_VM_NEXT_OPCODE();
! 11240: }
! 11241:
! 11242: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11243: {
! 11244: zend_op *opline = EX(opline);
! 11245: zend_free_op free_op1, free_op2;
! 11246:
! 11247: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 11248: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11249: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11250: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11251: zval_dtor(free_op2.var);
! 11252: ZEND_VM_NEXT_OPCODE();
! 11253: }
! 11254:
! 11255: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11256: {
! 11257: zend_op *opline = EX(opline);
! 11258: zend_free_op free_op1, free_op2;
! 11259:
! 11260: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 11261: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11262: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11263: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11264: zval_dtor(free_op2.var);
! 11265: ZEND_VM_NEXT_OPCODE();
! 11266: }
! 11267:
! 11268: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11269: {
! 11270: zend_op *opline = EX(opline);
! 11271: zend_free_op free_op1, free_op2;
! 11272:
! 11273: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 11274: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 11275: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 11276: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11277: zval_dtor(free_op2.var);
! 11278: ZEND_VM_NEXT_OPCODE();
! 11279: }
! 11280:
! 11281: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 11282: {
! 11283: zend_op *opline = EX(opline);
! 11284: zend_op *op_data = opline+1;
! 11285: zend_free_op free_op1, free_op2, free_op_data1;
! 11286: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11287: zval *object;
! 11288: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11289: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 11290: znode *result = &opline->result;
! 11291: int have_get_ptr = 0;
! 11292:
! 11293: if (IS_VAR == IS_VAR && !object_ptr) {
! 11294: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 11295: }
! 11296:
! 11297: EX_T(result->u.var).var.ptr_ptr = NULL;
! 11298: make_real_object(object_ptr TSRMLS_CC);
! 11299: object = *object_ptr;
! 11300:
! 11301: if (Z_TYPE_P(object) != IS_OBJECT) {
! 11302: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 11303: zval_dtor(free_op2.var);
! 11304: FREE_OP(free_op_data1);
! 11305:
! 11306: if (!RETURN_VALUE_UNUSED(result)) {
! 11307: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 11308: EX_T(result->u.var).var.ptr_ptr = NULL;
! 11309: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 11310: }
! 11311: } else {
! 11312: /* here we are sure we are dealing with an object */
! 11313: if (1) {
! 11314: MAKE_REAL_ZVAL_PTR(property);
! 11315: }
! 11316:
! 11317: /* here property is a string */
! 11318: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 11319: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 11320: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 11321: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 11322: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 11323:
! 11324: have_get_ptr = 1;
! 11325: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 11326: if (!RETURN_VALUE_UNUSED(result)) {
! 11327: EX_T(result->u.var).var.ptr = *zptr;
! 11328: EX_T(result->u.var).var.ptr_ptr = NULL;
! 11329: PZVAL_LOCK(*zptr);
! 11330: }
! 11331: }
! 11332: }
! 11333:
! 11334: if (!have_get_ptr) {
! 11335: zval *z = NULL;
! 11336:
! 11337: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 11338: if (Z_OBJ_HT_P(object)->read_property) {
! 11339: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 11340: }
! 11341: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 11342: if (Z_OBJ_HT_P(object)->read_dimension) {
! 11343: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 11344: }
! 11345: }
! 11346: if (z) {
! 11347: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 11348: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 11349:
! 11350: if (Z_REFCOUNT_P(z) == 0) {
! 11351: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 11352: zval_dtor(z);
! 11353: FREE_ZVAL(z);
! 11354: }
! 11355: z = value;
! 11356: }
! 11357: Z_ADDREF_P(z);
! 11358: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 11359: binary_op(z, z, value TSRMLS_CC);
! 11360: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 11361: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 11362: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 11363: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 11364: }
! 11365: if (!RETURN_VALUE_UNUSED(result)) {
! 11366: EX_T(result->u.var).var.ptr = z;
! 11367: EX_T(result->u.var).var.ptr_ptr = NULL;
! 11368: PZVAL_LOCK(z);
! 11369: }
! 11370: zval_ptr_dtor(&z);
! 11371: } else {
! 11372: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 11373: if (!RETURN_VALUE_UNUSED(result)) {
! 11374: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 11375: EX_T(result->u.var).var.ptr_ptr = NULL;
! 11376: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 11377: }
! 11378: }
! 11379: }
! 11380:
! 11381: if (1) {
! 11382: zval_ptr_dtor(&property);
! 11383: } else {
! 11384: zval_dtor(free_op2.var);
! 11385: }
! 11386: FREE_OP(free_op_data1);
! 11387: }
! 11388:
! 11389: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11390: /* assign_obj has two opcodes! */
! 11391: ZEND_VM_INC_OPCODE();
! 11392: ZEND_VM_NEXT_OPCODE();
! 11393: }
! 11394:
! 11395: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 11396: {
! 11397: zend_op *opline = EX(opline);
! 11398: zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
! 11399: zval **var_ptr;
! 11400: zval *value;
! 11401:
! 11402: switch (opline->extended_value) {
! 11403: case ZEND_ASSIGN_OBJ:
! 11404: return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11405: break;
! 11406: case ZEND_ASSIGN_DIM: {
! 11407: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11408:
! 11409: if (IS_VAR == IS_VAR && !container) {
! 11410: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11411: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 11412: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 11413: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 11414: }
! 11415: return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11416: } else {
! 11417: zend_op *op_data = opline+1;
! 11418: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11419:
! 11420: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
! 11421: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 11422: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 11423: ZEND_VM_INC_OPCODE();
! 11424: }
! 11425: }
! 11426: break;
! 11427: default:
! 11428: value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11429: var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11430: /* do nothing */
! 11431: break;
! 11432: }
! 11433:
! 11434: if (!var_ptr) {
! 11435: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 11436: }
! 11437:
! 11438: if (*var_ptr == EG(error_zval_ptr)) {
! 11439: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11440: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 11441: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 11442: }
! 11443: zval_dtor(free_op2.var);
! 11444: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11445: ZEND_VM_NEXT_OPCODE();
! 11446: }
! 11447:
! 11448: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 11449:
! 11450: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 11451: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 11452: /* proxy object */
! 11453: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 11454: Z_ADDREF_P(objval);
! 11455: binary_op(objval, objval, value TSRMLS_CC);
! 11456: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 11457: zval_ptr_dtor(&objval);
! 11458: } else {
! 11459: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 11460: }
! 11461:
! 11462: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11463: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 11464: PZVAL_LOCK(*var_ptr);
! 11465: }
! 11466: zval_dtor(free_op2.var);
! 11467:
! 11468: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 11469: FREE_OP(free_op_data1);
! 11470: FREE_OP_VAR_PTR(free_op_data2);
! 11471: }
! 11472: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11473: ZEND_VM_NEXT_OPCODE();
! 11474: }
! 11475:
! 11476: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11477: {
! 11478: return zend_binary_assign_op_helper_SPEC_VAR_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11479: }
! 11480:
! 11481: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11482: {
! 11483: return zend_binary_assign_op_helper_SPEC_VAR_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11484: }
! 11485:
! 11486: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11487: {
! 11488: return zend_binary_assign_op_helper_SPEC_VAR_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11489: }
! 11490:
! 11491: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11492: {
! 11493: return zend_binary_assign_op_helper_SPEC_VAR_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11494: }
! 11495:
! 11496: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11497: {
! 11498: return zend_binary_assign_op_helper_SPEC_VAR_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11499: }
! 11500:
! 11501: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11502: {
! 11503: return zend_binary_assign_op_helper_SPEC_VAR_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11504: }
! 11505:
! 11506: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11507: {
! 11508: return zend_binary_assign_op_helper_SPEC_VAR_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11509: }
! 11510:
! 11511: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11512: {
! 11513: return zend_binary_assign_op_helper_SPEC_VAR_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11514: }
! 11515:
! 11516: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11517: {
! 11518: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11519: }
! 11520:
! 11521: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11522: {
! 11523: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11524: }
! 11525:
! 11526: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11527: {
! 11528: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11529: }
! 11530:
! 11531: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 11532: {
! 11533: zend_op *opline = EX(opline);
! 11534: zend_free_op free_op1, free_op2;
! 11535: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11536: zval *object;
! 11537: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11538: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 11539: int have_get_ptr = 0;
! 11540:
! 11541: if (IS_VAR == IS_VAR && !object_ptr) {
! 11542: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 11543: }
! 11544:
! 11545: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 11546: object = *object_ptr;
! 11547:
! 11548: if (Z_TYPE_P(object) != IS_OBJECT) {
! 11549: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 11550: zval_dtor(free_op2.var);
! 11551: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11552: *retval = EG(uninitialized_zval_ptr);
! 11553: PZVAL_LOCK(*retval);
! 11554: }
! 11555: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11556: ZEND_VM_NEXT_OPCODE();
! 11557: }
! 11558:
! 11559: /* here we are sure we are dealing with an object */
! 11560:
! 11561: if (1) {
! 11562: MAKE_REAL_ZVAL_PTR(property);
! 11563: }
! 11564:
! 11565: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 11566: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 11567: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 11568: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 11569:
! 11570: have_get_ptr = 1;
! 11571: incdec_op(*zptr);
! 11572: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11573: *retval = *zptr;
! 11574: PZVAL_LOCK(*retval);
! 11575: }
! 11576: }
! 11577: }
! 11578:
! 11579: if (!have_get_ptr) {
! 11580: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 11581: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 11582:
! 11583: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 11584: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 11585:
! 11586: if (Z_REFCOUNT_P(z) == 0) {
! 11587: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 11588: zval_dtor(z);
! 11589: FREE_ZVAL(z);
! 11590: }
! 11591: z = value;
! 11592: }
! 11593: Z_ADDREF_P(z);
! 11594: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 11595: incdec_op(z);
! 11596: *retval = z;
! 11597: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 11598: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 11599: zval_ptr_dtor(&z);
! 11600: } else {
! 11601: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 11602: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11603: *retval = EG(uninitialized_zval_ptr);
! 11604: PZVAL_LOCK(*retval);
! 11605: }
! 11606: }
! 11607: }
! 11608:
! 11609: if (1) {
! 11610: zval_ptr_dtor(&property);
! 11611: } else {
! 11612: zval_dtor(free_op2.var);
! 11613: }
! 11614: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11615: ZEND_VM_NEXT_OPCODE();
! 11616: }
! 11617:
! 11618: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11619: {
! 11620: return zend_pre_incdec_property_helper_SPEC_VAR_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11621: }
! 11622:
! 11623: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11624: {
! 11625: return zend_pre_incdec_property_helper_SPEC_VAR_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11626: }
! 11627:
! 11628: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 11629: {
! 11630: zend_op *opline = EX(opline);
! 11631: zend_free_op free_op1, free_op2;
! 11632: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11633: zval *object;
! 11634: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11635: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 11636: int have_get_ptr = 0;
! 11637:
! 11638: if (IS_VAR == IS_VAR && !object_ptr) {
! 11639: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 11640: }
! 11641:
! 11642: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 11643: object = *object_ptr;
! 11644:
! 11645: if (Z_TYPE_P(object) != IS_OBJECT) {
! 11646: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 11647: zval_dtor(free_op2.var);
! 11648: *retval = *EG(uninitialized_zval_ptr);
! 11649: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11650: ZEND_VM_NEXT_OPCODE();
! 11651: }
! 11652:
! 11653: /* here we are sure we are dealing with an object */
! 11654:
! 11655: if (1) {
! 11656: MAKE_REAL_ZVAL_PTR(property);
! 11657: }
! 11658:
! 11659: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 11660: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 11661: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 11662: have_get_ptr = 1;
! 11663: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 11664:
! 11665: *retval = **zptr;
! 11666: zendi_zval_copy_ctor(*retval);
! 11667:
! 11668: incdec_op(*zptr);
! 11669:
! 11670: }
! 11671: }
! 11672:
! 11673: if (!have_get_ptr) {
! 11674: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 11675: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 11676: zval *z_copy;
! 11677:
! 11678: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 11679: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 11680:
! 11681: if (Z_REFCOUNT_P(z) == 0) {
! 11682: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 11683: zval_dtor(z);
! 11684: FREE_ZVAL(z);
! 11685: }
! 11686: z = value;
! 11687: }
! 11688: *retval = *z;
! 11689: zendi_zval_copy_ctor(*retval);
! 11690: ALLOC_ZVAL(z_copy);
! 11691: *z_copy = *z;
! 11692: zendi_zval_copy_ctor(*z_copy);
! 11693: INIT_PZVAL(z_copy);
! 11694: incdec_op(z_copy);
! 11695: Z_ADDREF_P(z);
! 11696: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 11697: zval_ptr_dtor(&z_copy);
! 11698: zval_ptr_dtor(&z);
! 11699: } else {
! 11700: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 11701: *retval = *EG(uninitialized_zval_ptr);
! 11702: }
! 11703: }
! 11704:
! 11705: if (1) {
! 11706: zval_ptr_dtor(&property);
! 11707: } else {
! 11708: zval_dtor(free_op2.var);
! 11709: }
! 11710: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11711: ZEND_VM_NEXT_OPCODE();
! 11712: }
! 11713:
! 11714: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11715: {
! 11716: return zend_post_incdec_property_helper_SPEC_VAR_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11717: }
! 11718:
! 11719: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11720: {
! 11721: return zend_post_incdec_property_helper_SPEC_VAR_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11722: }
! 11723:
! 11724: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11725: {
! 11726: zend_op *opline = EX(opline);
! 11727: zend_free_op free_op1, free_op2;
! 11728: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11729: zval **container;
! 11730:
! 11731: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 11732: IS_VAR != IS_CV &&
! 11733: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 11734: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 11735: }
! 11736: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11737: if (IS_VAR == IS_VAR && !container) {
! 11738: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11739: }
! 11740: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_R TSRMLS_CC);
! 11741: zval_dtor(free_op2.var);
! 11742: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11743: ZEND_VM_NEXT_OPCODE();
! 11744: }
! 11745:
! 11746: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11747: {
! 11748: zend_op *opline = EX(opline);
! 11749: zend_free_op free_op1, free_op2;
! 11750: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11751: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11752:
! 11753: if (IS_VAR == IS_VAR && !container) {
! 11754: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11755: }
! 11756: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_W TSRMLS_CC);
! 11757: zval_dtor(free_op2.var);
! 11758: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 11759: READY_TO_DESTROY(free_op1.var)) {
! 11760: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 11761: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 11762: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 11763: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 11764: }
! 11765: }
! 11766: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11767:
! 11768: /* We are going to assign the result by reference */
! 11769: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 11770: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 11771: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 11772: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 11773: }
! 11774:
! 11775: ZEND_VM_NEXT_OPCODE();
! 11776: }
! 11777:
! 11778: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11779: {
! 11780: zend_op *opline = EX(opline);
! 11781: zend_free_op free_op1, free_op2;
! 11782: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11783: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11784:
! 11785: if (IS_VAR == IS_VAR && !container) {
! 11786: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11787: }
! 11788: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
! 11789: zval_dtor(free_op2.var);
! 11790: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 11791: READY_TO_DESTROY(free_op1.var)) {
! 11792: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 11793: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 11794: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 11795: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 11796: }
! 11797: }
! 11798: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11799: ZEND_VM_NEXT_OPCODE();
! 11800: }
! 11801:
! 11802: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11803: {
! 11804: zend_op *opline = EX(opline);
! 11805: zend_free_op free_op1, free_op2;
! 11806: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11807: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11808:
! 11809: if (IS_VAR == IS_VAR && !container) {
! 11810: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11811: }
! 11812: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_IS TSRMLS_CC);
! 11813: zval_dtor(free_op2.var);
! 11814: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11815: ZEND_VM_NEXT_OPCODE();
! 11816: }
! 11817:
! 11818: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11819: {
! 11820: zend_op *opline = EX(opline);
! 11821: zend_free_op free_op1, free_op2;
! 11822: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11823: zval **container;
! 11824:
! 11825: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 11826: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11827: if (IS_VAR == IS_VAR && !container) {
! 11828: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11829: }
! 11830: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_W TSRMLS_CC);
! 11831: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 11832: READY_TO_DESTROY(free_op1.var)) {
! 11833: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 11834: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 11835: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 11836: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 11837: }
! 11838: }
! 11839: } else {
! 11840: if (IS_TMP_VAR == IS_UNUSED) {
! 11841: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 11842: }
! 11843: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11844: if (IS_VAR == IS_VAR && !container) {
! 11845: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11846: }
! 11847: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_R TSRMLS_CC);
! 11848: }
! 11849: zval_dtor(free_op2.var);
! 11850: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11851: ZEND_VM_NEXT_OPCODE();
! 11852: }
! 11853:
! 11854: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11855: {
! 11856: zend_op *opline = EX(opline);
! 11857: zend_free_op free_op1, free_op2;
! 11858: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11859: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11860:
! 11861: /* Not needed in DIM_UNSET
! 11862: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 11863: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 11864: }
! 11865: */
! 11866: if (IS_VAR == IS_CV) {
! 11867: if (container != &EG(uninitialized_zval_ptr)) {
! 11868: SEPARATE_ZVAL_IF_NOT_REF(container);
! 11869: }
! 11870: }
! 11871: if (IS_VAR == IS_VAR && !container) {
! 11872: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 11873: }
! 11874: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_UNSET TSRMLS_CC);
! 11875: zval_dtor(free_op2.var);
! 11876: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 11877: READY_TO_DESTROY(free_op1.var)) {
! 11878: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 11879: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 11880: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 11881: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 11882: }
! 11883: }
! 11884: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11885: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 11886: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 11887: } else {
! 11888: zend_free_op free_res;
! 11889:
! 11890: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 11891: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 11892: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 11893: }
! 11894: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 11895: FREE_OP_VAR_PTR(free_res);
! 11896: }
! 11897: ZEND_VM_NEXT_OPCODE();
! 11898: }
! 11899:
! 11900: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
! 11901: {
! 11902: zend_op *opline = EX(opline);
! 11903: zend_free_op free_op1;
! 11904: zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11905: zend_free_op free_op2;
! 11906: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11907:
! 11908: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 11909: if (type != BP_VAR_IS) {
! 11910: zend_error(E_NOTICE, "Trying to get property of non-object");
! 11911: }
! 11912: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 11913: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 11914: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 11915: }
! 11916: zval_dtor(free_op2.var);
! 11917: } else {
! 11918: zval *retval;
! 11919:
! 11920: if (1) {
! 11921: MAKE_REAL_ZVAL_PTR(offset);
! 11922: }
! 11923:
! 11924: /* here we are sure we are dealing with an object */
! 11925: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 11926:
! 11927: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 11928: if (Z_REFCOUNT_P(retval) == 0) {
! 11929: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 11930: zval_dtor(retval);
! 11931: FREE_ZVAL(retval);
! 11932: }
! 11933: } else {
! 11934: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 11935: PZVAL_LOCK(retval);
! 11936: }
! 11937:
! 11938: if (1) {
! 11939: zval_ptr_dtor(&offset);
! 11940: } else {
! 11941: zval_dtor(free_op2.var);
! 11942: }
! 11943: }
! 11944:
! 11945: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11946: ZEND_VM_NEXT_OPCODE();
! 11947: }
! 11948:
! 11949: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11950: {
! 11951: return zend_fetch_property_address_read_helper_SPEC_VAR_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 11952: }
! 11953:
! 11954: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 11955: {
! 11956: zend_op *opline = EX(opline);
! 11957: zend_free_op free_op1, free_op2;
! 11958: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 11959: zval **container;
! 11960:
! 11961: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 11962: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 11963: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 11964: }
! 11965:
! 11966: if (1) {
! 11967: MAKE_REAL_ZVAL_PTR(property);
! 11968: }
! 11969: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 11970: if (IS_VAR == IS_VAR && !container) {
! 11971: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 11972: }
! 11973: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 11974: if (1) {
! 11975: zval_ptr_dtor(&property);
! 11976: } else {
! 11977: zval_dtor(free_op2.var);
! 11978: }
! 11979: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 11980: READY_TO_DESTROY(free_op1.var)) {
! 11981: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 11982: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 11983: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 11984: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 11985: }
! 11986: }
! 11987: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 11988:
! 11989: /* We are going to assign the result by reference */
! 11990: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 11991: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 11992: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 11993: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 11994: }
! 11995:
! 11996: ZEND_VM_NEXT_OPCODE();
! 11997: }
! 11998:
! 11999: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12000: {
! 12001: zend_op *opline = EX(opline);
! 12002: zend_free_op free_op1, free_op2;
! 12003: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12004: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12005:
! 12006: if (1) {
! 12007: MAKE_REAL_ZVAL_PTR(property);
! 12008: }
! 12009: if (IS_VAR == IS_VAR && !container) {
! 12010: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 12011: }
! 12012: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 12013: if (1) {
! 12014: zval_ptr_dtor(&property);
! 12015: } else {
! 12016: zval_dtor(free_op2.var);
! 12017: }
! 12018: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 12019: READY_TO_DESTROY(free_op1.var)) {
! 12020: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 12021: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 12022: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 12023: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 12024: }
! 12025: }
! 12026: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12027: ZEND_VM_NEXT_OPCODE();
! 12028: }
! 12029:
! 12030: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12031: {
! 12032: return zend_fetch_property_address_read_helper_SPEC_VAR_TMP(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 12033: }
! 12034:
! 12035: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12036: {
! 12037: zend_op *opline = EX(opline);
! 12038:
! 12039: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 12040: /* Behave like FETCH_OBJ_W */
! 12041: zend_free_op free_op1, free_op2;
! 12042: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12043: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12044:
! 12045: if (1) {
! 12046: MAKE_REAL_ZVAL_PTR(property);
! 12047: }
! 12048: if (IS_VAR == IS_VAR && !container) {
! 12049: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 12050: }
! 12051: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 12052: if (1) {
! 12053: zval_ptr_dtor(&property);
! 12054: } else {
! 12055: zval_dtor(free_op2.var);
! 12056: }
! 12057: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 12058: READY_TO_DESTROY(free_op1.var)) {
! 12059: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 12060: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 12061: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 12062: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 12063: }
! 12064: }
! 12065: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12066: ZEND_VM_NEXT_OPCODE();
! 12067: } else {
! 12068: return zend_fetch_property_address_read_helper_SPEC_VAR_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 12069: }
! 12070: }
! 12071:
! 12072: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12073: {
! 12074: zend_op *opline = EX(opline);
! 12075: zend_free_op free_op1, free_op2, free_res;
! 12076: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12077: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12078:
! 12079: if (IS_VAR == IS_CV) {
! 12080: if (container != &EG(uninitialized_zval_ptr)) {
! 12081: SEPARATE_ZVAL_IF_NOT_REF(container);
! 12082: }
! 12083: }
! 12084: if (1) {
! 12085: MAKE_REAL_ZVAL_PTR(property);
! 12086: }
! 12087: if (IS_VAR == IS_VAR && !container) {
! 12088: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 12089: }
! 12090: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 12091: if (1) {
! 12092: zval_ptr_dtor(&property);
! 12093: } else {
! 12094: zval_dtor(free_op2.var);
! 12095: }
! 12096: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 12097: READY_TO_DESTROY(free_op1.var)) {
! 12098: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 12099: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 12100: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 12101: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 12102: }
! 12103: }
! 12104: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12105:
! 12106: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 12107: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 12108: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 12109: }
! 12110: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 12111: FREE_OP_VAR_PTR(free_res);
! 12112: ZEND_VM_NEXT_OPCODE();
! 12113: }
! 12114:
! 12115: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12116: {
! 12117: zend_op *opline = EX(opline);
! 12118: zend_op *op_data = opline+1;
! 12119: zend_free_op free_op1, free_op2;
! 12120: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12121: zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12122:
! 12123: if (1) {
! 12124: MAKE_REAL_ZVAL_PTR(property_name);
! 12125: }
! 12126: if (IS_VAR == IS_VAR && !object_ptr) {
! 12127: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 12128: }
! 12129: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 12130: if (1) {
! 12131: zval_ptr_dtor(&property_name);
! 12132: } else {
! 12133: zval_dtor(free_op2.var);
! 12134: }
! 12135: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12136: /* assign_obj has two opcodes! */
! 12137: ZEND_VM_INC_OPCODE();
! 12138: ZEND_VM_NEXT_OPCODE();
! 12139: }
! 12140:
! 12141: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12142: {
! 12143: zend_op *opline = EX(opline);
! 12144: zend_op *op_data = opline+1;
! 12145: zend_free_op free_op1;
! 12146: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12147:
! 12148: if (IS_VAR == IS_VAR && !object_ptr) {
! 12149: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 12150: }
! 12151: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 12152: zend_free_op free_op2;
! 12153: zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12154:
! 12155: if (1) {
! 12156: MAKE_REAL_ZVAL_PTR(property_name);
! 12157: }
! 12158: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 12159: if (1) {
! 12160: zval_ptr_dtor(&property_name);
! 12161: } else {
! 12162: zval_dtor(free_op2.var);
! 12163: }
! 12164: } else {
! 12165: zend_free_op free_op2, free_op_data1, free_op_data2;
! 12166: zval *value;
! 12167: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12168: zval **variable_ptr_ptr;
! 12169:
! 12170: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
! 12171: zval_dtor(free_op2.var);
! 12172:
! 12173: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 12174: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 12175: if (!variable_ptr_ptr) {
! 12176: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 12177: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12178: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 12179: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 12180: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 12181: 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);
! 12182: }
! 12183: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12184: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 12185: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 12186: }
! 12187: } else {
! 12188: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 12189: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12190: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 12191: PZVAL_LOCK(value);
! 12192: }
! 12193: }
! 12194: FREE_OP_VAR_PTR(free_op_data2);
! 12195: FREE_OP_IF_VAR(free_op_data1);
! 12196: }
! 12197: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12198: /* assign_dim has two opcodes! */
! 12199: ZEND_VM_INC_OPCODE();
! 12200: ZEND_VM_NEXT_OPCODE();
! 12201: }
! 12202:
! 12203: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12204: {
! 12205: zend_op *opline = EX(opline);
! 12206: zend_free_op free_op1, free_op2;
! 12207: zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12208: zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12209:
! 12210: if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
! 12211: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
! 12212: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12213: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 12214: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 12215: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 12216: 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);
! 12217: }
! 12218: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12219: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 12220: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 12221: }
! 12222: } else {
! 12223: value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
! 12224: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 12225: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 12226: PZVAL_LOCK(value);
! 12227: }
! 12228: }
! 12229:
! 12230: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12231:
! 12232: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 12233:
! 12234: ZEND_VM_NEXT_OPCODE();
! 12235: }
! 12236:
! 12237: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12238: {
! 12239: zend_op *opline = EX(opline);
! 12240: zval *function_name;
! 12241: char *function_name_strval;
! 12242: int function_name_strlen;
! 12243: zend_free_op free_op1, free_op2;
! 12244:
! 12245: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 12246:
! 12247: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12248:
! 12249: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 12250: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 12251: }
! 12252:
! 12253: function_name_strval = Z_STRVAL_P(function_name);
! 12254: function_name_strlen = Z_STRLEN_P(function_name);
! 12255:
! 12256: EX(object) = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12257:
! 12258: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 12259: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 12260: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 12261: }
! 12262:
! 12263: /* First, locate the function. */
! 12264: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 12265: if (!EX(fbc)) {
! 12266: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 12267: }
! 12268:
! 12269: EX(called_scope) = Z_OBJCE_P(EX(object));
! 12270: } else {
! 12271: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 12272: }
! 12273:
! 12274: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 12275: EX(object) = NULL;
! 12276: } else {
! 12277: if (!PZVAL_IS_REF(EX(object))) {
! 12278: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 12279: } else {
! 12280: zval *this_ptr;
! 12281: ALLOC_ZVAL(this_ptr);
! 12282: INIT_PZVAL_COPY(this_ptr, EX(object));
! 12283: zval_copy_ctor(this_ptr);
! 12284: EX(object) = this_ptr;
! 12285: }
! 12286: }
! 12287:
! 12288: zval_dtor(free_op2.var);
! 12289: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12290:
! 12291: ZEND_VM_NEXT_OPCODE();
! 12292: }
! 12293:
! 12294: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12295: {
! 12296: zend_op *opline = EX(opline);
! 12297: zval *function_name;
! 12298: zend_class_entry *ce;
! 12299:
! 12300: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 12301:
! 12302: if (IS_VAR == IS_CONST) {
! 12303: /* no function found. try a static method in class */
! 12304: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 12305: if (!ce) {
! 12306: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 12307: }
! 12308: EX(called_scope) = ce;
! 12309: } else {
! 12310: ce = EX_T(opline->op1.u.var).class_entry;
! 12311:
! 12312: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 12313: EX(called_scope) = EG(called_scope);
! 12314: } else {
! 12315: EX(called_scope) = ce;
! 12316: }
! 12317: }
! 12318: if(IS_TMP_VAR != IS_UNUSED) {
! 12319: char *function_name_strval = NULL;
! 12320: int function_name_strlen = 0;
! 12321: zend_free_op free_op2;
! 12322:
! 12323: if (IS_TMP_VAR == IS_CONST) {
! 12324: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 12325: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 12326: } else {
! 12327: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12328:
! 12329: if (Z_TYPE_P(function_name) != IS_STRING) {
! 12330: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 12331: } else {
! 12332: function_name_strval = Z_STRVAL_P(function_name);
! 12333: function_name_strlen = Z_STRLEN_P(function_name);
! 12334: }
! 12335: }
! 12336:
! 12337: if (function_name_strval) {
! 12338: if (ce->get_static_method) {
! 12339: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 12340: } else {
! 12341: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 12342: }
! 12343: if (!EX(fbc)) {
! 12344: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 12345: }
! 12346: }
! 12347:
! 12348: if (IS_TMP_VAR != IS_CONST) {
! 12349: zval_dtor(free_op2.var);
! 12350: }
! 12351: } else {
! 12352: if(!ce->constructor) {
! 12353: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 12354: }
! 12355: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 12356: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 12357: }
! 12358: EX(fbc) = ce->constructor;
! 12359: }
! 12360:
! 12361: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 12362: EX(object) = NULL;
! 12363: } else {
! 12364: if (EG(This) &&
! 12365: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 12366: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 12367: /* We are calling method of the other (incompatible) class,
! 12368: but passing $this. This is done for compatibility with php-4. */
! 12369: int severity;
! 12370: char *verb;
! 12371: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 12372: severity = E_STRICT;
! 12373: verb = "should not";
! 12374: } else {
! 12375: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 12376: severity = E_ERROR;
! 12377: verb = "cannot";
! 12378: }
! 12379: 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);
! 12380:
! 12381: }
! 12382: if ((EX(object) = EG(This))) {
! 12383: Z_ADDREF_P(EX(object));
! 12384: EX(called_scope) = Z_OBJCE_P(EX(object));
! 12385: }
! 12386: }
! 12387:
! 12388: ZEND_VM_NEXT_OPCODE();
! 12389: }
! 12390:
! 12391: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12392: {
! 12393: zend_op *opline = EX(opline);
! 12394: int switch_expr_is_overloaded=0;
! 12395: zend_free_op free_op1, free_op2;
! 12396:
! 12397: if (IS_VAR==IS_VAR) {
! 12398: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 12399: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 12400: } else {
! 12401: switch_expr_is_overloaded = 1;
! 12402: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 12403: }
! 12404: }
! 12405: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 12406: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12407: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12408:
! 12409: zval_dtor(free_op2.var);
! 12410: if (switch_expr_is_overloaded) {
! 12411: /* We only free op1 if this is a string offset,
! 12412: * Since if it is a TMP_VAR, it'll be reused by
! 12413: * other CASE opcodes (whereas string offsets
! 12414: * are allocated at each get_zval_ptr())
! 12415: */
! 12416: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12417: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 12418: EX_T(opline->op1.u.var).var.ptr = NULL;
! 12419: }
! 12420: ZEND_VM_NEXT_OPCODE();
! 12421: }
! 12422:
! 12423: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12424: {
! 12425: zend_op *opline = EX(opline);
! 12426: zend_free_op free_op1, free_op2;
! 12427: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 12428: zval *expr_ptr;
! 12429: zval *offset=_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12430:
! 12431: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 12432: zval **expr_ptr_ptr = NULL;
! 12433:
! 12434: if (opline->extended_value) {
! 12435: expr_ptr_ptr=_get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12436: expr_ptr = *expr_ptr_ptr;
! 12437: } else {
! 12438: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12439: }
! 12440: #else
! 12441: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12442: #endif
! 12443:
! 12444: if (0) { /* temporary variable */
! 12445: zval *new_expr;
! 12446:
! 12447: ALLOC_ZVAL(new_expr);
! 12448: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 12449: expr_ptr = new_expr;
! 12450: } else {
! 12451: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 12452: if (opline->extended_value) {
! 12453: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 12454: expr_ptr = *expr_ptr_ptr;
! 12455: Z_ADDREF_P(expr_ptr);
! 12456: } else
! 12457: #endif
! 12458: if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 12459: zval *new_expr;
! 12460:
! 12461: ALLOC_ZVAL(new_expr);
! 12462: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 12463: expr_ptr = new_expr;
! 12464: zendi_zval_copy_ctor(*expr_ptr);
! 12465: } else {
! 12466: Z_ADDREF_P(expr_ptr);
! 12467: }
! 12468: }
! 12469: if (offset) {
! 12470: switch (Z_TYPE_P(offset)) {
! 12471: case IS_DOUBLE:
! 12472: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 12473: break;
! 12474: case IS_LONG:
! 12475: case IS_BOOL:
! 12476: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 12477: break;
! 12478: case IS_STRING:
! 12479: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 12480: break;
! 12481: case IS_NULL:
! 12482: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 12483: break;
! 12484: default:
! 12485: zend_error(E_WARNING, "Illegal offset type");
! 12486: zval_ptr_dtor(&expr_ptr);
! 12487: /* do nothing */
! 12488: break;
! 12489: }
! 12490: zval_dtor(free_op2.var);
! 12491: } else {
! 12492: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 12493: }
! 12494: if (opline->extended_value) {
! 12495: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12496: } else {
! 12497: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12498: }
! 12499: ZEND_VM_NEXT_OPCODE();
! 12500: }
! 12501:
! 12502: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12503: {
! 12504: zend_op *opline = EX(opline);
! 12505:
! 12506: array_init(&EX_T(opline->result.u.var).tmp_var);
! 12507: if (IS_VAR == IS_UNUSED) {
! 12508: ZEND_VM_NEXT_OPCODE();
! 12509: #if 0 || IS_VAR != IS_UNUSED
! 12510: } else {
! 12511: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 12512: #endif
! 12513: }
! 12514: }
! 12515:
! 12516: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12517: {
! 12518: zend_op *opline = EX(opline);
! 12519: zend_free_op free_op1, free_op2;
! 12520: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12521: zval *offset;
! 12522:
! 12523: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 12524: SEPARATE_ZVAL_IF_NOT_REF(container);
! 12525: }
! 12526: offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12527:
! 12528: if (IS_VAR != IS_VAR || container) {
! 12529: switch (Z_TYPE_PP(container)) {
! 12530: case IS_ARRAY: {
! 12531: HashTable *ht = Z_ARRVAL_PP(container);
! 12532:
! 12533: switch (Z_TYPE_P(offset)) {
! 12534: case IS_DOUBLE:
! 12535: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 12536: break;
! 12537: case IS_RESOURCE:
! 12538: case IS_BOOL:
! 12539: case IS_LONG:
! 12540: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 12541: break;
! 12542: case IS_STRING:
! 12543: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 12544: Z_ADDREF_P(offset);
! 12545: }
! 12546: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 12547: ht == &EG(symbol_table)) {
! 12548: zend_execute_data *ex;
! 12549: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 12550:
! 12551: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 12552: if (ex->op_array && ex->symbol_table == ht) {
! 12553: int i;
! 12554:
! 12555: for (i = 0; i < ex->op_array->last_var; i++) {
! 12556: if (ex->op_array->vars[i].hash_value == hash_value &&
! 12557: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 12558: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 12559: ex->CVs[i] = NULL;
! 12560: break;
! 12561: }
! 12562: }
! 12563: }
! 12564: }
! 12565: }
! 12566: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 12567: zval_ptr_dtor(&offset);
! 12568: }
! 12569: break;
! 12570: case IS_NULL:
! 12571: zend_hash_del(ht, "", sizeof(""));
! 12572: break;
! 12573: default:
! 12574: zend_error(E_WARNING, "Illegal offset type in unset");
! 12575: break;
! 12576: }
! 12577: zval_dtor(free_op2.var);
! 12578: break;
! 12579: }
! 12580: case IS_OBJECT:
! 12581: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 12582: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 12583: }
! 12584: if (1) {
! 12585: MAKE_REAL_ZVAL_PTR(offset);
! 12586: }
! 12587: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 12588: if (1) {
! 12589: zval_ptr_dtor(&offset);
! 12590: } else {
! 12591: zval_dtor(free_op2.var);
! 12592: }
! 12593: break;
! 12594: case IS_STRING:
! 12595: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 12596: ZEND_VM_CONTINUE(); /* bailed out before */
! 12597: default:
! 12598: zval_dtor(free_op2.var);
! 12599: break;
! 12600: }
! 12601: } else {
! 12602: zval_dtor(free_op2.var);
! 12603: }
! 12604: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12605:
! 12606: ZEND_VM_NEXT_OPCODE();
! 12607: }
! 12608:
! 12609: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12610: {
! 12611: zend_op *opline = EX(opline);
! 12612: zend_free_op free_op1, free_op2;
! 12613: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12614: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12615:
! 12616: if (IS_VAR != IS_VAR || container) {
! 12617: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 12618: SEPARATE_ZVAL_IF_NOT_REF(container);
! 12619: }
! 12620: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 12621: if (1) {
! 12622: MAKE_REAL_ZVAL_PTR(offset);
! 12623: }
! 12624: if (Z_OBJ_HT_P(*container)->unset_property) {
! 12625: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 12626: } else {
! 12627: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 12628: }
! 12629: if (1) {
! 12630: zval_ptr_dtor(&offset);
! 12631: } else {
! 12632: zval_dtor(free_op2.var);
! 12633: }
! 12634: } else {
! 12635: zval_dtor(free_op2.var);
! 12636: }
! 12637: } else {
! 12638: zval_dtor(free_op2.var);
! 12639: }
! 12640: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12641:
! 12642: ZEND_VM_NEXT_OPCODE();
! 12643: }
! 12644:
! 12645: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 12646: {
! 12647: zend_op *opline = EX(opline);
! 12648: zend_free_op free_op1;
! 12649: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 12650: zval **value = NULL;
! 12651: int result = 0;
! 12652:
! 12653: if (IS_VAR != IS_VAR || container) {
! 12654: zend_free_op free_op2;
! 12655: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 12656:
! 12657: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 12658: HashTable *ht;
! 12659: int isset = 0;
! 12660:
! 12661: ht = Z_ARRVAL_PP(container);
! 12662:
! 12663: switch (Z_TYPE_P(offset)) {
! 12664: case IS_DOUBLE:
! 12665: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 12666: isset = 1;
! 12667: }
! 12668: break;
! 12669: case IS_RESOURCE:
! 12670: case IS_BOOL:
! 12671: case IS_LONG:
! 12672: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 12673: isset = 1;
! 12674: }
! 12675: break;
! 12676: case IS_STRING:
! 12677: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 12678: isset = 1;
! 12679: }
! 12680: break;
! 12681: case IS_NULL:
! 12682: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 12683: isset = 1;
! 12684: }
! 12685: break;
! 12686: default:
! 12687: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 12688:
! 12689: break;
! 12690: }
! 12691:
! 12692: switch (opline->extended_value) {
! 12693: case ZEND_ISSET:
! 12694: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 12695: result = 0;
! 12696: } else {
! 12697: result = isset;
! 12698: }
! 12699: break;
! 12700: case ZEND_ISEMPTY:
! 12701: if (!isset || !i_zend_is_true(*value)) {
! 12702: result = 0;
! 12703: } else {
! 12704: result = 1;
! 12705: }
! 12706: break;
! 12707: }
! 12708: zval_dtor(free_op2.var);
! 12709: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 12710: if (1) {
! 12711: MAKE_REAL_ZVAL_PTR(offset);
! 12712: }
! 12713: if (prop_dim) {
! 12714: if (Z_OBJ_HT_P(*container)->has_property) {
! 12715: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 12716: } else {
! 12717: zend_error(E_NOTICE, "Trying to check property of non-object");
! 12718: result = 0;
! 12719: }
! 12720: } else {
! 12721: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 12722: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 12723: } else {
! 12724: zend_error(E_NOTICE, "Trying to check element of non-array");
! 12725: result = 0;
! 12726: }
! 12727: }
! 12728: if (1) {
! 12729: zval_ptr_dtor(&offset);
! 12730: } else {
! 12731: zval_dtor(free_op2.var);
! 12732: }
! 12733: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 12734: zval tmp;
! 12735:
! 12736: if (Z_TYPE_P(offset) != IS_LONG) {
! 12737: tmp = *offset;
! 12738: zval_copy_ctor(&tmp);
! 12739: convert_to_long(&tmp);
! 12740: offset = &tmp;
! 12741: }
! 12742: if (Z_TYPE_P(offset) == IS_LONG) {
! 12743: switch (opline->extended_value) {
! 12744: case ZEND_ISSET:
! 12745: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 12746: result = 1;
! 12747: }
! 12748: break;
! 12749: case ZEND_ISEMPTY:
! 12750: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 12751: result = 1;
! 12752: }
! 12753: break;
! 12754: }
! 12755: }
! 12756: zval_dtor(free_op2.var);
! 12757: } else {
! 12758: zval_dtor(free_op2.var);
! 12759: }
! 12760: }
! 12761:
! 12762: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 12763:
! 12764: switch (opline->extended_value) {
! 12765: case ZEND_ISSET:
! 12766: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 12767: break;
! 12768: case ZEND_ISEMPTY:
! 12769: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 12770: break;
! 12771: }
! 12772:
! 12773: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12774:
! 12775: ZEND_VM_NEXT_OPCODE();
! 12776: }
! 12777:
! 12778: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12779: {
! 12780: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 12781: }
! 12782:
! 12783: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12784: {
! 12785: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 12786: }
! 12787:
! 12788: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12789: {
! 12790: zend_op *opline = EX(opline);
! 12791: zend_free_op free_op1, free_op2;
! 12792:
! 12793: add_function(&EX_T(opline->result.u.var).tmp_var,
! 12794: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12795: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12796: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12797: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12798: ZEND_VM_NEXT_OPCODE();
! 12799: }
! 12800:
! 12801: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12802: {
! 12803: zend_op *opline = EX(opline);
! 12804: zend_free_op free_op1, free_op2;
! 12805:
! 12806: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 12807: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12808: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12809: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12810: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12811: ZEND_VM_NEXT_OPCODE();
! 12812: }
! 12813:
! 12814: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12815: {
! 12816: zend_op *opline = EX(opline);
! 12817: zend_free_op free_op1, free_op2;
! 12818:
! 12819: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 12820: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12821: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12822: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12823: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12824: ZEND_VM_NEXT_OPCODE();
! 12825: }
! 12826:
! 12827: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12828: {
! 12829: zend_op *opline = EX(opline);
! 12830: zend_free_op free_op1, free_op2;
! 12831:
! 12832: div_function(&EX_T(opline->result.u.var).tmp_var,
! 12833: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12834: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12835: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12836: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12837: ZEND_VM_NEXT_OPCODE();
! 12838: }
! 12839:
! 12840: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12841: {
! 12842: zend_op *opline = EX(opline);
! 12843: zend_free_op free_op1, free_op2;
! 12844:
! 12845: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 12846: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12847: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12848: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12849: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12850: ZEND_VM_NEXT_OPCODE();
! 12851: }
! 12852:
! 12853: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12854: {
! 12855: zend_op *opline = EX(opline);
! 12856: zend_free_op free_op1, free_op2;
! 12857:
! 12858: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 12859: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12860: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12861: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12862: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12863: ZEND_VM_NEXT_OPCODE();
! 12864: }
! 12865:
! 12866: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12867: {
! 12868: zend_op *opline = EX(opline);
! 12869: zend_free_op free_op1, free_op2;
! 12870:
! 12871: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 12872: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12873: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12874: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12875: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12876: ZEND_VM_NEXT_OPCODE();
! 12877: }
! 12878:
! 12879: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12880: {
! 12881: zend_op *opline = EX(opline);
! 12882: zend_free_op free_op1, free_op2;
! 12883:
! 12884: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 12885: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12886: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12887: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12888: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12889: ZEND_VM_NEXT_OPCODE();
! 12890: }
! 12891:
! 12892: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12893: {
! 12894: zend_op *opline = EX(opline);
! 12895: zend_free_op free_op1, free_op2;
! 12896:
! 12897: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 12898: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12899: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12900: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12901: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12902: ZEND_VM_NEXT_OPCODE();
! 12903: }
! 12904:
! 12905: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12906: {
! 12907: zend_op *opline = EX(opline);
! 12908: zend_free_op free_op1, free_op2;
! 12909: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 12910:
! 12911: is_identical_function(result,
! 12912: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12913: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12914: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 12915: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12916: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12917: ZEND_VM_NEXT_OPCODE();
! 12918: }
! 12919:
! 12920: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12921: {
! 12922: zend_op *opline = EX(opline);
! 12923: zend_free_op free_op1, free_op2;
! 12924: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 12925:
! 12926: compare_function(result,
! 12927: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12928: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12929: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 12930: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12931: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12932: ZEND_VM_NEXT_OPCODE();
! 12933: }
! 12934:
! 12935: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12936: {
! 12937: zend_op *opline = EX(opline);
! 12938: zend_free_op free_op1, free_op2;
! 12939: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 12940:
! 12941: compare_function(result,
! 12942: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12943: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12944: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 12945: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12946: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12947: ZEND_VM_NEXT_OPCODE();
! 12948: }
! 12949:
! 12950: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12951: {
! 12952: zend_op *opline = EX(opline);
! 12953: zend_free_op free_op1, free_op2;
! 12954: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 12955:
! 12956: compare_function(result,
! 12957: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12958: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12959: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 12960: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12961: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12962: ZEND_VM_NEXT_OPCODE();
! 12963: }
! 12964:
! 12965: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12966: {
! 12967: zend_op *opline = EX(opline);
! 12968: zend_free_op free_op1, free_op2;
! 12969: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 12970:
! 12971: compare_function(result,
! 12972: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12973: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12974: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 12975: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12976: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12977: ZEND_VM_NEXT_OPCODE();
! 12978: }
! 12979:
! 12980: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12981: {
! 12982: zend_op *opline = EX(opline);
! 12983: zend_free_op free_op1, free_op2;
! 12984:
! 12985: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 12986: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 12987: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 12988: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12989: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 12990: ZEND_VM_NEXT_OPCODE();
! 12991: }
! 12992:
! 12993: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 12994: {
! 12995: zend_op *opline = EX(opline);
! 12996: zend_free_op free_op1, free_op2;
! 12997:
! 12998: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 12999: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 13000: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 13001: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13002: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13003: ZEND_VM_NEXT_OPCODE();
! 13004: }
! 13005:
! 13006: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13007: {
! 13008: zend_op *opline = EX(opline);
! 13009: zend_free_op free_op1, free_op2;
! 13010:
! 13011: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 13012: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 13013: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 13014: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13015: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13016: ZEND_VM_NEXT_OPCODE();
! 13017: }
! 13018:
! 13019: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13020: {
! 13021: zend_op *opline = EX(opline);
! 13022: zend_free_op free_op1, free_op2;
! 13023:
! 13024: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 13025: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 13026: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 13027: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13028: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13029: ZEND_VM_NEXT_OPCODE();
! 13030: }
! 13031:
! 13032: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 13033: {
! 13034: zend_op *opline = EX(opline);
! 13035: zend_op *op_data = opline+1;
! 13036: zend_free_op free_op1, free_op2, free_op_data1;
! 13037: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13038: zval *object;
! 13039: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13040: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 13041: znode *result = &opline->result;
! 13042: int have_get_ptr = 0;
! 13043:
! 13044: if (IS_VAR == IS_VAR && !object_ptr) {
! 13045: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 13046: }
! 13047:
! 13048: EX_T(result->u.var).var.ptr_ptr = NULL;
! 13049: make_real_object(object_ptr TSRMLS_CC);
! 13050: object = *object_ptr;
! 13051:
! 13052: if (Z_TYPE_P(object) != IS_OBJECT) {
! 13053: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 13054: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13055: FREE_OP(free_op_data1);
! 13056:
! 13057: if (!RETURN_VALUE_UNUSED(result)) {
! 13058: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 13059: EX_T(result->u.var).var.ptr_ptr = NULL;
! 13060: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13061: }
! 13062: } else {
! 13063: /* here we are sure we are dealing with an object */
! 13064: if (0) {
! 13065: MAKE_REAL_ZVAL_PTR(property);
! 13066: }
! 13067:
! 13068: /* here property is a string */
! 13069: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 13070: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 13071: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 13072: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 13073: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 13074:
! 13075: have_get_ptr = 1;
! 13076: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 13077: if (!RETURN_VALUE_UNUSED(result)) {
! 13078: EX_T(result->u.var).var.ptr = *zptr;
! 13079: EX_T(result->u.var).var.ptr_ptr = NULL;
! 13080: PZVAL_LOCK(*zptr);
! 13081: }
! 13082: }
! 13083: }
! 13084:
! 13085: if (!have_get_ptr) {
! 13086: zval *z = NULL;
! 13087:
! 13088: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 13089: if (Z_OBJ_HT_P(object)->read_property) {
! 13090: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 13091: }
! 13092: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 13093: if (Z_OBJ_HT_P(object)->read_dimension) {
! 13094: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 13095: }
! 13096: }
! 13097: if (z) {
! 13098: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 13099: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 13100:
! 13101: if (Z_REFCOUNT_P(z) == 0) {
! 13102: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 13103: zval_dtor(z);
! 13104: FREE_ZVAL(z);
! 13105: }
! 13106: z = value;
! 13107: }
! 13108: Z_ADDREF_P(z);
! 13109: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 13110: binary_op(z, z, value TSRMLS_CC);
! 13111: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 13112: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 13113: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 13114: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 13115: }
! 13116: if (!RETURN_VALUE_UNUSED(result)) {
! 13117: EX_T(result->u.var).var.ptr = z;
! 13118: EX_T(result->u.var).var.ptr_ptr = NULL;
! 13119: PZVAL_LOCK(z);
! 13120: }
! 13121: zval_ptr_dtor(&z);
! 13122: } else {
! 13123: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 13124: if (!RETURN_VALUE_UNUSED(result)) {
! 13125: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 13126: EX_T(result->u.var).var.ptr_ptr = NULL;
! 13127: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13128: }
! 13129: }
! 13130: }
! 13131:
! 13132: if (0) {
! 13133: zval_ptr_dtor(&property);
! 13134: } else {
! 13135: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13136: }
! 13137: FREE_OP(free_op_data1);
! 13138: }
! 13139:
! 13140: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13141: /* assign_obj has two opcodes! */
! 13142: ZEND_VM_INC_OPCODE();
! 13143: ZEND_VM_NEXT_OPCODE();
! 13144: }
! 13145:
! 13146: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 13147: {
! 13148: zend_op *opline = EX(opline);
! 13149: zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
! 13150: zval **var_ptr;
! 13151: zval *value;
! 13152:
! 13153: switch (opline->extended_value) {
! 13154: case ZEND_ASSIGN_OBJ:
! 13155: return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13156: break;
! 13157: case ZEND_ASSIGN_DIM: {
! 13158: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13159:
! 13160: if (IS_VAR == IS_VAR && !container) {
! 13161: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13162: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 13163: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 13164: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 13165: }
! 13166: return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13167: } else {
! 13168: zend_op *op_data = opline+1;
! 13169: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13170:
! 13171: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 13172: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 13173: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 13174: ZEND_VM_INC_OPCODE();
! 13175: }
! 13176: }
! 13177: break;
! 13178: default:
! 13179: value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13180: var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13181: /* do nothing */
! 13182: break;
! 13183: }
! 13184:
! 13185: if (!var_ptr) {
! 13186: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 13187: }
! 13188:
! 13189: if (*var_ptr == EG(error_zval_ptr)) {
! 13190: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13191: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 13192: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13193: }
! 13194: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13195: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13196: ZEND_VM_NEXT_OPCODE();
! 13197: }
! 13198:
! 13199: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 13200:
! 13201: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 13202: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 13203: /* proxy object */
! 13204: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 13205: Z_ADDREF_P(objval);
! 13206: binary_op(objval, objval, value TSRMLS_CC);
! 13207: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 13208: zval_ptr_dtor(&objval);
! 13209: } else {
! 13210: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 13211: }
! 13212:
! 13213: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13214: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 13215: PZVAL_LOCK(*var_ptr);
! 13216: }
! 13217: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13218:
! 13219: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 13220: FREE_OP(free_op_data1);
! 13221: FREE_OP_VAR_PTR(free_op_data2);
! 13222: }
! 13223: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13224: ZEND_VM_NEXT_OPCODE();
! 13225: }
! 13226:
! 13227: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13228: {
! 13229: return zend_binary_assign_op_helper_SPEC_VAR_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13230: }
! 13231:
! 13232: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13233: {
! 13234: return zend_binary_assign_op_helper_SPEC_VAR_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13235: }
! 13236:
! 13237: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13238: {
! 13239: return zend_binary_assign_op_helper_SPEC_VAR_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13240: }
! 13241:
! 13242: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13243: {
! 13244: return zend_binary_assign_op_helper_SPEC_VAR_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13245: }
! 13246:
! 13247: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13248: {
! 13249: return zend_binary_assign_op_helper_SPEC_VAR_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13250: }
! 13251:
! 13252: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13253: {
! 13254: return zend_binary_assign_op_helper_SPEC_VAR_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13255: }
! 13256:
! 13257: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13258: {
! 13259: return zend_binary_assign_op_helper_SPEC_VAR_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13260: }
! 13261:
! 13262: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13263: {
! 13264: return zend_binary_assign_op_helper_SPEC_VAR_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13265: }
! 13266:
! 13267: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13268: {
! 13269: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13270: }
! 13271:
! 13272: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13273: {
! 13274: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13275: }
! 13276:
! 13277: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13278: {
! 13279: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13280: }
! 13281:
! 13282: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 13283: {
! 13284: zend_op *opline = EX(opline);
! 13285: zend_free_op free_op1, free_op2;
! 13286: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13287: zval *object;
! 13288: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13289: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 13290: int have_get_ptr = 0;
! 13291:
! 13292: if (IS_VAR == IS_VAR && !object_ptr) {
! 13293: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 13294: }
! 13295:
! 13296: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 13297: object = *object_ptr;
! 13298:
! 13299: if (Z_TYPE_P(object) != IS_OBJECT) {
! 13300: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 13301: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13302: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13303: *retval = EG(uninitialized_zval_ptr);
! 13304: PZVAL_LOCK(*retval);
! 13305: }
! 13306: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13307: ZEND_VM_NEXT_OPCODE();
! 13308: }
! 13309:
! 13310: /* here we are sure we are dealing with an object */
! 13311:
! 13312: if (0) {
! 13313: MAKE_REAL_ZVAL_PTR(property);
! 13314: }
! 13315:
! 13316: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 13317: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 13318: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 13319: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 13320:
! 13321: have_get_ptr = 1;
! 13322: incdec_op(*zptr);
! 13323: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13324: *retval = *zptr;
! 13325: PZVAL_LOCK(*retval);
! 13326: }
! 13327: }
! 13328: }
! 13329:
! 13330: if (!have_get_ptr) {
! 13331: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 13332: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 13333:
! 13334: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 13335: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 13336:
! 13337: if (Z_REFCOUNT_P(z) == 0) {
! 13338: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 13339: zval_dtor(z);
! 13340: FREE_ZVAL(z);
! 13341: }
! 13342: z = value;
! 13343: }
! 13344: Z_ADDREF_P(z);
! 13345: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 13346: incdec_op(z);
! 13347: *retval = z;
! 13348: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 13349: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 13350: zval_ptr_dtor(&z);
! 13351: } else {
! 13352: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 13353: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13354: *retval = EG(uninitialized_zval_ptr);
! 13355: PZVAL_LOCK(*retval);
! 13356: }
! 13357: }
! 13358: }
! 13359:
! 13360: if (0) {
! 13361: zval_ptr_dtor(&property);
! 13362: } else {
! 13363: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13364: }
! 13365: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13366: ZEND_VM_NEXT_OPCODE();
! 13367: }
! 13368:
! 13369: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13370: {
! 13371: return zend_pre_incdec_property_helper_SPEC_VAR_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13372: }
! 13373:
! 13374: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13375: {
! 13376: return zend_pre_incdec_property_helper_SPEC_VAR_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13377: }
! 13378:
! 13379: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 13380: {
! 13381: zend_op *opline = EX(opline);
! 13382: zend_free_op free_op1, free_op2;
! 13383: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13384: zval *object;
! 13385: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13386: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 13387: int have_get_ptr = 0;
! 13388:
! 13389: if (IS_VAR == IS_VAR && !object_ptr) {
! 13390: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 13391: }
! 13392:
! 13393: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 13394: object = *object_ptr;
! 13395:
! 13396: if (Z_TYPE_P(object) != IS_OBJECT) {
! 13397: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 13398: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13399: *retval = *EG(uninitialized_zval_ptr);
! 13400: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13401: ZEND_VM_NEXT_OPCODE();
! 13402: }
! 13403:
! 13404: /* here we are sure we are dealing with an object */
! 13405:
! 13406: if (0) {
! 13407: MAKE_REAL_ZVAL_PTR(property);
! 13408: }
! 13409:
! 13410: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 13411: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 13412: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 13413: have_get_ptr = 1;
! 13414: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 13415:
! 13416: *retval = **zptr;
! 13417: zendi_zval_copy_ctor(*retval);
! 13418:
! 13419: incdec_op(*zptr);
! 13420:
! 13421: }
! 13422: }
! 13423:
! 13424: if (!have_get_ptr) {
! 13425: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 13426: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 13427: zval *z_copy;
! 13428:
! 13429: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 13430: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 13431:
! 13432: if (Z_REFCOUNT_P(z) == 0) {
! 13433: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 13434: zval_dtor(z);
! 13435: FREE_ZVAL(z);
! 13436: }
! 13437: z = value;
! 13438: }
! 13439: *retval = *z;
! 13440: zendi_zval_copy_ctor(*retval);
! 13441: ALLOC_ZVAL(z_copy);
! 13442: *z_copy = *z;
! 13443: zendi_zval_copy_ctor(*z_copy);
! 13444: INIT_PZVAL(z_copy);
! 13445: incdec_op(z_copy);
! 13446: Z_ADDREF_P(z);
! 13447: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 13448: zval_ptr_dtor(&z_copy);
! 13449: zval_ptr_dtor(&z);
! 13450: } else {
! 13451: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 13452: *retval = *EG(uninitialized_zval_ptr);
! 13453: }
! 13454: }
! 13455:
! 13456: if (0) {
! 13457: zval_ptr_dtor(&property);
! 13458: } else {
! 13459: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13460: }
! 13461: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13462: ZEND_VM_NEXT_OPCODE();
! 13463: }
! 13464:
! 13465: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13466: {
! 13467: return zend_post_incdec_property_helper_SPEC_VAR_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13468: }
! 13469:
! 13470: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13471: {
! 13472: return zend_post_incdec_property_helper_SPEC_VAR_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13473: }
! 13474:
! 13475: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13476: {
! 13477: zend_op *opline = EX(opline);
! 13478: zend_free_op free_op1, free_op2;
! 13479: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13480: zval **container;
! 13481:
! 13482: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 13483: IS_VAR != IS_CV &&
! 13484: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 13485: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 13486: }
! 13487: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13488: if (IS_VAR == IS_VAR && !container) {
! 13489: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13490: }
! 13491: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 13492: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13493: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13494: ZEND_VM_NEXT_OPCODE();
! 13495: }
! 13496:
! 13497: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13498: {
! 13499: zend_op *opline = EX(opline);
! 13500: zend_free_op free_op1, free_op2;
! 13501: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13502: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13503:
! 13504: if (IS_VAR == IS_VAR && !container) {
! 13505: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13506: }
! 13507: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 13508: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13509: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13510: READY_TO_DESTROY(free_op1.var)) {
! 13511: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13512: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13513: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13514: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13515: }
! 13516: }
! 13517: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13518:
! 13519: /* We are going to assign the result by reference */
! 13520: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 13521: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 13522: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 13523: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 13524: }
! 13525:
! 13526: ZEND_VM_NEXT_OPCODE();
! 13527: }
! 13528:
! 13529: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13530: {
! 13531: zend_op *opline = EX(opline);
! 13532: zend_free_op free_op1, free_op2;
! 13533: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13534: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13535:
! 13536: if (IS_VAR == IS_VAR && !container) {
! 13537: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13538: }
! 13539: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 13540: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13541: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13542: READY_TO_DESTROY(free_op1.var)) {
! 13543: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13544: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13545: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13546: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13547: }
! 13548: }
! 13549: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13550: ZEND_VM_NEXT_OPCODE();
! 13551: }
! 13552:
! 13553: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13554: {
! 13555: zend_op *opline = EX(opline);
! 13556: zend_free_op free_op1, free_op2;
! 13557: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13558: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13559:
! 13560: if (IS_VAR == IS_VAR && !container) {
! 13561: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13562: }
! 13563: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 13564: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13565: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13566: ZEND_VM_NEXT_OPCODE();
! 13567: }
! 13568:
! 13569: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13570: {
! 13571: zend_op *opline = EX(opline);
! 13572: zend_free_op free_op1, free_op2;
! 13573: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13574: zval **container;
! 13575:
! 13576: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 13577: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13578: if (IS_VAR == IS_VAR && !container) {
! 13579: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13580: }
! 13581: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 13582: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13583: READY_TO_DESTROY(free_op1.var)) {
! 13584: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13585: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13586: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13587: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13588: }
! 13589: }
! 13590: } else {
! 13591: if (IS_VAR == IS_UNUSED) {
! 13592: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 13593: }
! 13594: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13595: if (IS_VAR == IS_VAR && !container) {
! 13596: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13597: }
! 13598: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 13599: }
! 13600: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13601: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13602: ZEND_VM_NEXT_OPCODE();
! 13603: }
! 13604:
! 13605: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13606: {
! 13607: zend_op *opline = EX(opline);
! 13608: zend_free_op free_op1, free_op2;
! 13609: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13610: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13611:
! 13612: /* Not needed in DIM_UNSET
! 13613: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 13614: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 13615: }
! 13616: */
! 13617: if (IS_VAR == IS_CV) {
! 13618: if (container != &EG(uninitialized_zval_ptr)) {
! 13619: SEPARATE_ZVAL_IF_NOT_REF(container);
! 13620: }
! 13621: }
! 13622: if (IS_VAR == IS_VAR && !container) {
! 13623: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13624: }
! 13625: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 13626: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13627: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13628: READY_TO_DESTROY(free_op1.var)) {
! 13629: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13630: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13631: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13632: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13633: }
! 13634: }
! 13635: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13636: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 13637: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 13638: } else {
! 13639: zend_free_op free_res;
! 13640:
! 13641: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 13642: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 13643: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 13644: }
! 13645: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 13646: FREE_OP_VAR_PTR(free_res);
! 13647: }
! 13648: ZEND_VM_NEXT_OPCODE();
! 13649: }
! 13650:
! 13651: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
! 13652: {
! 13653: zend_op *opline = EX(opline);
! 13654: zend_free_op free_op1;
! 13655: zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13656: zend_free_op free_op2;
! 13657: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13658:
! 13659: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 13660: if (type != BP_VAR_IS) {
! 13661: zend_error(E_NOTICE, "Trying to get property of non-object");
! 13662: }
! 13663: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13664: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 13665: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13666: }
! 13667: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13668: } else {
! 13669: zval *retval;
! 13670:
! 13671: if (0) {
! 13672: MAKE_REAL_ZVAL_PTR(offset);
! 13673: }
! 13674:
! 13675: /* here we are sure we are dealing with an object */
! 13676: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 13677:
! 13678: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 13679: if (Z_REFCOUNT_P(retval) == 0) {
! 13680: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 13681: zval_dtor(retval);
! 13682: FREE_ZVAL(retval);
! 13683: }
! 13684: } else {
! 13685: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 13686: PZVAL_LOCK(retval);
! 13687: }
! 13688:
! 13689: if (0) {
! 13690: zval_ptr_dtor(&offset);
! 13691: } else {
! 13692: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13693: }
! 13694: }
! 13695:
! 13696: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13697: ZEND_VM_NEXT_OPCODE();
! 13698: }
! 13699:
! 13700: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13701: {
! 13702: return zend_fetch_property_address_read_helper_SPEC_VAR_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13703: }
! 13704:
! 13705: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13706: {
! 13707: zend_op *opline = EX(opline);
! 13708: zend_free_op free_op1, free_op2;
! 13709: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13710: zval **container;
! 13711:
! 13712: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 13713: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 13714: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 13715: }
! 13716:
! 13717: if (0) {
! 13718: MAKE_REAL_ZVAL_PTR(property);
! 13719: }
! 13720: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13721: if (IS_VAR == IS_VAR && !container) {
! 13722: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 13723: }
! 13724: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 13725: if (0) {
! 13726: zval_ptr_dtor(&property);
! 13727: } else {
! 13728: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13729: }
! 13730: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13731: READY_TO_DESTROY(free_op1.var)) {
! 13732: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13733: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13734: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13735: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13736: }
! 13737: }
! 13738: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13739:
! 13740: /* We are going to assign the result by reference */
! 13741: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 13742: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 13743: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 13744: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 13745: }
! 13746:
! 13747: ZEND_VM_NEXT_OPCODE();
! 13748: }
! 13749:
! 13750: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13751: {
! 13752: zend_op *opline = EX(opline);
! 13753: zend_free_op free_op1, free_op2;
! 13754: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13755: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13756:
! 13757: if (0) {
! 13758: MAKE_REAL_ZVAL_PTR(property);
! 13759: }
! 13760: if (IS_VAR == IS_VAR && !container) {
! 13761: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 13762: }
! 13763: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 13764: if (0) {
! 13765: zval_ptr_dtor(&property);
! 13766: } else {
! 13767: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13768: }
! 13769: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13770: READY_TO_DESTROY(free_op1.var)) {
! 13771: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13772: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13773: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13774: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13775: }
! 13776: }
! 13777: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13778: ZEND_VM_NEXT_OPCODE();
! 13779: }
! 13780:
! 13781: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13782: {
! 13783: return zend_fetch_property_address_read_helper_SPEC_VAR_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13784: }
! 13785:
! 13786: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13787: {
! 13788: zend_op *opline = EX(opline);
! 13789:
! 13790: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 13791: /* Behave like FETCH_OBJ_W */
! 13792: zend_free_op free_op1, free_op2;
! 13793: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13794: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13795:
! 13796: if (0) {
! 13797: MAKE_REAL_ZVAL_PTR(property);
! 13798: }
! 13799: if (IS_VAR == IS_VAR && !container) {
! 13800: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 13801: }
! 13802: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 13803: if (0) {
! 13804: zval_ptr_dtor(&property);
! 13805: } else {
! 13806: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13807: }
! 13808: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13809: READY_TO_DESTROY(free_op1.var)) {
! 13810: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13811: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13812: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13813: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13814: }
! 13815: }
! 13816: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13817: ZEND_VM_NEXT_OPCODE();
! 13818: } else {
! 13819: return zend_fetch_property_address_read_helper_SPEC_VAR_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 13820: }
! 13821: }
! 13822:
! 13823: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13824: {
! 13825: zend_op *opline = EX(opline);
! 13826: zend_free_op free_op1, free_op2, free_res;
! 13827: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13828: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13829:
! 13830: if (IS_VAR == IS_CV) {
! 13831: if (container != &EG(uninitialized_zval_ptr)) {
! 13832: SEPARATE_ZVAL_IF_NOT_REF(container);
! 13833: }
! 13834: }
! 13835: if (0) {
! 13836: MAKE_REAL_ZVAL_PTR(property);
! 13837: }
! 13838: if (IS_VAR == IS_VAR && !container) {
! 13839: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 13840: }
! 13841: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 13842: if (0) {
! 13843: zval_ptr_dtor(&property);
! 13844: } else {
! 13845: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13846: }
! 13847: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 13848: READY_TO_DESTROY(free_op1.var)) {
! 13849: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 13850: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 13851: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 13852: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 13853: }
! 13854: }
! 13855: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13856:
! 13857: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 13858: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 13859: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 13860: }
! 13861: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 13862: FREE_OP_VAR_PTR(free_res);
! 13863: ZEND_VM_NEXT_OPCODE();
! 13864: }
! 13865:
! 13866: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13867: {
! 13868: zend_op *opline = EX(opline);
! 13869: zend_op *op_data = opline+1;
! 13870: zend_free_op free_op1, free_op2;
! 13871: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13872: zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13873:
! 13874: if (0) {
! 13875: MAKE_REAL_ZVAL_PTR(property_name);
! 13876: }
! 13877: if (IS_VAR == IS_VAR && !object_ptr) {
! 13878: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13879: }
! 13880: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 13881: if (0) {
! 13882: zval_ptr_dtor(&property_name);
! 13883: } else {
! 13884: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13885: }
! 13886: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13887: /* assign_obj has two opcodes! */
! 13888: ZEND_VM_INC_OPCODE();
! 13889: ZEND_VM_NEXT_OPCODE();
! 13890: }
! 13891:
! 13892: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13893: {
! 13894: zend_op *opline = EX(opline);
! 13895: zend_op *op_data = opline+1;
! 13896: zend_free_op free_op1;
! 13897: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13898:
! 13899: if (IS_VAR == IS_VAR && !object_ptr) {
! 13900: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 13901: }
! 13902: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 13903: zend_free_op free_op2;
! 13904: zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13905:
! 13906: if (0) {
! 13907: MAKE_REAL_ZVAL_PTR(property_name);
! 13908: }
! 13909: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 13910: if (0) {
! 13911: zval_ptr_dtor(&property_name);
! 13912: } else {
! 13913: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13914: }
! 13915: } else {
! 13916: zend_free_op free_op2, free_op_data1, free_op_data2;
! 13917: zval *value;
! 13918: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13919: zval **variable_ptr_ptr;
! 13920:
! 13921: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 13922: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13923:
! 13924: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 13925: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 13926: if (!variable_ptr_ptr) {
! 13927: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 13928: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13929: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 13930: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 13931: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 13932: 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);
! 13933: }
! 13934: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13935: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 13936: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13937: }
! 13938: } else {
! 13939: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 13940: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13941: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 13942: PZVAL_LOCK(value);
! 13943: }
! 13944: }
! 13945: FREE_OP_VAR_PTR(free_op_data2);
! 13946: FREE_OP_IF_VAR(free_op_data1);
! 13947: }
! 13948: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13949: /* assign_dim has two opcodes! */
! 13950: ZEND_VM_INC_OPCODE();
! 13951: ZEND_VM_NEXT_OPCODE();
! 13952: }
! 13953:
! 13954: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13955: {
! 13956: zend_op *opline = EX(opline);
! 13957: zend_free_op free_op1, free_op2;
! 13958: zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13959: zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 13960:
! 13961: if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
! 13962: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
! 13963: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13964: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 13965: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 13966: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 13967: 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);
! 13968: }
! 13969: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13970: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 13971: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 13972: }
! 13973: } else {
! 13974: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 13975: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 13976: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 13977: PZVAL_LOCK(value);
! 13978: }
! 13979: }
! 13980:
! 13981: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 13982:
! 13983: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 13984: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 13985:
! 13986: ZEND_VM_NEXT_OPCODE();
! 13987: }
! 13988:
! 13989: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 13990: {
! 13991: zend_op *opline = EX(opline);
! 13992: zend_free_op free_op1, free_op2;
! 13993: zval **variable_ptr_ptr;
! 13994: zval **value_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 13995:
! 13996: if (IS_VAR == IS_VAR &&
! 13997: value_ptr_ptr &&
! 13998: !Z_ISREF_PP(value_ptr_ptr) &&
! 13999: opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 14000: !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
! 14001: if (free_op2.var == NULL) {
! 14002: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 14003: }
! 14004: zend_error(E_STRICT, "Only variables should be assigned by reference");
! 14005: if (UNEXPECTED(EG(exception) != NULL)) {
! 14006: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14007: ZEND_VM_NEXT_OPCODE();
! 14008: }
! 14009: return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14010: } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 14011: PZVAL_LOCK(*value_ptr_ptr);
! 14012: }
! 14013: if (IS_VAR == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 14014: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
! 14015: }
! 14016:
! 14017: variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14018: if ((IS_VAR == IS_VAR && !value_ptr_ptr) ||
! 14019: (IS_VAR == IS_VAR && !variable_ptr_ptr)) {
! 14020: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
! 14021: }
! 14022: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
! 14023:
! 14024: if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 14025: Z_DELREF_PP(variable_ptr_ptr);
! 14026: }
! 14027:
! 14028: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14029: AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
! 14030: PZVAL_LOCK(*variable_ptr_ptr);
! 14031: }
! 14032:
! 14033: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14034: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14035:
! 14036: ZEND_VM_NEXT_OPCODE();
! 14037: }
! 14038:
! 14039: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14040: {
! 14041: zend_op *opline = EX(opline);
! 14042: zval *function_name;
! 14043: char *function_name_strval;
! 14044: int function_name_strlen;
! 14045: zend_free_op free_op1, free_op2;
! 14046:
! 14047: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 14048:
! 14049: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14050:
! 14051: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 14052: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 14053: }
! 14054:
! 14055: function_name_strval = Z_STRVAL_P(function_name);
! 14056: function_name_strlen = Z_STRLEN_P(function_name);
! 14057:
! 14058: EX(object) = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14059:
! 14060: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 14061: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 14062: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 14063: }
! 14064:
! 14065: /* First, locate the function. */
! 14066: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 14067: if (!EX(fbc)) {
! 14068: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 14069: }
! 14070:
! 14071: EX(called_scope) = Z_OBJCE_P(EX(object));
! 14072: } else {
! 14073: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 14074: }
! 14075:
! 14076: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 14077: EX(object) = NULL;
! 14078: } else {
! 14079: if (!PZVAL_IS_REF(EX(object))) {
! 14080: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 14081: } else {
! 14082: zval *this_ptr;
! 14083: ALLOC_ZVAL(this_ptr);
! 14084: INIT_PZVAL_COPY(this_ptr, EX(object));
! 14085: zval_copy_ctor(this_ptr);
! 14086: EX(object) = this_ptr;
! 14087: }
! 14088: }
! 14089:
! 14090: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14091: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14092:
! 14093: ZEND_VM_NEXT_OPCODE();
! 14094: }
! 14095:
! 14096: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14097: {
! 14098: zend_op *opline = EX(opline);
! 14099: zval *function_name;
! 14100: zend_class_entry *ce;
! 14101:
! 14102: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 14103:
! 14104: if (IS_VAR == IS_CONST) {
! 14105: /* no function found. try a static method in class */
! 14106: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 14107: if (!ce) {
! 14108: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 14109: }
! 14110: EX(called_scope) = ce;
! 14111: } else {
! 14112: ce = EX_T(opline->op1.u.var).class_entry;
! 14113:
! 14114: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 14115: EX(called_scope) = EG(called_scope);
! 14116: } else {
! 14117: EX(called_scope) = ce;
! 14118: }
! 14119: }
! 14120: if(IS_VAR != IS_UNUSED) {
! 14121: char *function_name_strval = NULL;
! 14122: int function_name_strlen = 0;
! 14123: zend_free_op free_op2;
! 14124:
! 14125: if (IS_VAR == IS_CONST) {
! 14126: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 14127: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 14128: } else {
! 14129: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14130:
! 14131: if (Z_TYPE_P(function_name) != IS_STRING) {
! 14132: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 14133: } else {
! 14134: function_name_strval = Z_STRVAL_P(function_name);
! 14135: function_name_strlen = Z_STRLEN_P(function_name);
! 14136: }
! 14137: }
! 14138:
! 14139: if (function_name_strval) {
! 14140: if (ce->get_static_method) {
! 14141: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 14142: } else {
! 14143: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 14144: }
! 14145: if (!EX(fbc)) {
! 14146: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 14147: }
! 14148: }
! 14149:
! 14150: if (IS_VAR != IS_CONST) {
! 14151: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14152: }
! 14153: } else {
! 14154: if(!ce->constructor) {
! 14155: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 14156: }
! 14157: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 14158: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 14159: }
! 14160: EX(fbc) = ce->constructor;
! 14161: }
! 14162:
! 14163: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 14164: EX(object) = NULL;
! 14165: } else {
! 14166: if (EG(This) &&
! 14167: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 14168: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 14169: /* We are calling method of the other (incompatible) class,
! 14170: but passing $this. This is done for compatibility with php-4. */
! 14171: int severity;
! 14172: char *verb;
! 14173: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 14174: severity = E_STRICT;
! 14175: verb = "should not";
! 14176: } else {
! 14177: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 14178: severity = E_ERROR;
! 14179: verb = "cannot";
! 14180: }
! 14181: 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);
! 14182:
! 14183: }
! 14184: if ((EX(object) = EG(This))) {
! 14185: Z_ADDREF_P(EX(object));
! 14186: EX(called_scope) = Z_OBJCE_P(EX(object));
! 14187: }
! 14188: }
! 14189:
! 14190: ZEND_VM_NEXT_OPCODE();
! 14191: }
! 14192:
! 14193: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14194: {
! 14195: zend_op *opline = EX(opline);
! 14196: int switch_expr_is_overloaded=0;
! 14197: zend_free_op free_op1, free_op2;
! 14198:
! 14199: if (IS_VAR==IS_VAR) {
! 14200: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 14201: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 14202: } else {
! 14203: switch_expr_is_overloaded = 1;
! 14204: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 14205: }
! 14206: }
! 14207: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 14208: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 14209: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 14210:
! 14211: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14212: if (switch_expr_is_overloaded) {
! 14213: /* We only free op1 if this is a string offset,
! 14214: * Since if it is a TMP_VAR, it'll be reused by
! 14215: * other CASE opcodes (whereas string offsets
! 14216: * are allocated at each get_zval_ptr())
! 14217: */
! 14218: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14219: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 14220: EX_T(opline->op1.u.var).var.ptr = NULL;
! 14221: }
! 14222: ZEND_VM_NEXT_OPCODE();
! 14223: }
! 14224:
! 14225: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14226: {
! 14227: zend_op *opline = EX(opline);
! 14228: zend_free_op free_op1, free_op2;
! 14229: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 14230: zval *expr_ptr;
! 14231: zval *offset=_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14232:
! 14233: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 14234: zval **expr_ptr_ptr = NULL;
! 14235:
! 14236: if (opline->extended_value) {
! 14237: expr_ptr_ptr=_get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14238: expr_ptr = *expr_ptr_ptr;
! 14239: } else {
! 14240: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14241: }
! 14242: #else
! 14243: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14244: #endif
! 14245:
! 14246: if (0) { /* temporary variable */
! 14247: zval *new_expr;
! 14248:
! 14249: ALLOC_ZVAL(new_expr);
! 14250: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 14251: expr_ptr = new_expr;
! 14252: } else {
! 14253: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 14254: if (opline->extended_value) {
! 14255: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 14256: expr_ptr = *expr_ptr_ptr;
! 14257: Z_ADDREF_P(expr_ptr);
! 14258: } else
! 14259: #endif
! 14260: if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 14261: zval *new_expr;
! 14262:
! 14263: ALLOC_ZVAL(new_expr);
! 14264: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 14265: expr_ptr = new_expr;
! 14266: zendi_zval_copy_ctor(*expr_ptr);
! 14267: } else {
! 14268: Z_ADDREF_P(expr_ptr);
! 14269: }
! 14270: }
! 14271: if (offset) {
! 14272: switch (Z_TYPE_P(offset)) {
! 14273: case IS_DOUBLE:
! 14274: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 14275: break;
! 14276: case IS_LONG:
! 14277: case IS_BOOL:
! 14278: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 14279: break;
! 14280: case IS_STRING:
! 14281: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 14282: break;
! 14283: case IS_NULL:
! 14284: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 14285: break;
! 14286: default:
! 14287: zend_error(E_WARNING, "Illegal offset type");
! 14288: zval_ptr_dtor(&expr_ptr);
! 14289: /* do nothing */
! 14290: break;
! 14291: }
! 14292: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14293: } else {
! 14294: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 14295: }
! 14296: if (opline->extended_value) {
! 14297: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14298: } else {
! 14299: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14300: }
! 14301: ZEND_VM_NEXT_OPCODE();
! 14302: }
! 14303:
! 14304: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14305: {
! 14306: zend_op *opline = EX(opline);
! 14307:
! 14308: array_init(&EX_T(opline->result.u.var).tmp_var);
! 14309: if (IS_VAR == IS_UNUSED) {
! 14310: ZEND_VM_NEXT_OPCODE();
! 14311: #if 0 || IS_VAR != IS_UNUSED
! 14312: } else {
! 14313: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14314: #endif
! 14315: }
! 14316: }
! 14317:
! 14318: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14319: {
! 14320: zend_op *opline = EX(opline);
! 14321: zend_free_op free_op1, free_op2;
! 14322: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14323: zval *offset;
! 14324:
! 14325: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 14326: SEPARATE_ZVAL_IF_NOT_REF(container);
! 14327: }
! 14328: offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14329:
! 14330: if (IS_VAR != IS_VAR || container) {
! 14331: switch (Z_TYPE_PP(container)) {
! 14332: case IS_ARRAY: {
! 14333: HashTable *ht = Z_ARRVAL_PP(container);
! 14334:
! 14335: switch (Z_TYPE_P(offset)) {
! 14336: case IS_DOUBLE:
! 14337: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 14338: break;
! 14339: case IS_RESOURCE:
! 14340: case IS_BOOL:
! 14341: case IS_LONG:
! 14342: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 14343: break;
! 14344: case IS_STRING:
! 14345: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 14346: Z_ADDREF_P(offset);
! 14347: }
! 14348: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 14349: ht == &EG(symbol_table)) {
! 14350: zend_execute_data *ex;
! 14351: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 14352:
! 14353: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 14354: if (ex->op_array && ex->symbol_table == ht) {
! 14355: int i;
! 14356:
! 14357: for (i = 0; i < ex->op_array->last_var; i++) {
! 14358: if (ex->op_array->vars[i].hash_value == hash_value &&
! 14359: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 14360: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 14361: ex->CVs[i] = NULL;
! 14362: break;
! 14363: }
! 14364: }
! 14365: }
! 14366: }
! 14367: }
! 14368: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 14369: zval_ptr_dtor(&offset);
! 14370: }
! 14371: break;
! 14372: case IS_NULL:
! 14373: zend_hash_del(ht, "", sizeof(""));
! 14374: break;
! 14375: default:
! 14376: zend_error(E_WARNING, "Illegal offset type in unset");
! 14377: break;
! 14378: }
! 14379: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14380: break;
! 14381: }
! 14382: case IS_OBJECT:
! 14383: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 14384: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 14385: }
! 14386: if (0) {
! 14387: MAKE_REAL_ZVAL_PTR(offset);
! 14388: }
! 14389: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 14390: if (0) {
! 14391: zval_ptr_dtor(&offset);
! 14392: } else {
! 14393: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14394: }
! 14395: break;
! 14396: case IS_STRING:
! 14397: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 14398: ZEND_VM_CONTINUE(); /* bailed out before */
! 14399: default:
! 14400: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14401: break;
! 14402: }
! 14403: } else {
! 14404: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14405: }
! 14406: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14407:
! 14408: ZEND_VM_NEXT_OPCODE();
! 14409: }
! 14410:
! 14411: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14412: {
! 14413: zend_op *opline = EX(opline);
! 14414: zend_free_op free_op1, free_op2;
! 14415: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14416: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14417:
! 14418: if (IS_VAR != IS_VAR || container) {
! 14419: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 14420: SEPARATE_ZVAL_IF_NOT_REF(container);
! 14421: }
! 14422: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 14423: if (0) {
! 14424: MAKE_REAL_ZVAL_PTR(offset);
! 14425: }
! 14426: if (Z_OBJ_HT_P(*container)->unset_property) {
! 14427: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 14428: } else {
! 14429: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 14430: }
! 14431: if (0) {
! 14432: zval_ptr_dtor(&offset);
! 14433: } else {
! 14434: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14435: }
! 14436: } else {
! 14437: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14438: }
! 14439: } else {
! 14440: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14441: }
! 14442: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14443:
! 14444: ZEND_VM_NEXT_OPCODE();
! 14445: }
! 14446:
! 14447: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 14448: {
! 14449: zend_op *opline = EX(opline);
! 14450: zend_free_op free_op1;
! 14451: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14452: zval **value = NULL;
! 14453: int result = 0;
! 14454:
! 14455: if (IS_VAR != IS_VAR || container) {
! 14456: zend_free_op free_op2;
! 14457: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 14458:
! 14459: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 14460: HashTable *ht;
! 14461: int isset = 0;
! 14462:
! 14463: ht = Z_ARRVAL_PP(container);
! 14464:
! 14465: switch (Z_TYPE_P(offset)) {
! 14466: case IS_DOUBLE:
! 14467: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 14468: isset = 1;
! 14469: }
! 14470: break;
! 14471: case IS_RESOURCE:
! 14472: case IS_BOOL:
! 14473: case IS_LONG:
! 14474: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 14475: isset = 1;
! 14476: }
! 14477: break;
! 14478: case IS_STRING:
! 14479: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 14480: isset = 1;
! 14481: }
! 14482: break;
! 14483: case IS_NULL:
! 14484: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 14485: isset = 1;
! 14486: }
! 14487: break;
! 14488: default:
! 14489: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 14490:
! 14491: break;
! 14492: }
! 14493:
! 14494: switch (opline->extended_value) {
! 14495: case ZEND_ISSET:
! 14496: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 14497: result = 0;
! 14498: } else {
! 14499: result = isset;
! 14500: }
! 14501: break;
! 14502: case ZEND_ISEMPTY:
! 14503: if (!isset || !i_zend_is_true(*value)) {
! 14504: result = 0;
! 14505: } else {
! 14506: result = 1;
! 14507: }
! 14508: break;
! 14509: }
! 14510: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14511: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 14512: if (0) {
! 14513: MAKE_REAL_ZVAL_PTR(offset);
! 14514: }
! 14515: if (prop_dim) {
! 14516: if (Z_OBJ_HT_P(*container)->has_property) {
! 14517: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 14518: } else {
! 14519: zend_error(E_NOTICE, "Trying to check property of non-object");
! 14520: result = 0;
! 14521: }
! 14522: } else {
! 14523: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 14524: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 14525: } else {
! 14526: zend_error(E_NOTICE, "Trying to check element of non-array");
! 14527: result = 0;
! 14528: }
! 14529: }
! 14530: if (0) {
! 14531: zval_ptr_dtor(&offset);
! 14532: } else {
! 14533: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14534: }
! 14535: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 14536: zval tmp;
! 14537:
! 14538: if (Z_TYPE_P(offset) != IS_LONG) {
! 14539: tmp = *offset;
! 14540: zval_copy_ctor(&tmp);
! 14541: convert_to_long(&tmp);
! 14542: offset = &tmp;
! 14543: }
! 14544: if (Z_TYPE_P(offset) == IS_LONG) {
! 14545: switch (opline->extended_value) {
! 14546: case ZEND_ISSET:
! 14547: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 14548: result = 1;
! 14549: }
! 14550: break;
! 14551: case ZEND_ISEMPTY:
! 14552: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 14553: result = 1;
! 14554: }
! 14555: break;
! 14556: }
! 14557: }
! 14558: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14559: } else {
! 14560: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 14561: }
! 14562: }
! 14563:
! 14564: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 14565:
! 14566: switch (opline->extended_value) {
! 14567: case ZEND_ISSET:
! 14568: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 14569: break;
! 14570: case ZEND_ISEMPTY:
! 14571: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 14572: break;
! 14573: }
! 14574:
! 14575: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14576:
! 14577: ZEND_VM_NEXT_OPCODE();
! 14578: }
! 14579:
! 14580: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14581: {
! 14582: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14583: }
! 14584:
! 14585: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14586: {
! 14587: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14588: }
! 14589:
! 14590: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 14591: {
! 14592: zend_op *opline = EX(opline);
! 14593: zend_op *op_data = opline+1;
! 14594: zend_free_op free_op1, free_op_data1;
! 14595: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14596: zval *object;
! 14597: zval *property = NULL;
! 14598: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 14599: znode *result = &opline->result;
! 14600: int have_get_ptr = 0;
! 14601:
! 14602: if (IS_VAR == IS_VAR && !object_ptr) {
! 14603: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 14604: }
! 14605:
! 14606: EX_T(result->u.var).var.ptr_ptr = NULL;
! 14607: make_real_object(object_ptr TSRMLS_CC);
! 14608: object = *object_ptr;
! 14609:
! 14610: if (Z_TYPE_P(object) != IS_OBJECT) {
! 14611: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 14612:
! 14613: FREE_OP(free_op_data1);
! 14614:
! 14615: if (!RETURN_VALUE_UNUSED(result)) {
! 14616: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 14617: EX_T(result->u.var).var.ptr_ptr = NULL;
! 14618: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 14619: }
! 14620: } else {
! 14621: /* here we are sure we are dealing with an object */
! 14622: if (0) {
! 14623: MAKE_REAL_ZVAL_PTR(property);
! 14624: }
! 14625:
! 14626: /* here property is a string */
! 14627: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 14628: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 14629: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 14630: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 14631: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 14632:
! 14633: have_get_ptr = 1;
! 14634: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 14635: if (!RETURN_VALUE_UNUSED(result)) {
! 14636: EX_T(result->u.var).var.ptr = *zptr;
! 14637: EX_T(result->u.var).var.ptr_ptr = NULL;
! 14638: PZVAL_LOCK(*zptr);
! 14639: }
! 14640: }
! 14641: }
! 14642:
! 14643: if (!have_get_ptr) {
! 14644: zval *z = NULL;
! 14645:
! 14646: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 14647: if (Z_OBJ_HT_P(object)->read_property) {
! 14648: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 14649: }
! 14650: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 14651: if (Z_OBJ_HT_P(object)->read_dimension) {
! 14652: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 14653: }
! 14654: }
! 14655: if (z) {
! 14656: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 14657: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 14658:
! 14659: if (Z_REFCOUNT_P(z) == 0) {
! 14660: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 14661: zval_dtor(z);
! 14662: FREE_ZVAL(z);
! 14663: }
! 14664: z = value;
! 14665: }
! 14666: Z_ADDREF_P(z);
! 14667: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 14668: binary_op(z, z, value TSRMLS_CC);
! 14669: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 14670: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 14671: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 14672: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 14673: }
! 14674: if (!RETURN_VALUE_UNUSED(result)) {
! 14675: EX_T(result->u.var).var.ptr = z;
! 14676: EX_T(result->u.var).var.ptr_ptr = NULL;
! 14677: PZVAL_LOCK(z);
! 14678: }
! 14679: zval_ptr_dtor(&z);
! 14680: } else {
! 14681: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 14682: if (!RETURN_VALUE_UNUSED(result)) {
! 14683: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 14684: EX_T(result->u.var).var.ptr_ptr = NULL;
! 14685: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 14686: }
! 14687: }
! 14688: }
! 14689:
! 14690: if (0) {
! 14691: zval_ptr_dtor(&property);
! 14692: } else {
! 14693:
! 14694: }
! 14695: FREE_OP(free_op_data1);
! 14696: }
! 14697:
! 14698: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14699: /* assign_obj has two opcodes! */
! 14700: ZEND_VM_INC_OPCODE();
! 14701: ZEND_VM_NEXT_OPCODE();
! 14702: }
! 14703:
! 14704: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 14705: {
! 14706: zend_op *opline = EX(opline);
! 14707: zend_free_op free_op1, free_op_data2, free_op_data1;
! 14708: zval **var_ptr;
! 14709: zval *value;
! 14710:
! 14711: switch (opline->extended_value) {
! 14712: case ZEND_ASSIGN_OBJ:
! 14713: return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14714: break;
! 14715: case ZEND_ASSIGN_DIM: {
! 14716: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14717:
! 14718: if (IS_VAR == IS_VAR && !container) {
! 14719: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14720: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 14721: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 14722: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 14723: }
! 14724: return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14725: } else {
! 14726: zend_op *op_data = opline+1;
! 14727: zval *dim = NULL;
! 14728:
! 14729: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 14730: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 14731: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 14732: ZEND_VM_INC_OPCODE();
! 14733: }
! 14734: }
! 14735: break;
! 14736: default:
! 14737: value = NULL;
! 14738: var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14739: /* do nothing */
! 14740: break;
! 14741: }
! 14742:
! 14743: if (!var_ptr) {
! 14744: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 14745: }
! 14746:
! 14747: if (*var_ptr == EG(error_zval_ptr)) {
! 14748: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14749: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 14750: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 14751: }
! 14752:
! 14753: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14754: ZEND_VM_NEXT_OPCODE();
! 14755: }
! 14756:
! 14757: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 14758:
! 14759: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 14760: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 14761: /* proxy object */
! 14762: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 14763: Z_ADDREF_P(objval);
! 14764: binary_op(objval, objval, value TSRMLS_CC);
! 14765: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 14766: zval_ptr_dtor(&objval);
! 14767: } else {
! 14768: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 14769: }
! 14770:
! 14771: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14772: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 14773: PZVAL_LOCK(*var_ptr);
! 14774: }
! 14775:
! 14776: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 14777: FREE_OP(free_op_data1);
! 14778: FREE_OP_VAR_PTR(free_op_data2);
! 14779: }
! 14780: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14781: ZEND_VM_NEXT_OPCODE();
! 14782: }
! 14783:
! 14784: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14785: {
! 14786: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14787: }
! 14788:
! 14789: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14790: {
! 14791: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14792: }
! 14793:
! 14794: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14795: {
! 14796: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14797: }
! 14798:
! 14799: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14800: {
! 14801: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14802: }
! 14803:
! 14804: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14805: {
! 14806: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14807: }
! 14808:
! 14809: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14810: {
! 14811: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14812: }
! 14813:
! 14814: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14815: {
! 14816: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14817: }
! 14818:
! 14819: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14820: {
! 14821: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14822: }
! 14823:
! 14824: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14825: {
! 14826: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14827: }
! 14828:
! 14829: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14830: {
! 14831: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14832: }
! 14833:
! 14834: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14835: {
! 14836: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 14837: }
! 14838:
! 14839: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14840: {
! 14841: zend_op *opline = EX(opline);
! 14842: zend_free_op free_op1;
! 14843: zval *dim = NULL;
! 14844: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14845:
! 14846: if (IS_VAR == IS_VAR && !container) {
! 14847: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14848: }
! 14849: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 14850:
! 14851: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 14852: READY_TO_DESTROY(free_op1.var)) {
! 14853: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 14854: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 14855: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 14856: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 14857: }
! 14858: }
! 14859: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14860:
! 14861: /* We are going to assign the result by reference */
! 14862: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 14863: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 14864: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 14865: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 14866: }
! 14867:
! 14868: ZEND_VM_NEXT_OPCODE();
! 14869: }
! 14870:
! 14871: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14872: {
! 14873: zend_op *opline = EX(opline);
! 14874: zend_free_op free_op1;
! 14875: zval *dim = NULL;
! 14876: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14877:
! 14878: if (IS_VAR == IS_VAR && !container) {
! 14879: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14880: }
! 14881: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 14882:
! 14883: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 14884: READY_TO_DESTROY(free_op1.var)) {
! 14885: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 14886: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 14887: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 14888: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 14889: }
! 14890: }
! 14891: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14892: ZEND_VM_NEXT_OPCODE();
! 14893: }
! 14894:
! 14895: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14896: {
! 14897: zend_op *opline = EX(opline);
! 14898: zend_free_op free_op1;
! 14899: zval *dim = NULL;
! 14900: zval **container;
! 14901:
! 14902: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 14903: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14904: if (IS_VAR == IS_VAR && !container) {
! 14905: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14906: }
! 14907: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 14908: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 14909: READY_TO_DESTROY(free_op1.var)) {
! 14910: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 14911: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 14912: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 14913: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 14914: }
! 14915: }
! 14916: } else {
! 14917: if (IS_UNUSED == IS_UNUSED) {
! 14918: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 14919: }
! 14920: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14921: if (IS_VAR == IS_VAR && !container) {
! 14922: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14923: }
! 14924: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 14925: }
! 14926:
! 14927: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14928: ZEND_VM_NEXT_OPCODE();
! 14929: }
! 14930:
! 14931: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14932: {
! 14933: zend_op *opline = EX(opline);
! 14934: zend_op *op_data = opline+1;
! 14935: zend_free_op free_op1;
! 14936: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 14937:
! 14938: if (IS_VAR == IS_VAR && !object_ptr) {
! 14939: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 14940: }
! 14941: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 14942:
! 14943: zval *property_name = NULL;
! 14944:
! 14945: if (0) {
! 14946: MAKE_REAL_ZVAL_PTR(property_name);
! 14947: }
! 14948: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 14949: if (0) {
! 14950: zval_ptr_dtor(&property_name);
! 14951: } else {
! 14952:
! 14953: }
! 14954: } else {
! 14955: zend_free_op free_op_data1, free_op_data2;
! 14956: zval *value;
! 14957: zval *dim = NULL;
! 14958: zval **variable_ptr_ptr;
! 14959:
! 14960: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 14961:
! 14962: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 14963: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 14964: if (!variable_ptr_ptr) {
! 14965: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 14966: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14967: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 14968: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 14969: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 14970: 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);
! 14971: }
! 14972: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14973: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 14974: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 14975: }
! 14976: } else {
! 14977: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 14978: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 14979: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 14980: PZVAL_LOCK(value);
! 14981: }
! 14982: }
! 14983: FREE_OP_VAR_PTR(free_op_data2);
! 14984: FREE_OP_IF_VAR(free_op_data1);
! 14985: }
! 14986: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 14987: /* assign_dim has two opcodes! */
! 14988: ZEND_VM_INC_OPCODE();
! 14989: ZEND_VM_NEXT_OPCODE();
! 14990: }
! 14991:
! 14992: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 14993: {
! 14994: zend_op *opline = EX(opline);
! 14995: zval *function_name;
! 14996: zend_class_entry *ce;
! 14997:
! 14998: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 14999:
! 15000: if (IS_VAR == IS_CONST) {
! 15001: /* no function found. try a static method in class */
! 15002: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 15003: if (!ce) {
! 15004: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 15005: }
! 15006: EX(called_scope) = ce;
! 15007: } else {
! 15008: ce = EX_T(opline->op1.u.var).class_entry;
! 15009:
! 15010: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 15011: EX(called_scope) = EG(called_scope);
! 15012: } else {
! 15013: EX(called_scope) = ce;
! 15014: }
! 15015: }
! 15016: if(IS_UNUSED != IS_UNUSED) {
! 15017: char *function_name_strval = NULL;
! 15018: int function_name_strlen = 0;
! 15019:
! 15020:
! 15021: if (IS_UNUSED == IS_CONST) {
! 15022: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 15023: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 15024: } else {
! 15025: function_name = NULL;
! 15026:
! 15027: if (Z_TYPE_P(function_name) != IS_STRING) {
! 15028: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 15029: } else {
! 15030: function_name_strval = Z_STRVAL_P(function_name);
! 15031: function_name_strlen = Z_STRLEN_P(function_name);
! 15032: }
! 15033: }
! 15034:
! 15035: if (function_name_strval) {
! 15036: if (ce->get_static_method) {
! 15037: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 15038: } else {
! 15039: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 15040: }
! 15041: if (!EX(fbc)) {
! 15042: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 15043: }
! 15044: }
! 15045:
! 15046: if (IS_UNUSED != IS_CONST) {
! 15047:
! 15048: }
! 15049: } else {
! 15050: if(!ce->constructor) {
! 15051: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 15052: }
! 15053: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 15054: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 15055: }
! 15056: EX(fbc) = ce->constructor;
! 15057: }
! 15058:
! 15059: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 15060: EX(object) = NULL;
! 15061: } else {
! 15062: if (EG(This) &&
! 15063: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 15064: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 15065: /* We are calling method of the other (incompatible) class,
! 15066: but passing $this. This is done for compatibility with php-4. */
! 15067: int severity;
! 15068: char *verb;
! 15069: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 15070: severity = E_STRICT;
! 15071: verb = "should not";
! 15072: } else {
! 15073: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 15074: severity = E_ERROR;
! 15075: verb = "cannot";
! 15076: }
! 15077: 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);
! 15078:
! 15079: }
! 15080: if ((EX(object) = EG(This))) {
! 15081: Z_ADDREF_P(EX(object));
! 15082: EX(called_scope) = Z_OBJCE_P(EX(object));
! 15083: }
! 15084: }
! 15085:
! 15086: ZEND_VM_NEXT_OPCODE();
! 15087: }
! 15088:
! 15089: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15090: {
! 15091: zend_op *opline = EX(opline);
! 15092: zend_free_op free_op1;
! 15093: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 15094: zval *expr_ptr;
! 15095: zval *offset=NULL;
! 15096:
! 15097: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 15098: zval **expr_ptr_ptr = NULL;
! 15099:
! 15100: if (opline->extended_value) {
! 15101: expr_ptr_ptr=_get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15102: expr_ptr = *expr_ptr_ptr;
! 15103: } else {
! 15104: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15105: }
! 15106: #else
! 15107: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15108: #endif
! 15109:
! 15110: if (0) { /* temporary variable */
! 15111: zval *new_expr;
! 15112:
! 15113: ALLOC_ZVAL(new_expr);
! 15114: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 15115: expr_ptr = new_expr;
! 15116: } else {
! 15117: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 15118: if (opline->extended_value) {
! 15119: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 15120: expr_ptr = *expr_ptr_ptr;
! 15121: Z_ADDREF_P(expr_ptr);
! 15122: } else
! 15123: #endif
! 15124: if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 15125: zval *new_expr;
! 15126:
! 15127: ALLOC_ZVAL(new_expr);
! 15128: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 15129: expr_ptr = new_expr;
! 15130: zendi_zval_copy_ctor(*expr_ptr);
! 15131: } else {
! 15132: Z_ADDREF_P(expr_ptr);
! 15133: }
! 15134: }
! 15135: if (offset) {
! 15136: switch (Z_TYPE_P(offset)) {
! 15137: case IS_DOUBLE:
! 15138: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 15139: break;
! 15140: case IS_LONG:
! 15141: case IS_BOOL:
! 15142: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 15143: break;
! 15144: case IS_STRING:
! 15145: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 15146: break;
! 15147: case IS_NULL:
! 15148: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 15149: break;
! 15150: default:
! 15151: zend_error(E_WARNING, "Illegal offset type");
! 15152: zval_ptr_dtor(&expr_ptr);
! 15153: /* do nothing */
! 15154: break;
! 15155: }
! 15156:
! 15157: } else {
! 15158: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 15159: }
! 15160: if (opline->extended_value) {
! 15161: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15162: } else {
! 15163: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15164: }
! 15165: ZEND_VM_NEXT_OPCODE();
! 15166: }
! 15167:
! 15168: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15169: {
! 15170: zend_op *opline = EX(opline);
! 15171:
! 15172: array_init(&EX_T(opline->result.u.var).tmp_var);
! 15173: if (IS_VAR == IS_UNUSED) {
! 15174: ZEND_VM_NEXT_OPCODE();
! 15175: #if 0 || IS_VAR != IS_UNUSED
! 15176: } else {
! 15177: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15178: #endif
! 15179: }
! 15180: }
! 15181:
! 15182: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15183: {
! 15184: zend_op *opline = EX(opline);
! 15185: zend_free_op free_op1;
! 15186:
! 15187: add_function(&EX_T(opline->result.u.var).tmp_var,
! 15188: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15189: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15190: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15191:
! 15192: ZEND_VM_NEXT_OPCODE();
! 15193: }
! 15194:
! 15195: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15196: {
! 15197: zend_op *opline = EX(opline);
! 15198: zend_free_op free_op1;
! 15199:
! 15200: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 15201: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15202: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15203: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15204:
! 15205: ZEND_VM_NEXT_OPCODE();
! 15206: }
! 15207:
! 15208: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15209: {
! 15210: zend_op *opline = EX(opline);
! 15211: zend_free_op free_op1;
! 15212:
! 15213: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 15214: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15215: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15216: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15217:
! 15218: ZEND_VM_NEXT_OPCODE();
! 15219: }
! 15220:
! 15221: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15222: {
! 15223: zend_op *opline = EX(opline);
! 15224: zend_free_op free_op1;
! 15225:
! 15226: div_function(&EX_T(opline->result.u.var).tmp_var,
! 15227: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15228: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15229: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15230:
! 15231: ZEND_VM_NEXT_OPCODE();
! 15232: }
! 15233:
! 15234: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15235: {
! 15236: zend_op *opline = EX(opline);
! 15237: zend_free_op free_op1;
! 15238:
! 15239: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 15240: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15241: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15242: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15243:
! 15244: ZEND_VM_NEXT_OPCODE();
! 15245: }
! 15246:
! 15247: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15248: {
! 15249: zend_op *opline = EX(opline);
! 15250: zend_free_op free_op1;
! 15251:
! 15252: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 15253: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15254: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15255: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15256:
! 15257: ZEND_VM_NEXT_OPCODE();
! 15258: }
! 15259:
! 15260: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15261: {
! 15262: zend_op *opline = EX(opline);
! 15263: zend_free_op free_op1;
! 15264:
! 15265: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 15266: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15267: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15268: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15269:
! 15270: ZEND_VM_NEXT_OPCODE();
! 15271: }
! 15272:
! 15273: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15274: {
! 15275: zend_op *opline = EX(opline);
! 15276: zend_free_op free_op1;
! 15277:
! 15278: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 15279: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15280: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15281: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15282:
! 15283: ZEND_VM_NEXT_OPCODE();
! 15284: }
! 15285:
! 15286: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15287: {
! 15288: zend_op *opline = EX(opline);
! 15289: zend_free_op free_op1;
! 15290:
! 15291: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 15292: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15293: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15294: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15295:
! 15296: ZEND_VM_NEXT_OPCODE();
! 15297: }
! 15298:
! 15299: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15300: {
! 15301: zend_op *opline = EX(opline);
! 15302: zend_free_op free_op1;
! 15303: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 15304:
! 15305: is_identical_function(result,
! 15306: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15307: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15308: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 15309: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15310:
! 15311: ZEND_VM_NEXT_OPCODE();
! 15312: }
! 15313:
! 15314: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15315: {
! 15316: zend_op *opline = EX(opline);
! 15317: zend_free_op free_op1;
! 15318: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 15319:
! 15320: compare_function(result,
! 15321: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15322: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15323: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 15324: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15325:
! 15326: ZEND_VM_NEXT_OPCODE();
! 15327: }
! 15328:
! 15329: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15330: {
! 15331: zend_op *opline = EX(opline);
! 15332: zend_free_op free_op1;
! 15333: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 15334:
! 15335: compare_function(result,
! 15336: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15337: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15338: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 15339: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15340:
! 15341: ZEND_VM_NEXT_OPCODE();
! 15342: }
! 15343:
! 15344: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15345: {
! 15346: zend_op *opline = EX(opline);
! 15347: zend_free_op free_op1;
! 15348: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 15349:
! 15350: compare_function(result,
! 15351: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15352: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15353: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 15354: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15355:
! 15356: ZEND_VM_NEXT_OPCODE();
! 15357: }
! 15358:
! 15359: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15360: {
! 15361: zend_op *opline = EX(opline);
! 15362: zend_free_op free_op1;
! 15363: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 15364:
! 15365: compare_function(result,
! 15366: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15367: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15368: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 15369: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15370:
! 15371: ZEND_VM_NEXT_OPCODE();
! 15372: }
! 15373:
! 15374: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15375: {
! 15376: zend_op *opline = EX(opline);
! 15377: zend_free_op free_op1;
! 15378:
! 15379: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 15380: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15381: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15382: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15383:
! 15384: ZEND_VM_NEXT_OPCODE();
! 15385: }
! 15386:
! 15387: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15388: {
! 15389: zend_op *opline = EX(opline);
! 15390: zend_free_op free_op1;
! 15391:
! 15392: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 15393: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15394: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15395: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15396:
! 15397: ZEND_VM_NEXT_OPCODE();
! 15398: }
! 15399:
! 15400: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15401: {
! 15402: zend_op *opline = EX(opline);
! 15403: zend_free_op free_op1;
! 15404:
! 15405: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 15406: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15407: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15408: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15409:
! 15410: ZEND_VM_NEXT_OPCODE();
! 15411: }
! 15412:
! 15413: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15414: {
! 15415: zend_op *opline = EX(opline);
! 15416: zend_free_op free_op1;
! 15417:
! 15418: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 15419: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 15420: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 15421: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15422:
! 15423: ZEND_VM_NEXT_OPCODE();
! 15424: }
! 15425:
! 15426: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 15427: {
! 15428: zend_op *opline = EX(opline);
! 15429: zend_op *op_data = opline+1;
! 15430: zend_free_op free_op1, free_op_data1;
! 15431: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15432: zval *object;
! 15433: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15434: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 15435: znode *result = &opline->result;
! 15436: int have_get_ptr = 0;
! 15437:
! 15438: if (IS_VAR == IS_VAR && !object_ptr) {
! 15439: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 15440: }
! 15441:
! 15442: EX_T(result->u.var).var.ptr_ptr = NULL;
! 15443: make_real_object(object_ptr TSRMLS_CC);
! 15444: object = *object_ptr;
! 15445:
! 15446: if (Z_TYPE_P(object) != IS_OBJECT) {
! 15447: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 15448:
! 15449: FREE_OP(free_op_data1);
! 15450:
! 15451: if (!RETURN_VALUE_UNUSED(result)) {
! 15452: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 15453: EX_T(result->u.var).var.ptr_ptr = NULL;
! 15454: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 15455: }
! 15456: } else {
! 15457: /* here we are sure we are dealing with an object */
! 15458: if (0) {
! 15459: MAKE_REAL_ZVAL_PTR(property);
! 15460: }
! 15461:
! 15462: /* here property is a string */
! 15463: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 15464: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 15465: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 15466: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 15467: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 15468:
! 15469: have_get_ptr = 1;
! 15470: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 15471: if (!RETURN_VALUE_UNUSED(result)) {
! 15472: EX_T(result->u.var).var.ptr = *zptr;
! 15473: EX_T(result->u.var).var.ptr_ptr = NULL;
! 15474: PZVAL_LOCK(*zptr);
! 15475: }
! 15476: }
! 15477: }
! 15478:
! 15479: if (!have_get_ptr) {
! 15480: zval *z = NULL;
! 15481:
! 15482: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 15483: if (Z_OBJ_HT_P(object)->read_property) {
! 15484: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 15485: }
! 15486: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 15487: if (Z_OBJ_HT_P(object)->read_dimension) {
! 15488: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 15489: }
! 15490: }
! 15491: if (z) {
! 15492: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 15493: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 15494:
! 15495: if (Z_REFCOUNT_P(z) == 0) {
! 15496: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 15497: zval_dtor(z);
! 15498: FREE_ZVAL(z);
! 15499: }
! 15500: z = value;
! 15501: }
! 15502: Z_ADDREF_P(z);
! 15503: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 15504: binary_op(z, z, value TSRMLS_CC);
! 15505: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 15506: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 15507: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 15508: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 15509: }
! 15510: if (!RETURN_VALUE_UNUSED(result)) {
! 15511: EX_T(result->u.var).var.ptr = z;
! 15512: EX_T(result->u.var).var.ptr_ptr = NULL;
! 15513: PZVAL_LOCK(z);
! 15514: }
! 15515: zval_ptr_dtor(&z);
! 15516: } else {
! 15517: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 15518: if (!RETURN_VALUE_UNUSED(result)) {
! 15519: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 15520: EX_T(result->u.var).var.ptr_ptr = NULL;
! 15521: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 15522: }
! 15523: }
! 15524: }
! 15525:
! 15526: if (0) {
! 15527: zval_ptr_dtor(&property);
! 15528: } else {
! 15529:
! 15530: }
! 15531: FREE_OP(free_op_data1);
! 15532: }
! 15533:
! 15534: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15535: /* assign_obj has two opcodes! */
! 15536: ZEND_VM_INC_OPCODE();
! 15537: ZEND_VM_NEXT_OPCODE();
! 15538: }
! 15539:
! 15540: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 15541: {
! 15542: zend_op *opline = EX(opline);
! 15543: zend_free_op free_op1, free_op_data2, free_op_data1;
! 15544: zval **var_ptr;
! 15545: zval *value;
! 15546:
! 15547: switch (opline->extended_value) {
! 15548: case ZEND_ASSIGN_OBJ:
! 15549: return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15550: break;
! 15551: case ZEND_ASSIGN_DIM: {
! 15552: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15553:
! 15554: if (IS_VAR == IS_VAR && !container) {
! 15555: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15556: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 15557: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
! 15558: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 15559: }
! 15560: return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15561: } else {
! 15562: zend_op *op_data = opline+1;
! 15563: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15564:
! 15565: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 15566: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 15567: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 15568: ZEND_VM_INC_OPCODE();
! 15569: }
! 15570: }
! 15571: break;
! 15572: default:
! 15573: value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15574: var_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15575: /* do nothing */
! 15576: break;
! 15577: }
! 15578:
! 15579: if (!var_ptr) {
! 15580: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 15581: }
! 15582:
! 15583: if (*var_ptr == EG(error_zval_ptr)) {
! 15584: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 15585: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 15586: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 15587: }
! 15588:
! 15589: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15590: ZEND_VM_NEXT_OPCODE();
! 15591: }
! 15592:
! 15593: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 15594:
! 15595: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 15596: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 15597: /* proxy object */
! 15598: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 15599: Z_ADDREF_P(objval);
! 15600: binary_op(objval, objval, value TSRMLS_CC);
! 15601: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 15602: zval_ptr_dtor(&objval);
! 15603: } else {
! 15604: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 15605: }
! 15606:
! 15607: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 15608: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 15609: PZVAL_LOCK(*var_ptr);
! 15610: }
! 15611:
! 15612: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 15613: FREE_OP(free_op_data1);
! 15614: FREE_OP_VAR_PTR(free_op_data2);
! 15615: }
! 15616: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15617: ZEND_VM_NEXT_OPCODE();
! 15618: }
! 15619:
! 15620: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15621: {
! 15622: return zend_binary_assign_op_helper_SPEC_VAR_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15623: }
! 15624:
! 15625: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15626: {
! 15627: return zend_binary_assign_op_helper_SPEC_VAR_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15628: }
! 15629:
! 15630: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15631: {
! 15632: return zend_binary_assign_op_helper_SPEC_VAR_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15633: }
! 15634:
! 15635: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15636: {
! 15637: return zend_binary_assign_op_helper_SPEC_VAR_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15638: }
! 15639:
! 15640: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15641: {
! 15642: return zend_binary_assign_op_helper_SPEC_VAR_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15643: }
! 15644:
! 15645: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15646: {
! 15647: return zend_binary_assign_op_helper_SPEC_VAR_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15648: }
! 15649:
! 15650: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15651: {
! 15652: return zend_binary_assign_op_helper_SPEC_VAR_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15653: }
! 15654:
! 15655: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15656: {
! 15657: return zend_binary_assign_op_helper_SPEC_VAR_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15658: }
! 15659:
! 15660: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15661: {
! 15662: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15663: }
! 15664:
! 15665: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15666: {
! 15667: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15668: }
! 15669:
! 15670: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15671: {
! 15672: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15673: }
! 15674:
! 15675: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 15676: {
! 15677: zend_op *opline = EX(opline);
! 15678: zend_free_op free_op1;
! 15679: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15680: zval *object;
! 15681: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15682: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 15683: int have_get_ptr = 0;
! 15684:
! 15685: if (IS_VAR == IS_VAR && !object_ptr) {
! 15686: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 15687: }
! 15688:
! 15689: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 15690: object = *object_ptr;
! 15691:
! 15692: if (Z_TYPE_P(object) != IS_OBJECT) {
! 15693: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 15694:
! 15695: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 15696: *retval = EG(uninitialized_zval_ptr);
! 15697: PZVAL_LOCK(*retval);
! 15698: }
! 15699: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15700: ZEND_VM_NEXT_OPCODE();
! 15701: }
! 15702:
! 15703: /* here we are sure we are dealing with an object */
! 15704:
! 15705: if (0) {
! 15706: MAKE_REAL_ZVAL_PTR(property);
! 15707: }
! 15708:
! 15709: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 15710: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 15711: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 15712: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 15713:
! 15714: have_get_ptr = 1;
! 15715: incdec_op(*zptr);
! 15716: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 15717: *retval = *zptr;
! 15718: PZVAL_LOCK(*retval);
! 15719: }
! 15720: }
! 15721: }
! 15722:
! 15723: if (!have_get_ptr) {
! 15724: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 15725: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 15726:
! 15727: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 15728: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 15729:
! 15730: if (Z_REFCOUNT_P(z) == 0) {
! 15731: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 15732: zval_dtor(z);
! 15733: FREE_ZVAL(z);
! 15734: }
! 15735: z = value;
! 15736: }
! 15737: Z_ADDREF_P(z);
! 15738: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 15739: incdec_op(z);
! 15740: *retval = z;
! 15741: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 15742: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 15743: zval_ptr_dtor(&z);
! 15744: } else {
! 15745: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 15746: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 15747: *retval = EG(uninitialized_zval_ptr);
! 15748: PZVAL_LOCK(*retval);
! 15749: }
! 15750: }
! 15751: }
! 15752:
! 15753: if (0) {
! 15754: zval_ptr_dtor(&property);
! 15755: } else {
! 15756:
! 15757: }
! 15758: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15759: ZEND_VM_NEXT_OPCODE();
! 15760: }
! 15761:
! 15762: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15763: {
! 15764: return zend_pre_incdec_property_helper_SPEC_VAR_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15765: }
! 15766:
! 15767: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15768: {
! 15769: return zend_pre_incdec_property_helper_SPEC_VAR_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15770: }
! 15771:
! 15772: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 15773: {
! 15774: zend_op *opline = EX(opline);
! 15775: zend_free_op free_op1;
! 15776: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15777: zval *object;
! 15778: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15779: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 15780: int have_get_ptr = 0;
! 15781:
! 15782: if (IS_VAR == IS_VAR && !object_ptr) {
! 15783: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 15784: }
! 15785:
! 15786: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 15787: object = *object_ptr;
! 15788:
! 15789: if (Z_TYPE_P(object) != IS_OBJECT) {
! 15790: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 15791:
! 15792: *retval = *EG(uninitialized_zval_ptr);
! 15793: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15794: ZEND_VM_NEXT_OPCODE();
! 15795: }
! 15796:
! 15797: /* here we are sure we are dealing with an object */
! 15798:
! 15799: if (0) {
! 15800: MAKE_REAL_ZVAL_PTR(property);
! 15801: }
! 15802:
! 15803: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 15804: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 15805: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 15806: have_get_ptr = 1;
! 15807: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 15808:
! 15809: *retval = **zptr;
! 15810: zendi_zval_copy_ctor(*retval);
! 15811:
! 15812: incdec_op(*zptr);
! 15813:
! 15814: }
! 15815: }
! 15816:
! 15817: if (!have_get_ptr) {
! 15818: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 15819: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 15820: zval *z_copy;
! 15821:
! 15822: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 15823: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 15824:
! 15825: if (Z_REFCOUNT_P(z) == 0) {
! 15826: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 15827: zval_dtor(z);
! 15828: FREE_ZVAL(z);
! 15829: }
! 15830: z = value;
! 15831: }
! 15832: *retval = *z;
! 15833: zendi_zval_copy_ctor(*retval);
! 15834: ALLOC_ZVAL(z_copy);
! 15835: *z_copy = *z;
! 15836: zendi_zval_copy_ctor(*z_copy);
! 15837: INIT_PZVAL(z_copy);
! 15838: incdec_op(z_copy);
! 15839: Z_ADDREF_P(z);
! 15840: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 15841: zval_ptr_dtor(&z_copy);
! 15842: zval_ptr_dtor(&z);
! 15843: } else {
! 15844: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 15845: *retval = *EG(uninitialized_zval_ptr);
! 15846: }
! 15847: }
! 15848:
! 15849: if (0) {
! 15850: zval_ptr_dtor(&property);
! 15851: } else {
! 15852:
! 15853: }
! 15854: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15855: ZEND_VM_NEXT_OPCODE();
! 15856: }
! 15857:
! 15858: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15859: {
! 15860: return zend_post_incdec_property_helper_SPEC_VAR_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15861: }
! 15862:
! 15863: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15864: {
! 15865: return zend_post_incdec_property_helper_SPEC_VAR_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 15866: }
! 15867:
! 15868: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15869: {
! 15870: zend_op *opline = EX(opline);
! 15871: zend_free_op free_op1;
! 15872: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15873: zval **container;
! 15874:
! 15875: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 15876: IS_VAR != IS_CV &&
! 15877: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 15878: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 15879: }
! 15880: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15881: if (IS_VAR == IS_VAR && !container) {
! 15882: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15883: }
! 15884: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 15885:
! 15886: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15887: ZEND_VM_NEXT_OPCODE();
! 15888: }
! 15889:
! 15890: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15891: {
! 15892: zend_op *opline = EX(opline);
! 15893: zend_free_op free_op1;
! 15894: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15895: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15896:
! 15897: if (IS_VAR == IS_VAR && !container) {
! 15898: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15899: }
! 15900: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 15901:
! 15902: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 15903: READY_TO_DESTROY(free_op1.var)) {
! 15904: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 15905: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 15906: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 15907: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 15908: }
! 15909: }
! 15910: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15911:
! 15912: /* We are going to assign the result by reference */
! 15913: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 15914: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 15915: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 15916: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 15917: }
! 15918:
! 15919: ZEND_VM_NEXT_OPCODE();
! 15920: }
! 15921:
! 15922: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15923: {
! 15924: zend_op *opline = EX(opline);
! 15925: zend_free_op free_op1;
! 15926: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15927: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15928:
! 15929: if (IS_VAR == IS_VAR && !container) {
! 15930: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15931: }
! 15932: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 15933:
! 15934: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 15935: READY_TO_DESTROY(free_op1.var)) {
! 15936: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 15937: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 15938: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 15939: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 15940: }
! 15941: }
! 15942: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15943: ZEND_VM_NEXT_OPCODE();
! 15944: }
! 15945:
! 15946: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15947: {
! 15948: zend_op *opline = EX(opline);
! 15949: zend_free_op free_op1;
! 15950: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15951: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15952:
! 15953: if (IS_VAR == IS_VAR && !container) {
! 15954: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15955: }
! 15956: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 15957:
! 15958: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15959: ZEND_VM_NEXT_OPCODE();
! 15960: }
! 15961:
! 15962: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15963: {
! 15964: zend_op *opline = EX(opline);
! 15965: zend_free_op free_op1;
! 15966: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 15967: zval **container;
! 15968:
! 15969: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 15970: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15971: if (IS_VAR == IS_VAR && !container) {
! 15972: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15973: }
! 15974: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 15975: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 15976: READY_TO_DESTROY(free_op1.var)) {
! 15977: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 15978: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 15979: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 15980: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 15981: }
! 15982: }
! 15983: } else {
! 15984: if (IS_CV == IS_UNUSED) {
! 15985: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 15986: }
! 15987: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 15988: if (IS_VAR == IS_VAR && !container) {
! 15989: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 15990: }
! 15991: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 15992: }
! 15993:
! 15994: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 15995: ZEND_VM_NEXT_OPCODE();
! 15996: }
! 15997:
! 15998: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 15999: {
! 16000: zend_op *opline = EX(opline);
! 16001: zend_free_op free_op1;
! 16002: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16003: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16004:
! 16005: /* Not needed in DIM_UNSET
! 16006: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 16007: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 16008: }
! 16009: */
! 16010: if (IS_VAR == IS_CV) {
! 16011: if (container != &EG(uninitialized_zval_ptr)) {
! 16012: SEPARATE_ZVAL_IF_NOT_REF(container);
! 16013: }
! 16014: }
! 16015: if (IS_VAR == IS_VAR && !container) {
! 16016: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 16017: }
! 16018: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 16019:
! 16020: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 16021: READY_TO_DESTROY(free_op1.var)) {
! 16022: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 16023: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 16024: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 16025: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 16026: }
! 16027: }
! 16028: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16029: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 16030: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 16031: } else {
! 16032: zend_free_op free_res;
! 16033:
! 16034: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 16035: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 16036: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 16037: }
! 16038: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 16039: FREE_OP_VAR_PTR(free_res);
! 16040: }
! 16041: ZEND_VM_NEXT_OPCODE();
! 16042: }
! 16043:
! 16044: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
! 16045: {
! 16046: zend_op *opline = EX(opline);
! 16047: zend_free_op free_op1;
! 16048: zval *container = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16049:
! 16050: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16051:
! 16052: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 16053: if (type != BP_VAR_IS) {
! 16054: zend_error(E_NOTICE, "Trying to get property of non-object");
! 16055: }
! 16056: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16057: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 16058: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 16059: }
! 16060:
! 16061: } else {
! 16062: zval *retval;
! 16063:
! 16064: if (0) {
! 16065: MAKE_REAL_ZVAL_PTR(offset);
! 16066: }
! 16067:
! 16068: /* here we are sure we are dealing with an object */
! 16069: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 16070:
! 16071: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 16072: if (Z_REFCOUNT_P(retval) == 0) {
! 16073: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 16074: zval_dtor(retval);
! 16075: FREE_ZVAL(retval);
! 16076: }
! 16077: } else {
! 16078: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 16079: PZVAL_LOCK(retval);
! 16080: }
! 16081:
! 16082: if (0) {
! 16083: zval_ptr_dtor(&offset);
! 16084: } else {
! 16085:
! 16086: }
! 16087: }
! 16088:
! 16089: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16090: ZEND_VM_NEXT_OPCODE();
! 16091: }
! 16092:
! 16093: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16094: {
! 16095: return zend_fetch_property_address_read_helper_SPEC_VAR_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16096: }
! 16097:
! 16098: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16099: {
! 16100: zend_op *opline = EX(opline);
! 16101: zend_free_op free_op1;
! 16102: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16103: zval **container;
! 16104:
! 16105: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 16106: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 16107: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 16108: }
! 16109:
! 16110: if (0) {
! 16111: MAKE_REAL_ZVAL_PTR(property);
! 16112: }
! 16113: container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16114: if (IS_VAR == IS_VAR && !container) {
! 16115: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 16116: }
! 16117: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 16118: if (0) {
! 16119: zval_ptr_dtor(&property);
! 16120: } else {
! 16121:
! 16122: }
! 16123: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 16124: READY_TO_DESTROY(free_op1.var)) {
! 16125: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 16126: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 16127: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 16128: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 16129: }
! 16130: }
! 16131: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16132:
! 16133: /* We are going to assign the result by reference */
! 16134: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 16135: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 16136: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 16137: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 16138: }
! 16139:
! 16140: ZEND_VM_NEXT_OPCODE();
! 16141: }
! 16142:
! 16143: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16144: {
! 16145: zend_op *opline = EX(opline);
! 16146: zend_free_op free_op1;
! 16147: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16148: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16149:
! 16150: if (0) {
! 16151: MAKE_REAL_ZVAL_PTR(property);
! 16152: }
! 16153: if (IS_VAR == IS_VAR && !container) {
! 16154: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 16155: }
! 16156: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 16157: if (0) {
! 16158: zval_ptr_dtor(&property);
! 16159: } else {
! 16160:
! 16161: }
! 16162: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 16163: READY_TO_DESTROY(free_op1.var)) {
! 16164: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 16165: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 16166: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 16167: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 16168: }
! 16169: }
! 16170: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16171: ZEND_VM_NEXT_OPCODE();
! 16172: }
! 16173:
! 16174: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16175: {
! 16176: return zend_fetch_property_address_read_helper_SPEC_VAR_CV(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16177: }
! 16178:
! 16179: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16180: {
! 16181: zend_op *opline = EX(opline);
! 16182:
! 16183: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 16184: /* Behave like FETCH_OBJ_W */
! 16185: zend_free_op free_op1;
! 16186: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16187: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16188:
! 16189: if (0) {
! 16190: MAKE_REAL_ZVAL_PTR(property);
! 16191: }
! 16192: if (IS_VAR == IS_VAR && !container) {
! 16193: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 16194: }
! 16195: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 16196: if (0) {
! 16197: zval_ptr_dtor(&property);
! 16198: } else {
! 16199:
! 16200: }
! 16201: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 16202: READY_TO_DESTROY(free_op1.var)) {
! 16203: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 16204: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 16205: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 16206: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 16207: }
! 16208: }
! 16209: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16210: ZEND_VM_NEXT_OPCODE();
! 16211: } else {
! 16212: return zend_fetch_property_address_read_helper_SPEC_VAR_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16213: }
! 16214: }
! 16215:
! 16216: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16217: {
! 16218: zend_op *opline = EX(opline);
! 16219: zend_free_op free_op1, free_res;
! 16220: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16221: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16222:
! 16223: if (IS_VAR == IS_CV) {
! 16224: if (container != &EG(uninitialized_zval_ptr)) {
! 16225: SEPARATE_ZVAL_IF_NOT_REF(container);
! 16226: }
! 16227: }
! 16228: if (0) {
! 16229: MAKE_REAL_ZVAL_PTR(property);
! 16230: }
! 16231: if (IS_VAR == IS_VAR && !container) {
! 16232: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 16233: }
! 16234: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 16235: if (0) {
! 16236: zval_ptr_dtor(&property);
! 16237: } else {
! 16238:
! 16239: }
! 16240: if (IS_VAR == IS_VAR && (free_op1.var != NULL) &&
! 16241: READY_TO_DESTROY(free_op1.var)) {
! 16242: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 16243: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 16244: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 16245: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 16246: }
! 16247: }
! 16248: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16249:
! 16250: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 16251: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 16252: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 16253: }
! 16254: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 16255: FREE_OP_VAR_PTR(free_res);
! 16256: ZEND_VM_NEXT_OPCODE();
! 16257: }
! 16258:
! 16259: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16260: {
! 16261: zend_op *opline = EX(opline);
! 16262: zend_op *op_data = opline+1;
! 16263: zend_free_op free_op1;
! 16264: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16265: zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16266:
! 16267: if (0) {
! 16268: MAKE_REAL_ZVAL_PTR(property_name);
! 16269: }
! 16270: if (IS_VAR == IS_VAR && !object_ptr) {
! 16271: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 16272: }
! 16273: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 16274: if (0) {
! 16275: zval_ptr_dtor(&property_name);
! 16276: } else {
! 16277:
! 16278: }
! 16279: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16280: /* assign_obj has two opcodes! */
! 16281: ZEND_VM_INC_OPCODE();
! 16282: ZEND_VM_NEXT_OPCODE();
! 16283: }
! 16284:
! 16285: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16286: {
! 16287: zend_op *opline = EX(opline);
! 16288: zend_op *op_data = opline+1;
! 16289: zend_free_op free_op1;
! 16290: zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16291:
! 16292: if (IS_VAR == IS_VAR && !object_ptr) {
! 16293: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 16294: }
! 16295: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 16296:
! 16297: zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16298:
! 16299: if (0) {
! 16300: MAKE_REAL_ZVAL_PTR(property_name);
! 16301: }
! 16302: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 16303: if (0) {
! 16304: zval_ptr_dtor(&property_name);
! 16305: } else {
! 16306:
! 16307: }
! 16308: } else {
! 16309: zend_free_op free_op_data1, free_op_data2;
! 16310: zval *value;
! 16311: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16312: zval **variable_ptr_ptr;
! 16313:
! 16314: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 16315:
! 16316: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 16317: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 16318: if (!variable_ptr_ptr) {
! 16319: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 16320: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16321: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 16322: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 16323: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 16324: 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);
! 16325: }
! 16326: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16327: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 16328: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 16329: }
! 16330: } else {
! 16331: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 16332: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16333: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 16334: PZVAL_LOCK(value);
! 16335: }
! 16336: }
! 16337: FREE_OP_VAR_PTR(free_op_data2);
! 16338: FREE_OP_IF_VAR(free_op_data1);
! 16339: }
! 16340: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16341: /* assign_dim has two opcodes! */
! 16342: ZEND_VM_INC_OPCODE();
! 16343: ZEND_VM_NEXT_OPCODE();
! 16344: }
! 16345:
! 16346: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16347: {
! 16348: zend_op *opline = EX(opline);
! 16349: zend_free_op free_op1;
! 16350: zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16351: zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16352:
! 16353: if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
! 16354: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
! 16355: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16356: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 16357: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 16358: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 16359: 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);
! 16360: }
! 16361: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16362: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 16363: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 16364: }
! 16365: } else {
! 16366: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 16367: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16368: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 16369: PZVAL_LOCK(value);
! 16370: }
! 16371: }
! 16372:
! 16373: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16374:
! 16375: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 16376:
! 16377: ZEND_VM_NEXT_OPCODE();
! 16378: }
! 16379:
! 16380: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16381: {
! 16382: zend_op *opline = EX(opline);
! 16383: zend_free_op free_op1, free_op2;
! 16384: zval **variable_ptr_ptr;
! 16385: zval **value_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);
! 16386:
! 16387: if (IS_CV == IS_VAR &&
! 16388: value_ptr_ptr &&
! 16389: !Z_ISREF_PP(value_ptr_ptr) &&
! 16390: opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 16391: !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
! 16392: if (free_op2.var == NULL) {
! 16393: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 16394: }
! 16395: zend_error(E_STRICT, "Only variables should be assigned by reference");
! 16396: if (UNEXPECTED(EG(exception) != NULL)) {
! 16397:
! 16398: ZEND_VM_NEXT_OPCODE();
! 16399: }
! 16400: return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16401: } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 16402: PZVAL_LOCK(*value_ptr_ptr);
! 16403: }
! 16404: if (IS_VAR == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 16405: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
! 16406: }
! 16407:
! 16408: variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16409: if ((IS_CV == IS_VAR && !value_ptr_ptr) ||
! 16410: (IS_VAR == IS_VAR && !variable_ptr_ptr)) {
! 16411: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
! 16412: }
! 16413: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
! 16414:
! 16415: if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 16416: Z_DELREF_PP(variable_ptr_ptr);
! 16417: }
! 16418:
! 16419: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 16420: AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
! 16421: PZVAL_LOCK(*variable_ptr_ptr);
! 16422: }
! 16423:
! 16424: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16425:
! 16426: ZEND_VM_NEXT_OPCODE();
! 16427: }
! 16428:
! 16429: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16430: {
! 16431: zend_op *opline = EX(opline);
! 16432: zval *function_name;
! 16433: char *function_name_strval;
! 16434: int function_name_strlen;
! 16435: zend_free_op free_op1;
! 16436:
! 16437: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 16438:
! 16439: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16440:
! 16441: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 16442: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 16443: }
! 16444:
! 16445: function_name_strval = Z_STRVAL_P(function_name);
! 16446: function_name_strlen = Z_STRLEN_P(function_name);
! 16447:
! 16448: EX(object) = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16449:
! 16450: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 16451: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 16452: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 16453: }
! 16454:
! 16455: /* First, locate the function. */
! 16456: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 16457: if (!EX(fbc)) {
! 16458: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 16459: }
! 16460:
! 16461: EX(called_scope) = Z_OBJCE_P(EX(object));
! 16462: } else {
! 16463: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 16464: }
! 16465:
! 16466: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 16467: EX(object) = NULL;
! 16468: } else {
! 16469: if (!PZVAL_IS_REF(EX(object))) {
! 16470: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 16471: } else {
! 16472: zval *this_ptr;
! 16473: ALLOC_ZVAL(this_ptr);
! 16474: INIT_PZVAL_COPY(this_ptr, EX(object));
! 16475: zval_copy_ctor(this_ptr);
! 16476: EX(object) = this_ptr;
! 16477: }
! 16478: }
! 16479:
! 16480: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16481:
! 16482: ZEND_VM_NEXT_OPCODE();
! 16483: }
! 16484:
! 16485: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16486: {
! 16487: zend_op *opline = EX(opline);
! 16488: zval *function_name;
! 16489: zend_class_entry *ce;
! 16490:
! 16491: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 16492:
! 16493: if (IS_VAR == IS_CONST) {
! 16494: /* no function found. try a static method in class */
! 16495: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 16496: if (!ce) {
! 16497: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL(opline->op1.u.constant));
! 16498: }
! 16499: EX(called_scope) = ce;
! 16500: } else {
! 16501: ce = EX_T(opline->op1.u.var).class_entry;
! 16502:
! 16503: if (opline->op1.u.EA.type == ZEND_FETCH_CLASS_PARENT || opline->op1.u.EA.type == ZEND_FETCH_CLASS_SELF) {
! 16504: EX(called_scope) = EG(called_scope);
! 16505: } else {
! 16506: EX(called_scope) = ce;
! 16507: }
! 16508: }
! 16509: if(IS_CV != IS_UNUSED) {
! 16510: char *function_name_strval = NULL;
! 16511: int function_name_strlen = 0;
! 16512:
! 16513:
! 16514: if (IS_CV == IS_CONST) {
! 16515: function_name_strval = Z_STRVAL(opline->op2.u.constant);
! 16516: function_name_strlen = Z_STRLEN(opline->op2.u.constant);
! 16517: } else {
! 16518: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16519:
! 16520: if (Z_TYPE_P(function_name) != IS_STRING) {
! 16521: zend_error_noreturn(E_ERROR, "Function name must be a string");
! 16522: } else {
! 16523: function_name_strval = Z_STRVAL_P(function_name);
! 16524: function_name_strlen = Z_STRLEN_P(function_name);
! 16525: }
! 16526: }
! 16527:
! 16528: if (function_name_strval) {
! 16529: if (ce->get_static_method) {
! 16530: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 16531: } else {
! 16532: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
! 16533: }
! 16534: if (!EX(fbc)) {
! 16535: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
! 16536: }
! 16537: }
! 16538:
! 16539: if (IS_CV != IS_CONST) {
! 16540:
! 16541: }
! 16542: } else {
! 16543: if(!ce->constructor) {
! 16544: zend_error_noreturn(E_ERROR, "Cannot call constructor");
! 16545: }
! 16546: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
! 16547: zend_error(E_COMPILE_ERROR, "Cannot call private %s::__construct()", ce->name);
! 16548: }
! 16549: EX(fbc) = ce->constructor;
! 16550: }
! 16551:
! 16552: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
! 16553: EX(object) = NULL;
! 16554: } else {
! 16555: if (EG(This) &&
! 16556: Z_OBJ_HT_P(EG(This))->get_class_entry &&
! 16557: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
! 16558: /* We are calling method of the other (incompatible) class,
! 16559: but passing $this. This is done for compatibility with php-4. */
! 16560: int severity;
! 16561: char *verb;
! 16562: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
! 16563: severity = E_STRICT;
! 16564: verb = "should not";
! 16565: } else {
! 16566: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
! 16567: severity = E_ERROR;
! 16568: verb = "cannot";
! 16569: }
! 16570: 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);
! 16571:
! 16572: }
! 16573: if ((EX(object) = EG(This))) {
! 16574: Z_ADDREF_P(EX(object));
! 16575: EX(called_scope) = Z_OBJCE_P(EX(object));
! 16576: }
! 16577: }
! 16578:
! 16579: ZEND_VM_NEXT_OPCODE();
! 16580: }
! 16581:
! 16582: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16583: {
! 16584: zend_op *opline = EX(opline);
! 16585: int switch_expr_is_overloaded=0;
! 16586: zend_free_op free_op1;
! 16587:
! 16588: if (IS_VAR==IS_VAR) {
! 16589: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 16590: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 16591: } else {
! 16592: switch_expr_is_overloaded = 1;
! 16593: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 16594: }
! 16595: }
! 16596: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 16597: _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC),
! 16598: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 16599:
! 16600: if (switch_expr_is_overloaded) {
! 16601: /* We only free op1 if this is a string offset,
! 16602: * Since if it is a TMP_VAR, it'll be reused by
! 16603: * other CASE opcodes (whereas string offsets
! 16604: * are allocated at each get_zval_ptr())
! 16605: */
! 16606: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16607: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 16608: EX_T(opline->op1.u.var).var.ptr = NULL;
! 16609: }
! 16610: ZEND_VM_NEXT_OPCODE();
! 16611: }
! 16612:
! 16613: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16614: {
! 16615: zend_op *opline = EX(opline);
! 16616: zend_free_op free_op1;
! 16617: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 16618: zval *expr_ptr;
! 16619: zval *offset=_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16620:
! 16621: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 16622: zval **expr_ptr_ptr = NULL;
! 16623:
! 16624: if (opline->extended_value) {
! 16625: expr_ptr_ptr=_get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16626: expr_ptr = *expr_ptr_ptr;
! 16627: } else {
! 16628: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16629: }
! 16630: #else
! 16631: expr_ptr=_get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16632: #endif
! 16633:
! 16634: if (0) { /* temporary variable */
! 16635: zval *new_expr;
! 16636:
! 16637: ALLOC_ZVAL(new_expr);
! 16638: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 16639: expr_ptr = new_expr;
! 16640: } else {
! 16641: #if 0 || IS_VAR == IS_VAR || IS_VAR == IS_CV
! 16642: if (opline->extended_value) {
! 16643: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 16644: expr_ptr = *expr_ptr_ptr;
! 16645: Z_ADDREF_P(expr_ptr);
! 16646: } else
! 16647: #endif
! 16648: if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 16649: zval *new_expr;
! 16650:
! 16651: ALLOC_ZVAL(new_expr);
! 16652: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 16653: expr_ptr = new_expr;
! 16654: zendi_zval_copy_ctor(*expr_ptr);
! 16655: } else {
! 16656: Z_ADDREF_P(expr_ptr);
! 16657: }
! 16658: }
! 16659: if (offset) {
! 16660: switch (Z_TYPE_P(offset)) {
! 16661: case IS_DOUBLE:
! 16662: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 16663: break;
! 16664: case IS_LONG:
! 16665: case IS_BOOL:
! 16666: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 16667: break;
! 16668: case IS_STRING:
! 16669: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 16670: break;
! 16671: case IS_NULL:
! 16672: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 16673: break;
! 16674: default:
! 16675: zend_error(E_WARNING, "Illegal offset type");
! 16676: zval_ptr_dtor(&expr_ptr);
! 16677: /* do nothing */
! 16678: break;
! 16679: }
! 16680:
! 16681: } else {
! 16682: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 16683: }
! 16684: if (opline->extended_value) {
! 16685: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16686: } else {
! 16687: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16688: }
! 16689: ZEND_VM_NEXT_OPCODE();
! 16690: }
! 16691:
! 16692: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16693: {
! 16694: zend_op *opline = EX(opline);
! 16695:
! 16696: array_init(&EX_T(opline->result.u.var).tmp_var);
! 16697: if (IS_VAR == IS_UNUSED) {
! 16698: ZEND_VM_NEXT_OPCODE();
! 16699: #if 0 || IS_VAR != IS_UNUSED
! 16700: } else {
! 16701: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16702: #endif
! 16703: }
! 16704: }
! 16705:
! 16706: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16707: {
! 16708: zend_op *opline = EX(opline);
! 16709: zend_free_op free_op1;
! 16710: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16711: zval *offset;
! 16712:
! 16713: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 16714: SEPARATE_ZVAL_IF_NOT_REF(container);
! 16715: }
! 16716: offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16717:
! 16718: if (IS_VAR != IS_VAR || container) {
! 16719: switch (Z_TYPE_PP(container)) {
! 16720: case IS_ARRAY: {
! 16721: HashTable *ht = Z_ARRVAL_PP(container);
! 16722:
! 16723: switch (Z_TYPE_P(offset)) {
! 16724: case IS_DOUBLE:
! 16725: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 16726: break;
! 16727: case IS_RESOURCE:
! 16728: case IS_BOOL:
! 16729: case IS_LONG:
! 16730: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 16731: break;
! 16732: case IS_STRING:
! 16733: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 16734: Z_ADDREF_P(offset);
! 16735: }
! 16736: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 16737: ht == &EG(symbol_table)) {
! 16738: zend_execute_data *ex;
! 16739: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 16740:
! 16741: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 16742: if (ex->op_array && ex->symbol_table == ht) {
! 16743: int i;
! 16744:
! 16745: for (i = 0; i < ex->op_array->last_var; i++) {
! 16746: if (ex->op_array->vars[i].hash_value == hash_value &&
! 16747: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 16748: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 16749: ex->CVs[i] = NULL;
! 16750: break;
! 16751: }
! 16752: }
! 16753: }
! 16754: }
! 16755: }
! 16756: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 16757: zval_ptr_dtor(&offset);
! 16758: }
! 16759: break;
! 16760: case IS_NULL:
! 16761: zend_hash_del(ht, "", sizeof(""));
! 16762: break;
! 16763: default:
! 16764: zend_error(E_WARNING, "Illegal offset type in unset");
! 16765: break;
! 16766: }
! 16767:
! 16768: break;
! 16769: }
! 16770: case IS_OBJECT:
! 16771: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 16772: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 16773: }
! 16774: if (0) {
! 16775: MAKE_REAL_ZVAL_PTR(offset);
! 16776: }
! 16777: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 16778: if (0) {
! 16779: zval_ptr_dtor(&offset);
! 16780: } else {
! 16781:
! 16782: }
! 16783: break;
! 16784: case IS_STRING:
! 16785: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 16786: ZEND_VM_CONTINUE(); /* bailed out before */
! 16787: default:
! 16788:
! 16789: break;
! 16790: }
! 16791: } else {
! 16792:
! 16793: }
! 16794: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16795:
! 16796: ZEND_VM_NEXT_OPCODE();
! 16797: }
! 16798:
! 16799: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16800: {
! 16801: zend_op *opline = EX(opline);
! 16802: zend_free_op free_op1;
! 16803: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16804: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16805:
! 16806: if (IS_VAR != IS_VAR || container) {
! 16807: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 16808: SEPARATE_ZVAL_IF_NOT_REF(container);
! 16809: }
! 16810: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 16811: if (0) {
! 16812: MAKE_REAL_ZVAL_PTR(offset);
! 16813: }
! 16814: if (Z_OBJ_HT_P(*container)->unset_property) {
! 16815: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 16816: } else {
! 16817: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 16818: }
! 16819: if (0) {
! 16820: zval_ptr_dtor(&offset);
! 16821: } else {
! 16822:
! 16823: }
! 16824: } else {
! 16825:
! 16826: }
! 16827: } else {
! 16828:
! 16829: }
! 16830: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16831:
! 16832: ZEND_VM_NEXT_OPCODE();
! 16833: }
! 16834:
! 16835: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 16836: {
! 16837: zend_op *opline = EX(opline);
! 16838: zend_free_op free_op1;
! 16839: zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
! 16840: zval **value = NULL;
! 16841: int result = 0;
! 16842:
! 16843: if (IS_VAR != IS_VAR || container) {
! 16844:
! 16845: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 16846:
! 16847: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 16848: HashTable *ht;
! 16849: int isset = 0;
! 16850:
! 16851: ht = Z_ARRVAL_PP(container);
! 16852:
! 16853: switch (Z_TYPE_P(offset)) {
! 16854: case IS_DOUBLE:
! 16855: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 16856: isset = 1;
! 16857: }
! 16858: break;
! 16859: case IS_RESOURCE:
! 16860: case IS_BOOL:
! 16861: case IS_LONG:
! 16862: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 16863: isset = 1;
! 16864: }
! 16865: break;
! 16866: case IS_STRING:
! 16867: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 16868: isset = 1;
! 16869: }
! 16870: break;
! 16871: case IS_NULL:
! 16872: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 16873: isset = 1;
! 16874: }
! 16875: break;
! 16876: default:
! 16877: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 16878:
! 16879: break;
! 16880: }
! 16881:
! 16882: switch (opline->extended_value) {
! 16883: case ZEND_ISSET:
! 16884: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 16885: result = 0;
! 16886: } else {
! 16887: result = isset;
! 16888: }
! 16889: break;
! 16890: case ZEND_ISEMPTY:
! 16891: if (!isset || !i_zend_is_true(*value)) {
! 16892: result = 0;
! 16893: } else {
! 16894: result = 1;
! 16895: }
! 16896: break;
! 16897: }
! 16898:
! 16899: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 16900: if (0) {
! 16901: MAKE_REAL_ZVAL_PTR(offset);
! 16902: }
! 16903: if (prop_dim) {
! 16904: if (Z_OBJ_HT_P(*container)->has_property) {
! 16905: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 16906: } else {
! 16907: zend_error(E_NOTICE, "Trying to check property of non-object");
! 16908: result = 0;
! 16909: }
! 16910: } else {
! 16911: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 16912: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 16913: } else {
! 16914: zend_error(E_NOTICE, "Trying to check element of non-array");
! 16915: result = 0;
! 16916: }
! 16917: }
! 16918: if (0) {
! 16919: zval_ptr_dtor(&offset);
! 16920: } else {
! 16921:
! 16922: }
! 16923: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 16924: zval tmp;
! 16925:
! 16926: if (Z_TYPE_P(offset) != IS_LONG) {
! 16927: tmp = *offset;
! 16928: zval_copy_ctor(&tmp);
! 16929: convert_to_long(&tmp);
! 16930: offset = &tmp;
! 16931: }
! 16932: if (Z_TYPE_P(offset) == IS_LONG) {
! 16933: switch (opline->extended_value) {
! 16934: case ZEND_ISSET:
! 16935: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 16936: result = 1;
! 16937: }
! 16938: break;
! 16939: case ZEND_ISEMPTY:
! 16940: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 16941: result = 1;
! 16942: }
! 16943: break;
! 16944: }
! 16945: }
! 16946:
! 16947: } else {
! 16948:
! 16949: }
! 16950: }
! 16951:
! 16952: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 16953:
! 16954: switch (opline->extended_value) {
! 16955: case ZEND_ISSET:
! 16956: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 16957: break;
! 16958: case ZEND_ISEMPTY:
! 16959: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 16960: break;
! 16961: }
! 16962:
! 16963: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 16964:
! 16965: ZEND_VM_NEXT_OPCODE();
! 16966: }
! 16967:
! 16968: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16969: {
! 16970: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16971: }
! 16972:
! 16973: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16974: {
! 16975: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 16976: }
! 16977:
! 16978: static int ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 16979: {
! 16980: zend_op *opline = EX(opline);
! 16981:
! 16982: zval *obj = _get_obj_zval_ptr_unused(TSRMLS_C);
! 16983: zend_class_entry *ce;
! 16984: zend_function *clone;
! 16985: zend_object_clone_obj_t clone_call;
! 16986:
! 16987: if (IS_UNUSED == IS_CONST ||
! 16988: (IS_UNUSED == IS_VAR && !obj) ||
! 16989: Z_TYPE_P(obj) != IS_OBJECT) {
! 16990: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
! 16991: }
! 16992:
! 16993: ce = Z_OBJCE_P(obj);
! 16994: clone = ce ? ce->clone : NULL;
! 16995: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
! 16996: if (!clone_call) {
! 16997: if (ce) {
! 16998: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
! 16999: } else {
! 17000: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
! 17001: }
! 17002: }
! 17003:
! 17004: if (ce && clone) {
! 17005: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
! 17006: /* Ensure that if we're calling a private function, we're allowed to do so.
! 17007: */
! 17008: if (ce != EG(scope)) {
! 17009: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 17010: }
! 17011: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
! 17012: /* Ensure that if we're calling a protected function, we're allowed to do so.
! 17013: */
! 17014: if (!zend_check_protected(clone->common.scope, EG(scope))) {
! 17015: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 17016: }
! 17017: }
! 17018: }
! 17019:
! 17020: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 17021: if (!EG(exception)) {
! 17022: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 17023: Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
! 17024: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
! 17025: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 17026: Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 17027: if (!RETURN_VALUE_USED(opline) || EG(exception)) {
! 17028: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 17029: }
! 17030: }
! 17031:
! 17032: ZEND_VM_NEXT_OPCODE();
! 17033: }
! 17034:
! 17035: static int ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17036: {
! 17037: #if 0 || (IS_UNUSED != IS_UNUSED)
! 17038: zend_op *opline = EX(opline);
! 17039: if (IS_UNUSED != IS_UNUSED) {
! 17040:
! 17041: zval *ptr = NULL;
! 17042:
! 17043: if (Z_TYPE_P(ptr) == IS_LONG) {
! 17044: EG(exit_status) = Z_LVAL_P(ptr);
! 17045: } else {
! 17046: zend_print_variable(ptr);
! 17047: }
! 17048:
! 17049: }
! 17050: #endif
! 17051: zend_bailout();
! 17052: ZEND_VM_NEXT_OPCODE();
! 17053: }
! 17054:
! 17055: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 17056: {
! 17057: zend_op *opline = EX(opline);
! 17058: zend_op *op_data = opline+1;
! 17059: zend_free_op free_op_data1;
! 17060: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17061: zval *object;
! 17062: zval *property = &opline->op2.u.constant;
! 17063: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 17064: znode *result = &opline->result;
! 17065: int have_get_ptr = 0;
! 17066:
! 17067: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 17068: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 17069: }
! 17070:
! 17071: EX_T(result->u.var).var.ptr_ptr = NULL;
! 17072: make_real_object(object_ptr TSRMLS_CC);
! 17073: object = *object_ptr;
! 17074:
! 17075: if (Z_TYPE_P(object) != IS_OBJECT) {
! 17076: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 17077:
! 17078: FREE_OP(free_op_data1);
! 17079:
! 17080: if (!RETURN_VALUE_UNUSED(result)) {
! 17081: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 17082: EX_T(result->u.var).var.ptr_ptr = NULL;
! 17083: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 17084: }
! 17085: } else {
! 17086: /* here we are sure we are dealing with an object */
! 17087: if (0) {
! 17088: MAKE_REAL_ZVAL_PTR(property);
! 17089: }
! 17090:
! 17091: /* here property is a string */
! 17092: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 17093: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 17094: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 17095: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 17096: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 17097:
! 17098: have_get_ptr = 1;
! 17099: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 17100: if (!RETURN_VALUE_UNUSED(result)) {
! 17101: EX_T(result->u.var).var.ptr = *zptr;
! 17102: EX_T(result->u.var).var.ptr_ptr = NULL;
! 17103: PZVAL_LOCK(*zptr);
! 17104: }
! 17105: }
! 17106: }
! 17107:
! 17108: if (!have_get_ptr) {
! 17109: zval *z = NULL;
! 17110:
! 17111: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 17112: if (Z_OBJ_HT_P(object)->read_property) {
! 17113: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 17114: }
! 17115: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 17116: if (Z_OBJ_HT_P(object)->read_dimension) {
! 17117: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 17118: }
! 17119: }
! 17120: if (z) {
! 17121: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 17122: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 17123:
! 17124: if (Z_REFCOUNT_P(z) == 0) {
! 17125: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 17126: zval_dtor(z);
! 17127: FREE_ZVAL(z);
! 17128: }
! 17129: z = value;
! 17130: }
! 17131: Z_ADDREF_P(z);
! 17132: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 17133: binary_op(z, z, value TSRMLS_CC);
! 17134: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 17135: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 17136: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 17137: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 17138: }
! 17139: if (!RETURN_VALUE_UNUSED(result)) {
! 17140: EX_T(result->u.var).var.ptr = z;
! 17141: EX_T(result->u.var).var.ptr_ptr = NULL;
! 17142: PZVAL_LOCK(z);
! 17143: }
! 17144: zval_ptr_dtor(&z);
! 17145: } else {
! 17146: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 17147: if (!RETURN_VALUE_UNUSED(result)) {
! 17148: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 17149: EX_T(result->u.var).var.ptr_ptr = NULL;
! 17150: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 17151: }
! 17152: }
! 17153: }
! 17154:
! 17155: if (0) {
! 17156: zval_ptr_dtor(&property);
! 17157: } else {
! 17158:
! 17159: }
! 17160: FREE_OP(free_op_data1);
! 17161: }
! 17162:
! 17163: /* assign_obj has two opcodes! */
! 17164: ZEND_VM_INC_OPCODE();
! 17165: ZEND_VM_NEXT_OPCODE();
! 17166: }
! 17167:
! 17168: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 17169: {
! 17170: zend_op *opline = EX(opline);
! 17171: zend_free_op free_op_data2, free_op_data1;
! 17172: zval **var_ptr;
! 17173: zval *value;
! 17174:
! 17175: switch (opline->extended_value) {
! 17176: case ZEND_ASSIGN_OBJ:
! 17177: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17178: break;
! 17179: case ZEND_ASSIGN_DIM: {
! 17180: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17181:
! 17182: if (IS_UNUSED == IS_VAR && !container) {
! 17183: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 17184: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 17185: if (IS_UNUSED == IS_VAR && !0) {
! 17186: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 17187: }
! 17188: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17189: } else {
! 17190: zend_op *op_data = opline+1;
! 17191: zval *dim = &opline->op2.u.constant;
! 17192:
! 17193: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 17194: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 17195: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 17196: ZEND_VM_INC_OPCODE();
! 17197: }
! 17198: }
! 17199: break;
! 17200: default:
! 17201: value = &opline->op2.u.constant;
! 17202: var_ptr = NULL;
! 17203: /* do nothing */
! 17204: break;
! 17205: }
! 17206:
! 17207: if (!var_ptr) {
! 17208: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 17209: }
! 17210:
! 17211: if (*var_ptr == EG(error_zval_ptr)) {
! 17212: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17213: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 17214: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 17215: }
! 17216:
! 17217:
! 17218: ZEND_VM_NEXT_OPCODE();
! 17219: }
! 17220:
! 17221: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 17222:
! 17223: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 17224: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 17225: /* proxy object */
! 17226: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 17227: Z_ADDREF_P(objval);
! 17228: binary_op(objval, objval, value TSRMLS_CC);
! 17229: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 17230: zval_ptr_dtor(&objval);
! 17231: } else {
! 17232: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 17233: }
! 17234:
! 17235: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17236: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 17237: PZVAL_LOCK(*var_ptr);
! 17238: }
! 17239:
! 17240: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 17241: FREE_OP(free_op_data1);
! 17242: FREE_OP_VAR_PTR(free_op_data2);
! 17243: }
! 17244:
! 17245: ZEND_VM_NEXT_OPCODE();
! 17246: }
! 17247:
! 17248: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17249: {
! 17250: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17251: }
! 17252:
! 17253: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17254: {
! 17255: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17256: }
! 17257:
! 17258: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17259: {
! 17260: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17261: }
! 17262:
! 17263: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17264: {
! 17265: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17266: }
! 17267:
! 17268: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17269: {
! 17270: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17271: }
! 17272:
! 17273: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17274: {
! 17275: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17276: }
! 17277:
! 17278: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17279: {
! 17280: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17281: }
! 17282:
! 17283: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17284: {
! 17285: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17286: }
! 17287:
! 17288: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17289: {
! 17290: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17291: }
! 17292:
! 17293: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17294: {
! 17295: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17296: }
! 17297:
! 17298: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17299: {
! 17300: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17301: }
! 17302:
! 17303: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 17304: {
! 17305: zend_op *opline = EX(opline);
! 17306:
! 17307: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17308: zval *object;
! 17309: zval *property = &opline->op2.u.constant;
! 17310: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 17311: int have_get_ptr = 0;
! 17312:
! 17313: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 17314: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 17315: }
! 17316:
! 17317: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 17318: object = *object_ptr;
! 17319:
! 17320: if (Z_TYPE_P(object) != IS_OBJECT) {
! 17321: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 17322:
! 17323: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17324: *retval = EG(uninitialized_zval_ptr);
! 17325: PZVAL_LOCK(*retval);
! 17326: }
! 17327:
! 17328: ZEND_VM_NEXT_OPCODE();
! 17329: }
! 17330:
! 17331: /* here we are sure we are dealing with an object */
! 17332:
! 17333: if (0) {
! 17334: MAKE_REAL_ZVAL_PTR(property);
! 17335: }
! 17336:
! 17337: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 17338: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 17339: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 17340: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 17341:
! 17342: have_get_ptr = 1;
! 17343: incdec_op(*zptr);
! 17344: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17345: *retval = *zptr;
! 17346: PZVAL_LOCK(*retval);
! 17347: }
! 17348: }
! 17349: }
! 17350:
! 17351: if (!have_get_ptr) {
! 17352: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 17353: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 17354:
! 17355: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 17356: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 17357:
! 17358: if (Z_REFCOUNT_P(z) == 0) {
! 17359: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 17360: zval_dtor(z);
! 17361: FREE_ZVAL(z);
! 17362: }
! 17363: z = value;
! 17364: }
! 17365: Z_ADDREF_P(z);
! 17366: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 17367: incdec_op(z);
! 17368: *retval = z;
! 17369: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 17370: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 17371: zval_ptr_dtor(&z);
! 17372: } else {
! 17373: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 17374: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17375: *retval = EG(uninitialized_zval_ptr);
! 17376: PZVAL_LOCK(*retval);
! 17377: }
! 17378: }
! 17379: }
! 17380:
! 17381: if (0) {
! 17382: zval_ptr_dtor(&property);
! 17383: } else {
! 17384:
! 17385: }
! 17386:
! 17387: ZEND_VM_NEXT_OPCODE();
! 17388: }
! 17389:
! 17390: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17391: {
! 17392: return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17393: }
! 17394:
! 17395: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17396: {
! 17397: return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17398: }
! 17399:
! 17400: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 17401: {
! 17402: zend_op *opline = EX(opline);
! 17403:
! 17404: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17405: zval *object;
! 17406: zval *property = &opline->op2.u.constant;
! 17407: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 17408: int have_get_ptr = 0;
! 17409:
! 17410: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 17411: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 17412: }
! 17413:
! 17414: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 17415: object = *object_ptr;
! 17416:
! 17417: if (Z_TYPE_P(object) != IS_OBJECT) {
! 17418: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 17419:
! 17420: *retval = *EG(uninitialized_zval_ptr);
! 17421:
! 17422: ZEND_VM_NEXT_OPCODE();
! 17423: }
! 17424:
! 17425: /* here we are sure we are dealing with an object */
! 17426:
! 17427: if (0) {
! 17428: MAKE_REAL_ZVAL_PTR(property);
! 17429: }
! 17430:
! 17431: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 17432: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 17433: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 17434: have_get_ptr = 1;
! 17435: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 17436:
! 17437: *retval = **zptr;
! 17438: zendi_zval_copy_ctor(*retval);
! 17439:
! 17440: incdec_op(*zptr);
! 17441:
! 17442: }
! 17443: }
! 17444:
! 17445: if (!have_get_ptr) {
! 17446: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 17447: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 17448: zval *z_copy;
! 17449:
! 17450: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 17451: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 17452:
! 17453: if (Z_REFCOUNT_P(z) == 0) {
! 17454: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 17455: zval_dtor(z);
! 17456: FREE_ZVAL(z);
! 17457: }
! 17458: z = value;
! 17459: }
! 17460: *retval = *z;
! 17461: zendi_zval_copy_ctor(*retval);
! 17462: ALLOC_ZVAL(z_copy);
! 17463: *z_copy = *z;
! 17464: zendi_zval_copy_ctor(*z_copy);
! 17465: INIT_PZVAL(z_copy);
! 17466: incdec_op(z_copy);
! 17467: Z_ADDREF_P(z);
! 17468: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 17469: zval_ptr_dtor(&z_copy);
! 17470: zval_ptr_dtor(&z);
! 17471: } else {
! 17472: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 17473: *retval = *EG(uninitialized_zval_ptr);
! 17474: }
! 17475: }
! 17476:
! 17477: if (0) {
! 17478: zval_ptr_dtor(&property);
! 17479: } else {
! 17480:
! 17481: }
! 17482:
! 17483: ZEND_VM_NEXT_OPCODE();
! 17484: }
! 17485:
! 17486: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17487: {
! 17488: return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17489: }
! 17490:
! 17491: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17492: {
! 17493: return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17494: }
! 17495:
! 17496: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
! 17497: {
! 17498: zend_op *opline = EX(opline);
! 17499:
! 17500: zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
! 17501:
! 17502: zval *offset = &opline->op2.u.constant;
! 17503:
! 17504: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 17505: if (type != BP_VAR_IS) {
! 17506: zend_error(E_NOTICE, "Trying to get property of non-object");
! 17507: }
! 17508: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 17509: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 17510: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 17511: }
! 17512:
! 17513: } else {
! 17514: zval *retval;
! 17515:
! 17516: if (0) {
! 17517: MAKE_REAL_ZVAL_PTR(offset);
! 17518: }
! 17519:
! 17520: /* here we are sure we are dealing with an object */
! 17521: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 17522:
! 17523: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 17524: if (Z_REFCOUNT_P(retval) == 0) {
! 17525: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 17526: zval_dtor(retval);
! 17527: FREE_ZVAL(retval);
! 17528: }
! 17529: } else {
! 17530: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 17531: PZVAL_LOCK(retval);
! 17532: }
! 17533:
! 17534: if (0) {
! 17535: zval_ptr_dtor(&offset);
! 17536: } else {
! 17537:
! 17538: }
! 17539: }
! 17540:
! 17541: ZEND_VM_NEXT_OPCODE();
! 17542: }
! 17543:
! 17544: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17545: {
! 17546: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17547: }
! 17548:
! 17549: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17550: {
! 17551: zend_op *opline = EX(opline);
! 17552: zend_free_op free_op1;
! 17553: zval *property = &opline->op2.u.constant;
! 17554: zval **container;
! 17555:
! 17556: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 17557: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 17558: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 17559: }
! 17560:
! 17561: if (0) {
! 17562: MAKE_REAL_ZVAL_PTR(property);
! 17563: }
! 17564: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17565: if (IS_UNUSED == IS_VAR && !container) {
! 17566: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 17567: }
! 17568: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 17569: if (0) {
! 17570: zval_ptr_dtor(&property);
! 17571: } else {
! 17572:
! 17573: }
! 17574: if (IS_UNUSED == IS_VAR && 0 &&
! 17575: READY_TO_DESTROY(free_op1.var)) {
! 17576: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 17577: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 17578: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 17579: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 17580: }
! 17581: }
! 17582:
! 17583: /* We are going to assign the result by reference */
! 17584: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 17585: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 17586: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 17587: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 17588: }
! 17589:
! 17590: ZEND_VM_NEXT_OPCODE();
! 17591: }
! 17592:
! 17593: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17594: {
! 17595: zend_op *opline = EX(opline);
! 17596: zend_free_op free_op1;
! 17597: zval *property = &opline->op2.u.constant;
! 17598: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17599:
! 17600: if (0) {
! 17601: MAKE_REAL_ZVAL_PTR(property);
! 17602: }
! 17603: if (IS_UNUSED == IS_VAR && !container) {
! 17604: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 17605: }
! 17606: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 17607: if (0) {
! 17608: zval_ptr_dtor(&property);
! 17609: } else {
! 17610:
! 17611: }
! 17612: if (IS_UNUSED == IS_VAR && 0 &&
! 17613: READY_TO_DESTROY(free_op1.var)) {
! 17614: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 17615: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 17616: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 17617: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 17618: }
! 17619: }
! 17620:
! 17621: ZEND_VM_NEXT_OPCODE();
! 17622: }
! 17623:
! 17624: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17625: {
! 17626: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17627: }
! 17628:
! 17629: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17630: {
! 17631: zend_op *opline = EX(opline);
! 17632:
! 17633: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 17634: /* Behave like FETCH_OBJ_W */
! 17635: zend_free_op free_op1;
! 17636: zval *property = &opline->op2.u.constant;
! 17637: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17638:
! 17639: if (0) {
! 17640: MAKE_REAL_ZVAL_PTR(property);
! 17641: }
! 17642: if (IS_UNUSED == IS_VAR && !container) {
! 17643: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 17644: }
! 17645: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 17646: if (0) {
! 17647: zval_ptr_dtor(&property);
! 17648: } else {
! 17649:
! 17650: }
! 17651: if (IS_UNUSED == IS_VAR && 0 &&
! 17652: READY_TO_DESTROY(free_op1.var)) {
! 17653: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 17654: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 17655: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 17656: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 17657: }
! 17658: }
! 17659:
! 17660: ZEND_VM_NEXT_OPCODE();
! 17661: } else {
! 17662: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17663: }
! 17664: }
! 17665:
! 17666: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17667: {
! 17668: zend_op *opline = EX(opline);
! 17669: zend_free_op free_op1, free_res;
! 17670: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17671: zval *property = &opline->op2.u.constant;
! 17672:
! 17673: if (IS_UNUSED == IS_CV) {
! 17674: if (container != &EG(uninitialized_zval_ptr)) {
! 17675: SEPARATE_ZVAL_IF_NOT_REF(container);
! 17676: }
! 17677: }
! 17678: if (0) {
! 17679: MAKE_REAL_ZVAL_PTR(property);
! 17680: }
! 17681: if (IS_UNUSED == IS_VAR && !container) {
! 17682: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 17683: }
! 17684: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 17685: if (0) {
! 17686: zval_ptr_dtor(&property);
! 17687: } else {
! 17688:
! 17689: }
! 17690: if (IS_UNUSED == IS_VAR && 0 &&
! 17691: READY_TO_DESTROY(free_op1.var)) {
! 17692: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 17693: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 17694: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 17695: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 17696: }
! 17697: }
! 17698:
! 17699: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 17700: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 17701: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 17702: }
! 17703: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 17704: FREE_OP_VAR_PTR(free_res);
! 17705: ZEND_VM_NEXT_OPCODE();
! 17706: }
! 17707:
! 17708: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17709: {
! 17710: zend_op *opline = EX(opline);
! 17711: zend_op *op_data = opline+1;
! 17712:
! 17713: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17714: zval *property_name = &opline->op2.u.constant;
! 17715:
! 17716: if (0) {
! 17717: MAKE_REAL_ZVAL_PTR(property_name);
! 17718: }
! 17719: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 17720: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 17721: }
! 17722: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 17723: if (0) {
! 17724: zval_ptr_dtor(&property_name);
! 17725: } else {
! 17726:
! 17727: }
! 17728:
! 17729: /* assign_obj has two opcodes! */
! 17730: ZEND_VM_INC_OPCODE();
! 17731: ZEND_VM_NEXT_OPCODE();
! 17732: }
! 17733:
! 17734: static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17735: {
! 17736: zend_op *opline = EX(opline);
! 17737: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 17738:
! 17739: if (IS_UNUSED == IS_UNUSED) {
! 17740: /* Initialize for erealloc in add_char_to_string */
! 17741: Z_STRVAL_P(str) = NULL;
! 17742: Z_STRLEN_P(str) = 0;
! 17743: Z_TYPE_P(str) = IS_STRING;
! 17744:
! 17745: INIT_PZVAL(str);
! 17746: }
! 17747:
! 17748: add_char_to_string(str, str, &opline->op2.u.constant);
! 17749:
! 17750: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
! 17751: ZEND_VM_NEXT_OPCODE();
! 17752: }
! 17753:
! 17754: static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17755: {
! 17756: zend_op *opline = EX(opline);
! 17757: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 17758:
! 17759: if (IS_UNUSED == IS_UNUSED) {
! 17760: /* Initialize for erealloc in add_string_to_string */
! 17761: Z_STRVAL_P(str) = NULL;
! 17762: Z_STRLEN_P(str) = 0;
! 17763: Z_TYPE_P(str) = IS_STRING;
! 17764:
! 17765: INIT_PZVAL(str);
! 17766: }
! 17767:
! 17768: add_string_to_string(str, str, &opline->op2.u.constant);
! 17769:
! 17770: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
! 17771: ZEND_VM_NEXT_OPCODE();
! 17772: }
! 17773:
! 17774: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17775: {
! 17776: zend_op *opline = EX(opline);
! 17777: zval *function_name;
! 17778: char *function_name_strval;
! 17779: int function_name_strlen;
! 17780:
! 17781:
! 17782: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 17783:
! 17784: function_name = &opline->op2.u.constant;
! 17785:
! 17786: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 17787: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 17788: }
! 17789:
! 17790: function_name_strval = Z_STRVAL_P(function_name);
! 17791: function_name_strlen = Z_STRLEN_P(function_name);
! 17792:
! 17793: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
! 17794:
! 17795: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 17796: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 17797: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 17798: }
! 17799:
! 17800: /* First, locate the function. */
! 17801: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 17802: if (!EX(fbc)) {
! 17803: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 17804: }
! 17805:
! 17806: EX(called_scope) = Z_OBJCE_P(EX(object));
! 17807: } else {
! 17808: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 17809: }
! 17810:
! 17811: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 17812: EX(object) = NULL;
! 17813: } else {
! 17814: if (!PZVAL_IS_REF(EX(object))) {
! 17815: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 17816: } else {
! 17817: zval *this_ptr;
! 17818: ALLOC_ZVAL(this_ptr);
! 17819: INIT_PZVAL_COPY(this_ptr, EX(object));
! 17820: zval_copy_ctor(this_ptr);
! 17821: EX(object) = this_ptr;
! 17822: }
! 17823: }
! 17824:
! 17825:
! 17826: ZEND_VM_NEXT_OPCODE();
! 17827: }
! 17828:
! 17829: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17830: {
! 17831: zend_op *opline = EX(opline);
! 17832:
! 17833: if (IS_UNUSED == IS_UNUSED) {
! 17834: /* namespaced constant */
! 17835: 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)) {
! 17836: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
! 17837: char *actual = (char *)zend_memrchr(Z_STRVAL(opline->op2.u.constant), '\\', Z_STRLEN(opline->op2.u.constant));
! 17838: if(!actual) {
! 17839: actual = Z_STRVAL(opline->op2.u.constant);
! 17840: } else {
! 17841: actual++;
! 17842: }
! 17843: /* non-qualified constant - allow text substitution */
! 17844: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
! 17845: 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);
! 17846: } else {
! 17847: zend_error_noreturn(E_ERROR, "Undefined constant '%s'",
! 17848: Z_STRVAL(opline->op2.u.constant), Z_STRVAL(opline->op2.u.constant));
! 17849: }
! 17850: }
! 17851: ZEND_VM_NEXT_OPCODE();
! 17852: } else {
! 17853: /* class constant */
! 17854: zend_class_entry *ce;
! 17855: zval **value;
! 17856:
! 17857: if (IS_UNUSED == IS_CONST) {
! 17858:
! 17859: ce = zend_fetch_class(Z_STRVAL(opline->op1.u.constant), Z_STRLEN(opline->op1.u.constant), opline->extended_value TSRMLS_CC);
! 17860: if (!ce) {
! 17861: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 17862: }
! 17863: } else {
! 17864: ce = EX_T(opline->op1.u.var).class_entry;
! 17865: }
! 17866:
! 17867: if (zend_hash_find(&ce->constants_table, Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant)+1, (void **) &value) == SUCCESS) {
! 17868: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
! 17869: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
! 17870: zend_class_entry *old_scope = EG(scope);
! 17871:
! 17872: EG(scope) = ce;
! 17873: zval_update_constant(value, (void *) 1 TSRMLS_CC);
! 17874: EG(scope) = old_scope;
! 17875: }
! 17876: EX_T(opline->result.u.var).tmp_var = **value;
! 17877: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 17878: } else {
! 17879: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL(opline->op2.u.constant));
! 17880: }
! 17881:
! 17882: ZEND_VM_NEXT_OPCODE();
! 17883: }
! 17884: }
! 17885:
! 17886: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17887: {
! 17888: zend_op *opline = EX(opline);
! 17889:
! 17890: array_init(&EX_T(opline->result.u.var).tmp_var);
! 17891: if (IS_UNUSED == IS_UNUSED) {
! 17892: ZEND_VM_NEXT_OPCODE();
! 17893: #if 0 || IS_UNUSED != IS_UNUSED
! 17894: } else {
! 17895: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 17896: #endif
! 17897: }
! 17898: }
! 17899:
! 17900: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17901: {
! 17902: zend_op *opline = EX(opline);
! 17903:
! 17904: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17905: zval *offset;
! 17906:
! 17907: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 17908: SEPARATE_ZVAL_IF_NOT_REF(container);
! 17909: }
! 17910: offset = &opline->op2.u.constant;
! 17911:
! 17912: if (IS_UNUSED != IS_VAR || container) {
! 17913: switch (Z_TYPE_PP(container)) {
! 17914: case IS_ARRAY: {
! 17915: HashTable *ht = Z_ARRVAL_PP(container);
! 17916:
! 17917: switch (Z_TYPE_P(offset)) {
! 17918: case IS_DOUBLE:
! 17919: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 17920: break;
! 17921: case IS_RESOURCE:
! 17922: case IS_BOOL:
! 17923: case IS_LONG:
! 17924: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 17925: break;
! 17926: case IS_STRING:
! 17927: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 17928: Z_ADDREF_P(offset);
! 17929: }
! 17930: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 17931: ht == &EG(symbol_table)) {
! 17932: zend_execute_data *ex;
! 17933: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 17934:
! 17935: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 17936: if (ex->op_array && ex->symbol_table == ht) {
! 17937: int i;
! 17938:
! 17939: for (i = 0; i < ex->op_array->last_var; i++) {
! 17940: if (ex->op_array->vars[i].hash_value == hash_value &&
! 17941: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 17942: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 17943: ex->CVs[i] = NULL;
! 17944: break;
! 17945: }
! 17946: }
! 17947: }
! 17948: }
! 17949: }
! 17950: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 17951: zval_ptr_dtor(&offset);
! 17952: }
! 17953: break;
! 17954: case IS_NULL:
! 17955: zend_hash_del(ht, "", sizeof(""));
! 17956: break;
! 17957: default:
! 17958: zend_error(E_WARNING, "Illegal offset type in unset");
! 17959: break;
! 17960: }
! 17961:
! 17962: break;
! 17963: }
! 17964: case IS_OBJECT:
! 17965: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 17966: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 17967: }
! 17968: if (0) {
! 17969: MAKE_REAL_ZVAL_PTR(offset);
! 17970: }
! 17971: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 17972: if (0) {
! 17973: zval_ptr_dtor(&offset);
! 17974: } else {
! 17975:
! 17976: }
! 17977: break;
! 17978: case IS_STRING:
! 17979: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 17980: ZEND_VM_CONTINUE(); /* bailed out before */
! 17981: default:
! 17982:
! 17983: break;
! 17984: }
! 17985: } else {
! 17986:
! 17987: }
! 17988:
! 17989: ZEND_VM_NEXT_OPCODE();
! 17990: }
! 17991:
! 17992: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 17993: {
! 17994: zend_op *opline = EX(opline);
! 17995:
! 17996: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 17997: zval *offset = &opline->op2.u.constant;
! 17998:
! 17999: if (IS_UNUSED != IS_VAR || container) {
! 18000: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 18001: SEPARATE_ZVAL_IF_NOT_REF(container);
! 18002: }
! 18003: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 18004: if (0) {
! 18005: MAKE_REAL_ZVAL_PTR(offset);
! 18006: }
! 18007: if (Z_OBJ_HT_P(*container)->unset_property) {
! 18008: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 18009: } else {
! 18010: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 18011: }
! 18012: if (0) {
! 18013: zval_ptr_dtor(&offset);
! 18014: } else {
! 18015:
! 18016: }
! 18017: } else {
! 18018:
! 18019: }
! 18020: } else {
! 18021:
! 18022: }
! 18023:
! 18024: ZEND_VM_NEXT_OPCODE();
! 18025: }
! 18026:
! 18027: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 18028: {
! 18029: zend_op *opline = EX(opline);
! 18030:
! 18031: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18032: zval **value = NULL;
! 18033: int result = 0;
! 18034:
! 18035: if (IS_UNUSED != IS_VAR || container) {
! 18036:
! 18037: zval *offset = &opline->op2.u.constant;
! 18038:
! 18039: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 18040: HashTable *ht;
! 18041: int isset = 0;
! 18042:
! 18043: ht = Z_ARRVAL_PP(container);
! 18044:
! 18045: switch (Z_TYPE_P(offset)) {
! 18046: case IS_DOUBLE:
! 18047: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 18048: isset = 1;
! 18049: }
! 18050: break;
! 18051: case IS_RESOURCE:
! 18052: case IS_BOOL:
! 18053: case IS_LONG:
! 18054: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 18055: isset = 1;
! 18056: }
! 18057: break;
! 18058: case IS_STRING:
! 18059: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 18060: isset = 1;
! 18061: }
! 18062: break;
! 18063: case IS_NULL:
! 18064: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 18065: isset = 1;
! 18066: }
! 18067: break;
! 18068: default:
! 18069: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 18070:
! 18071: break;
! 18072: }
! 18073:
! 18074: switch (opline->extended_value) {
! 18075: case ZEND_ISSET:
! 18076: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 18077: result = 0;
! 18078: } else {
! 18079: result = isset;
! 18080: }
! 18081: break;
! 18082: case ZEND_ISEMPTY:
! 18083: if (!isset || !i_zend_is_true(*value)) {
! 18084: result = 0;
! 18085: } else {
! 18086: result = 1;
! 18087: }
! 18088: break;
! 18089: }
! 18090:
! 18091: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 18092: if (0) {
! 18093: MAKE_REAL_ZVAL_PTR(offset);
! 18094: }
! 18095: if (prop_dim) {
! 18096: if (Z_OBJ_HT_P(*container)->has_property) {
! 18097: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 18098: } else {
! 18099: zend_error(E_NOTICE, "Trying to check property of non-object");
! 18100: result = 0;
! 18101: }
! 18102: } else {
! 18103: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 18104: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 18105: } else {
! 18106: zend_error(E_NOTICE, "Trying to check element of non-array");
! 18107: result = 0;
! 18108: }
! 18109: }
! 18110: if (0) {
! 18111: zval_ptr_dtor(&offset);
! 18112: } else {
! 18113:
! 18114: }
! 18115: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 18116: zval tmp;
! 18117:
! 18118: if (Z_TYPE_P(offset) != IS_LONG) {
! 18119: tmp = *offset;
! 18120: zval_copy_ctor(&tmp);
! 18121: convert_to_long(&tmp);
! 18122: offset = &tmp;
! 18123: }
! 18124: if (Z_TYPE_P(offset) == IS_LONG) {
! 18125: switch (opline->extended_value) {
! 18126: case ZEND_ISSET:
! 18127: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 18128: result = 1;
! 18129: }
! 18130: break;
! 18131: case ZEND_ISEMPTY:
! 18132: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 18133: result = 1;
! 18134: }
! 18135: break;
! 18136: }
! 18137: }
! 18138:
! 18139: } else {
! 18140:
! 18141: }
! 18142: }
! 18143:
! 18144: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 18145:
! 18146: switch (opline->extended_value) {
! 18147: case ZEND_ISSET:
! 18148: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 18149: break;
! 18150: case ZEND_ISEMPTY:
! 18151: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 18152: break;
! 18153: }
! 18154:
! 18155: ZEND_VM_NEXT_OPCODE();
! 18156: }
! 18157:
! 18158: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18159: {
! 18160: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18161: }
! 18162:
! 18163: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18164: {
! 18165: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18166: }
! 18167:
! 18168: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 18169: {
! 18170: zend_op *opline = EX(opline);
! 18171: zend_op *op_data = opline+1;
! 18172: zend_free_op free_op2, free_op_data1;
! 18173: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18174: zval *object;
! 18175: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18176: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 18177: znode *result = &opline->result;
! 18178: int have_get_ptr = 0;
! 18179:
! 18180: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 18181: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 18182: }
! 18183:
! 18184: EX_T(result->u.var).var.ptr_ptr = NULL;
! 18185: make_real_object(object_ptr TSRMLS_CC);
! 18186: object = *object_ptr;
! 18187:
! 18188: if (Z_TYPE_P(object) != IS_OBJECT) {
! 18189: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 18190: zval_dtor(free_op2.var);
! 18191: FREE_OP(free_op_data1);
! 18192:
! 18193: if (!RETURN_VALUE_UNUSED(result)) {
! 18194: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 18195: EX_T(result->u.var).var.ptr_ptr = NULL;
! 18196: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 18197: }
! 18198: } else {
! 18199: /* here we are sure we are dealing with an object */
! 18200: if (1) {
! 18201: MAKE_REAL_ZVAL_PTR(property);
! 18202: }
! 18203:
! 18204: /* here property is a string */
! 18205: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 18206: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 18207: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 18208: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 18209: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 18210:
! 18211: have_get_ptr = 1;
! 18212: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 18213: if (!RETURN_VALUE_UNUSED(result)) {
! 18214: EX_T(result->u.var).var.ptr = *zptr;
! 18215: EX_T(result->u.var).var.ptr_ptr = NULL;
! 18216: PZVAL_LOCK(*zptr);
! 18217: }
! 18218: }
! 18219: }
! 18220:
! 18221: if (!have_get_ptr) {
! 18222: zval *z = NULL;
! 18223:
! 18224: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 18225: if (Z_OBJ_HT_P(object)->read_property) {
! 18226: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 18227: }
! 18228: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 18229: if (Z_OBJ_HT_P(object)->read_dimension) {
! 18230: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 18231: }
! 18232: }
! 18233: if (z) {
! 18234: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 18235: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 18236:
! 18237: if (Z_REFCOUNT_P(z) == 0) {
! 18238: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 18239: zval_dtor(z);
! 18240: FREE_ZVAL(z);
! 18241: }
! 18242: z = value;
! 18243: }
! 18244: Z_ADDREF_P(z);
! 18245: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 18246: binary_op(z, z, value TSRMLS_CC);
! 18247: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 18248: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 18249: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 18250: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 18251: }
! 18252: if (!RETURN_VALUE_UNUSED(result)) {
! 18253: EX_T(result->u.var).var.ptr = z;
! 18254: EX_T(result->u.var).var.ptr_ptr = NULL;
! 18255: PZVAL_LOCK(z);
! 18256: }
! 18257: zval_ptr_dtor(&z);
! 18258: } else {
! 18259: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 18260: if (!RETURN_VALUE_UNUSED(result)) {
! 18261: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 18262: EX_T(result->u.var).var.ptr_ptr = NULL;
! 18263: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 18264: }
! 18265: }
! 18266: }
! 18267:
! 18268: if (1) {
! 18269: zval_ptr_dtor(&property);
! 18270: } else {
! 18271: zval_dtor(free_op2.var);
! 18272: }
! 18273: FREE_OP(free_op_data1);
! 18274: }
! 18275:
! 18276: /* assign_obj has two opcodes! */
! 18277: ZEND_VM_INC_OPCODE();
! 18278: ZEND_VM_NEXT_OPCODE();
! 18279: }
! 18280:
! 18281: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 18282: {
! 18283: zend_op *opline = EX(opline);
! 18284: zend_free_op free_op2, free_op_data2, free_op_data1;
! 18285: zval **var_ptr;
! 18286: zval *value;
! 18287:
! 18288: switch (opline->extended_value) {
! 18289: case ZEND_ASSIGN_OBJ:
! 18290: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18291: break;
! 18292: case ZEND_ASSIGN_DIM: {
! 18293: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18294:
! 18295: if (IS_UNUSED == IS_VAR && !container) {
! 18296: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 18297: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 18298: if (IS_UNUSED == IS_VAR && !0) {
! 18299: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 18300: }
! 18301: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18302: } else {
! 18303: zend_op *op_data = opline+1;
! 18304: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18305:
! 18306: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
! 18307: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 18308: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 18309: ZEND_VM_INC_OPCODE();
! 18310: }
! 18311: }
! 18312: break;
! 18313: default:
! 18314: value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18315: var_ptr = NULL;
! 18316: /* do nothing */
! 18317: break;
! 18318: }
! 18319:
! 18320: if (!var_ptr) {
! 18321: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 18322: }
! 18323:
! 18324: if (*var_ptr == EG(error_zval_ptr)) {
! 18325: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18326: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 18327: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 18328: }
! 18329: zval_dtor(free_op2.var);
! 18330:
! 18331: ZEND_VM_NEXT_OPCODE();
! 18332: }
! 18333:
! 18334: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 18335:
! 18336: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 18337: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 18338: /* proxy object */
! 18339: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 18340: Z_ADDREF_P(objval);
! 18341: binary_op(objval, objval, value TSRMLS_CC);
! 18342: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 18343: zval_ptr_dtor(&objval);
! 18344: } else {
! 18345: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 18346: }
! 18347:
! 18348: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18349: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 18350: PZVAL_LOCK(*var_ptr);
! 18351: }
! 18352: zval_dtor(free_op2.var);
! 18353:
! 18354: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 18355: FREE_OP(free_op_data1);
! 18356: FREE_OP_VAR_PTR(free_op_data2);
! 18357: }
! 18358:
! 18359: ZEND_VM_NEXT_OPCODE();
! 18360: }
! 18361:
! 18362: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18363: {
! 18364: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18365: }
! 18366:
! 18367: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18368: {
! 18369: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18370: }
! 18371:
! 18372: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18373: {
! 18374: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18375: }
! 18376:
! 18377: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18378: {
! 18379: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18380: }
! 18381:
! 18382: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18383: {
! 18384: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18385: }
! 18386:
! 18387: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18388: {
! 18389: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18390: }
! 18391:
! 18392: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18393: {
! 18394: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18395: }
! 18396:
! 18397: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18398: {
! 18399: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18400: }
! 18401:
! 18402: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18403: {
! 18404: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18405: }
! 18406:
! 18407: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18408: {
! 18409: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18410: }
! 18411:
! 18412: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18413: {
! 18414: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18415: }
! 18416:
! 18417: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 18418: {
! 18419: zend_op *opline = EX(opline);
! 18420: zend_free_op free_op2;
! 18421: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18422: zval *object;
! 18423: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18424: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 18425: int have_get_ptr = 0;
! 18426:
! 18427: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 18428: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 18429: }
! 18430:
! 18431: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 18432: object = *object_ptr;
! 18433:
! 18434: if (Z_TYPE_P(object) != IS_OBJECT) {
! 18435: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 18436: zval_dtor(free_op2.var);
! 18437: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18438: *retval = EG(uninitialized_zval_ptr);
! 18439: PZVAL_LOCK(*retval);
! 18440: }
! 18441:
! 18442: ZEND_VM_NEXT_OPCODE();
! 18443: }
! 18444:
! 18445: /* here we are sure we are dealing with an object */
! 18446:
! 18447: if (1) {
! 18448: MAKE_REAL_ZVAL_PTR(property);
! 18449: }
! 18450:
! 18451: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 18452: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 18453: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 18454: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 18455:
! 18456: have_get_ptr = 1;
! 18457: incdec_op(*zptr);
! 18458: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18459: *retval = *zptr;
! 18460: PZVAL_LOCK(*retval);
! 18461: }
! 18462: }
! 18463: }
! 18464:
! 18465: if (!have_get_ptr) {
! 18466: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 18467: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 18468:
! 18469: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 18470: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 18471:
! 18472: if (Z_REFCOUNT_P(z) == 0) {
! 18473: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 18474: zval_dtor(z);
! 18475: FREE_ZVAL(z);
! 18476: }
! 18477: z = value;
! 18478: }
! 18479: Z_ADDREF_P(z);
! 18480: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 18481: incdec_op(z);
! 18482: *retval = z;
! 18483: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 18484: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 18485: zval_ptr_dtor(&z);
! 18486: } else {
! 18487: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 18488: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18489: *retval = EG(uninitialized_zval_ptr);
! 18490: PZVAL_LOCK(*retval);
! 18491: }
! 18492: }
! 18493: }
! 18494:
! 18495: if (1) {
! 18496: zval_ptr_dtor(&property);
! 18497: } else {
! 18498: zval_dtor(free_op2.var);
! 18499: }
! 18500:
! 18501: ZEND_VM_NEXT_OPCODE();
! 18502: }
! 18503:
! 18504: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18505: {
! 18506: return zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18507: }
! 18508:
! 18509: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18510: {
! 18511: return zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18512: }
! 18513:
! 18514: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 18515: {
! 18516: zend_op *opline = EX(opline);
! 18517: zend_free_op free_op2;
! 18518: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18519: zval *object;
! 18520: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18521: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 18522: int have_get_ptr = 0;
! 18523:
! 18524: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 18525: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 18526: }
! 18527:
! 18528: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 18529: object = *object_ptr;
! 18530:
! 18531: if (Z_TYPE_P(object) != IS_OBJECT) {
! 18532: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 18533: zval_dtor(free_op2.var);
! 18534: *retval = *EG(uninitialized_zval_ptr);
! 18535:
! 18536: ZEND_VM_NEXT_OPCODE();
! 18537: }
! 18538:
! 18539: /* here we are sure we are dealing with an object */
! 18540:
! 18541: if (1) {
! 18542: MAKE_REAL_ZVAL_PTR(property);
! 18543: }
! 18544:
! 18545: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 18546: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 18547: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 18548: have_get_ptr = 1;
! 18549: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 18550:
! 18551: *retval = **zptr;
! 18552: zendi_zval_copy_ctor(*retval);
! 18553:
! 18554: incdec_op(*zptr);
! 18555:
! 18556: }
! 18557: }
! 18558:
! 18559: if (!have_get_ptr) {
! 18560: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 18561: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 18562: zval *z_copy;
! 18563:
! 18564: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 18565: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 18566:
! 18567: if (Z_REFCOUNT_P(z) == 0) {
! 18568: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 18569: zval_dtor(z);
! 18570: FREE_ZVAL(z);
! 18571: }
! 18572: z = value;
! 18573: }
! 18574: *retval = *z;
! 18575: zendi_zval_copy_ctor(*retval);
! 18576: ALLOC_ZVAL(z_copy);
! 18577: *z_copy = *z;
! 18578: zendi_zval_copy_ctor(*z_copy);
! 18579: INIT_PZVAL(z_copy);
! 18580: incdec_op(z_copy);
! 18581: Z_ADDREF_P(z);
! 18582: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 18583: zval_ptr_dtor(&z_copy);
! 18584: zval_ptr_dtor(&z);
! 18585: } else {
! 18586: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 18587: *retval = *EG(uninitialized_zval_ptr);
! 18588: }
! 18589: }
! 18590:
! 18591: if (1) {
! 18592: zval_ptr_dtor(&property);
! 18593: } else {
! 18594: zval_dtor(free_op2.var);
! 18595: }
! 18596:
! 18597: ZEND_VM_NEXT_OPCODE();
! 18598: }
! 18599:
! 18600: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18601: {
! 18602: return zend_post_incdec_property_helper_SPEC_UNUSED_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18603: }
! 18604:
! 18605: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18606: {
! 18607: return zend_post_incdec_property_helper_SPEC_UNUSED_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18608: }
! 18609:
! 18610: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
! 18611: {
! 18612: zend_op *opline = EX(opline);
! 18613:
! 18614: zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
! 18615: zend_free_op free_op2;
! 18616: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18617:
! 18618: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 18619: if (type != BP_VAR_IS) {
! 18620: zend_error(E_NOTICE, "Trying to get property of non-object");
! 18621: }
! 18622: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 18623: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 18624: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 18625: }
! 18626: zval_dtor(free_op2.var);
! 18627: } else {
! 18628: zval *retval;
! 18629:
! 18630: if (1) {
! 18631: MAKE_REAL_ZVAL_PTR(offset);
! 18632: }
! 18633:
! 18634: /* here we are sure we are dealing with an object */
! 18635: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 18636:
! 18637: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 18638: if (Z_REFCOUNT_P(retval) == 0) {
! 18639: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 18640: zval_dtor(retval);
! 18641: FREE_ZVAL(retval);
! 18642: }
! 18643: } else {
! 18644: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 18645: PZVAL_LOCK(retval);
! 18646: }
! 18647:
! 18648: if (1) {
! 18649: zval_ptr_dtor(&offset);
! 18650: } else {
! 18651: zval_dtor(free_op2.var);
! 18652: }
! 18653: }
! 18654:
! 18655: ZEND_VM_NEXT_OPCODE();
! 18656: }
! 18657:
! 18658: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18659: {
! 18660: return zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18661: }
! 18662:
! 18663: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18664: {
! 18665: zend_op *opline = EX(opline);
! 18666: zend_free_op free_op1, free_op2;
! 18667: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18668: zval **container;
! 18669:
! 18670: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 18671: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 18672: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 18673: }
! 18674:
! 18675: if (1) {
! 18676: MAKE_REAL_ZVAL_PTR(property);
! 18677: }
! 18678: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18679: if (IS_UNUSED == IS_VAR && !container) {
! 18680: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 18681: }
! 18682: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 18683: if (1) {
! 18684: zval_ptr_dtor(&property);
! 18685: } else {
! 18686: zval_dtor(free_op2.var);
! 18687: }
! 18688: if (IS_UNUSED == IS_VAR && 0 &&
! 18689: READY_TO_DESTROY(free_op1.var)) {
! 18690: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 18691: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 18692: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 18693: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 18694: }
! 18695: }
! 18696:
! 18697: /* We are going to assign the result by reference */
! 18698: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 18699: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 18700: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 18701: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 18702: }
! 18703:
! 18704: ZEND_VM_NEXT_OPCODE();
! 18705: }
! 18706:
! 18707: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18708: {
! 18709: zend_op *opline = EX(opline);
! 18710: zend_free_op free_op1, free_op2;
! 18711: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18712: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18713:
! 18714: if (1) {
! 18715: MAKE_REAL_ZVAL_PTR(property);
! 18716: }
! 18717: if (IS_UNUSED == IS_VAR && !container) {
! 18718: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 18719: }
! 18720: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 18721: if (1) {
! 18722: zval_ptr_dtor(&property);
! 18723: } else {
! 18724: zval_dtor(free_op2.var);
! 18725: }
! 18726: if (IS_UNUSED == IS_VAR && 0 &&
! 18727: READY_TO_DESTROY(free_op1.var)) {
! 18728: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 18729: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 18730: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 18731: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 18732: }
! 18733: }
! 18734:
! 18735: ZEND_VM_NEXT_OPCODE();
! 18736: }
! 18737:
! 18738: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18739: {
! 18740: return zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18741: }
! 18742:
! 18743: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18744: {
! 18745: zend_op *opline = EX(opline);
! 18746:
! 18747: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 18748: /* Behave like FETCH_OBJ_W */
! 18749: zend_free_op free_op1, free_op2;
! 18750: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18751: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18752:
! 18753: if (1) {
! 18754: MAKE_REAL_ZVAL_PTR(property);
! 18755: }
! 18756: if (IS_UNUSED == IS_VAR && !container) {
! 18757: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 18758: }
! 18759: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 18760: if (1) {
! 18761: zval_ptr_dtor(&property);
! 18762: } else {
! 18763: zval_dtor(free_op2.var);
! 18764: }
! 18765: if (IS_UNUSED == IS_VAR && 0 &&
! 18766: READY_TO_DESTROY(free_op1.var)) {
! 18767: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 18768: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 18769: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 18770: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 18771: }
! 18772: }
! 18773:
! 18774: ZEND_VM_NEXT_OPCODE();
! 18775: } else {
! 18776: return zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18777: }
! 18778: }
! 18779:
! 18780: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18781: {
! 18782: zend_op *opline = EX(opline);
! 18783: zend_free_op free_op1, free_op2, free_res;
! 18784: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18785: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18786:
! 18787: if (IS_UNUSED == IS_CV) {
! 18788: if (container != &EG(uninitialized_zval_ptr)) {
! 18789: SEPARATE_ZVAL_IF_NOT_REF(container);
! 18790: }
! 18791: }
! 18792: if (1) {
! 18793: MAKE_REAL_ZVAL_PTR(property);
! 18794: }
! 18795: if (IS_UNUSED == IS_VAR && !container) {
! 18796: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 18797: }
! 18798: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 18799: if (1) {
! 18800: zval_ptr_dtor(&property);
! 18801: } else {
! 18802: zval_dtor(free_op2.var);
! 18803: }
! 18804: if (IS_UNUSED == IS_VAR && 0 &&
! 18805: READY_TO_DESTROY(free_op1.var)) {
! 18806: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 18807: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 18808: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 18809: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 18810: }
! 18811: }
! 18812:
! 18813: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 18814: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 18815: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 18816: }
! 18817: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 18818: FREE_OP_VAR_PTR(free_res);
! 18819: ZEND_VM_NEXT_OPCODE();
! 18820: }
! 18821:
! 18822: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18823: {
! 18824: zend_op *opline = EX(opline);
! 18825: zend_op *op_data = opline+1;
! 18826: zend_free_op free_op2;
! 18827: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18828: zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18829:
! 18830: if (1) {
! 18831: MAKE_REAL_ZVAL_PTR(property_name);
! 18832: }
! 18833: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 18834: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 18835: }
! 18836: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 18837: if (1) {
! 18838: zval_ptr_dtor(&property_name);
! 18839: } else {
! 18840: zval_dtor(free_op2.var);
! 18841: }
! 18842:
! 18843: /* assign_obj has two opcodes! */
! 18844: ZEND_VM_INC_OPCODE();
! 18845: ZEND_VM_NEXT_OPCODE();
! 18846: }
! 18847:
! 18848: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18849: {
! 18850: zend_op *opline = EX(opline);
! 18851: zend_free_op free_op2;
! 18852: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 18853: zval *var = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18854: zval var_copy;
! 18855: int use_copy = 0;
! 18856:
! 18857: if (IS_UNUSED == IS_UNUSED) {
! 18858: /* Initialize for erealloc in add_string_to_string */
! 18859: Z_STRVAL_P(str) = NULL;
! 18860: Z_STRLEN_P(str) = 0;
! 18861: Z_TYPE_P(str) = IS_STRING;
! 18862:
! 18863: INIT_PZVAL(str);
! 18864: }
! 18865:
! 18866: if (Z_TYPE_P(var) != IS_STRING) {
! 18867: zend_make_printable_zval(var, &var_copy, &use_copy);
! 18868:
! 18869: if (use_copy) {
! 18870: var = &var_copy;
! 18871: }
! 18872: }
! 18873: add_string_to_string(str, str, var);
! 18874:
! 18875: if (use_copy) {
! 18876: zval_dtor(var);
! 18877: }
! 18878: /* original comment, possibly problematic:
! 18879: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 18880: * (Zeev): I don't think it's problematic, we only use variables
! 18881: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 18882: * string offsets or overloaded objects
! 18883: */
! 18884: zval_dtor(free_op2.var);
! 18885:
! 18886: ZEND_VM_NEXT_OPCODE();
! 18887: }
! 18888:
! 18889: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18890: {
! 18891: zend_op *opline = EX(opline);
! 18892: zval *function_name;
! 18893: char *function_name_strval;
! 18894: int function_name_strlen;
! 18895: zend_free_op free_op2;
! 18896:
! 18897: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 18898:
! 18899: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18900:
! 18901: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 18902: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 18903: }
! 18904:
! 18905: function_name_strval = Z_STRVAL_P(function_name);
! 18906: function_name_strlen = Z_STRLEN_P(function_name);
! 18907:
! 18908: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
! 18909:
! 18910: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 18911: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 18912: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 18913: }
! 18914:
! 18915: /* First, locate the function. */
! 18916: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 18917: if (!EX(fbc)) {
! 18918: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 18919: }
! 18920:
! 18921: EX(called_scope) = Z_OBJCE_P(EX(object));
! 18922: } else {
! 18923: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 18924: }
! 18925:
! 18926: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 18927: EX(object) = NULL;
! 18928: } else {
! 18929: if (!PZVAL_IS_REF(EX(object))) {
! 18930: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 18931: } else {
! 18932: zval *this_ptr;
! 18933: ALLOC_ZVAL(this_ptr);
! 18934: INIT_PZVAL_COPY(this_ptr, EX(object));
! 18935: zval_copy_ctor(this_ptr);
! 18936: EX(object) = this_ptr;
! 18937: }
! 18938: }
! 18939:
! 18940: zval_dtor(free_op2.var);
! 18941:
! 18942: ZEND_VM_NEXT_OPCODE();
! 18943: }
! 18944:
! 18945: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18946: {
! 18947: zend_op *opline = EX(opline);
! 18948:
! 18949: array_init(&EX_T(opline->result.u.var).tmp_var);
! 18950: if (IS_UNUSED == IS_UNUSED) {
! 18951: ZEND_VM_NEXT_OPCODE();
! 18952: #if 0 || IS_UNUSED != IS_UNUSED
! 18953: } else {
! 18954: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 18955: #endif
! 18956: }
! 18957: }
! 18958:
! 18959: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 18960: {
! 18961: zend_op *opline = EX(opline);
! 18962: zend_free_op free_op2;
! 18963: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 18964: zval *offset;
! 18965:
! 18966: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 18967: SEPARATE_ZVAL_IF_NOT_REF(container);
! 18968: }
! 18969: offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 18970:
! 18971: if (IS_UNUSED != IS_VAR || container) {
! 18972: switch (Z_TYPE_PP(container)) {
! 18973: case IS_ARRAY: {
! 18974: HashTable *ht = Z_ARRVAL_PP(container);
! 18975:
! 18976: switch (Z_TYPE_P(offset)) {
! 18977: case IS_DOUBLE:
! 18978: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 18979: break;
! 18980: case IS_RESOURCE:
! 18981: case IS_BOOL:
! 18982: case IS_LONG:
! 18983: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 18984: break;
! 18985: case IS_STRING:
! 18986: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 18987: Z_ADDREF_P(offset);
! 18988: }
! 18989: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 18990: ht == &EG(symbol_table)) {
! 18991: zend_execute_data *ex;
! 18992: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 18993:
! 18994: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 18995: if (ex->op_array && ex->symbol_table == ht) {
! 18996: int i;
! 18997:
! 18998: for (i = 0; i < ex->op_array->last_var; i++) {
! 18999: if (ex->op_array->vars[i].hash_value == hash_value &&
! 19000: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 19001: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 19002: ex->CVs[i] = NULL;
! 19003: break;
! 19004: }
! 19005: }
! 19006: }
! 19007: }
! 19008: }
! 19009: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 19010: zval_ptr_dtor(&offset);
! 19011: }
! 19012: break;
! 19013: case IS_NULL:
! 19014: zend_hash_del(ht, "", sizeof(""));
! 19015: break;
! 19016: default:
! 19017: zend_error(E_WARNING, "Illegal offset type in unset");
! 19018: break;
! 19019: }
! 19020: zval_dtor(free_op2.var);
! 19021: break;
! 19022: }
! 19023: case IS_OBJECT:
! 19024: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 19025: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 19026: }
! 19027: if (1) {
! 19028: MAKE_REAL_ZVAL_PTR(offset);
! 19029: }
! 19030: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 19031: if (1) {
! 19032: zval_ptr_dtor(&offset);
! 19033: } else {
! 19034: zval_dtor(free_op2.var);
! 19035: }
! 19036: break;
! 19037: case IS_STRING:
! 19038: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 19039: ZEND_VM_CONTINUE(); /* bailed out before */
! 19040: default:
! 19041: zval_dtor(free_op2.var);
! 19042: break;
! 19043: }
! 19044: } else {
! 19045: zval_dtor(free_op2.var);
! 19046: }
! 19047:
! 19048: ZEND_VM_NEXT_OPCODE();
! 19049: }
! 19050:
! 19051: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19052: {
! 19053: zend_op *opline = EX(opline);
! 19054: zend_free_op free_op2;
! 19055: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19056: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19057:
! 19058: if (IS_UNUSED != IS_VAR || container) {
! 19059: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 19060: SEPARATE_ZVAL_IF_NOT_REF(container);
! 19061: }
! 19062: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 19063: if (1) {
! 19064: MAKE_REAL_ZVAL_PTR(offset);
! 19065: }
! 19066: if (Z_OBJ_HT_P(*container)->unset_property) {
! 19067: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 19068: } else {
! 19069: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 19070: }
! 19071: if (1) {
! 19072: zval_ptr_dtor(&offset);
! 19073: } else {
! 19074: zval_dtor(free_op2.var);
! 19075: }
! 19076: } else {
! 19077: zval_dtor(free_op2.var);
! 19078: }
! 19079: } else {
! 19080: zval_dtor(free_op2.var);
! 19081: }
! 19082:
! 19083: ZEND_VM_NEXT_OPCODE();
! 19084: }
! 19085:
! 19086: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 19087: {
! 19088: zend_op *opline = EX(opline);
! 19089:
! 19090: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19091: zval **value = NULL;
! 19092: int result = 0;
! 19093:
! 19094: if (IS_UNUSED != IS_VAR || container) {
! 19095: zend_free_op free_op2;
! 19096: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19097:
! 19098: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 19099: HashTable *ht;
! 19100: int isset = 0;
! 19101:
! 19102: ht = Z_ARRVAL_PP(container);
! 19103:
! 19104: switch (Z_TYPE_P(offset)) {
! 19105: case IS_DOUBLE:
! 19106: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 19107: isset = 1;
! 19108: }
! 19109: break;
! 19110: case IS_RESOURCE:
! 19111: case IS_BOOL:
! 19112: case IS_LONG:
! 19113: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 19114: isset = 1;
! 19115: }
! 19116: break;
! 19117: case IS_STRING:
! 19118: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 19119: isset = 1;
! 19120: }
! 19121: break;
! 19122: case IS_NULL:
! 19123: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 19124: isset = 1;
! 19125: }
! 19126: break;
! 19127: default:
! 19128: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 19129:
! 19130: break;
! 19131: }
! 19132:
! 19133: switch (opline->extended_value) {
! 19134: case ZEND_ISSET:
! 19135: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 19136: result = 0;
! 19137: } else {
! 19138: result = isset;
! 19139: }
! 19140: break;
! 19141: case ZEND_ISEMPTY:
! 19142: if (!isset || !i_zend_is_true(*value)) {
! 19143: result = 0;
! 19144: } else {
! 19145: result = 1;
! 19146: }
! 19147: break;
! 19148: }
! 19149: zval_dtor(free_op2.var);
! 19150: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 19151: if (1) {
! 19152: MAKE_REAL_ZVAL_PTR(offset);
! 19153: }
! 19154: if (prop_dim) {
! 19155: if (Z_OBJ_HT_P(*container)->has_property) {
! 19156: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 19157: } else {
! 19158: zend_error(E_NOTICE, "Trying to check property of non-object");
! 19159: result = 0;
! 19160: }
! 19161: } else {
! 19162: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 19163: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 19164: } else {
! 19165: zend_error(E_NOTICE, "Trying to check element of non-array");
! 19166: result = 0;
! 19167: }
! 19168: }
! 19169: if (1) {
! 19170: zval_ptr_dtor(&offset);
! 19171: } else {
! 19172: zval_dtor(free_op2.var);
! 19173: }
! 19174: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 19175: zval tmp;
! 19176:
! 19177: if (Z_TYPE_P(offset) != IS_LONG) {
! 19178: tmp = *offset;
! 19179: zval_copy_ctor(&tmp);
! 19180: convert_to_long(&tmp);
! 19181: offset = &tmp;
! 19182: }
! 19183: if (Z_TYPE_P(offset) == IS_LONG) {
! 19184: switch (opline->extended_value) {
! 19185: case ZEND_ISSET:
! 19186: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 19187: result = 1;
! 19188: }
! 19189: break;
! 19190: case ZEND_ISEMPTY:
! 19191: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 19192: result = 1;
! 19193: }
! 19194: break;
! 19195: }
! 19196: }
! 19197: zval_dtor(free_op2.var);
! 19198: } else {
! 19199: zval_dtor(free_op2.var);
! 19200: }
! 19201: }
! 19202:
! 19203: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 19204:
! 19205: switch (opline->extended_value) {
! 19206: case ZEND_ISSET:
! 19207: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 19208: break;
! 19209: case ZEND_ISEMPTY:
! 19210: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 19211: break;
! 19212: }
! 19213:
! 19214: ZEND_VM_NEXT_OPCODE();
! 19215: }
! 19216:
! 19217: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19218: {
! 19219: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19220: }
! 19221:
! 19222: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19223: {
! 19224: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19225: }
! 19226:
! 19227: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 19228: {
! 19229: zend_op *opline = EX(opline);
! 19230: zend_op *op_data = opline+1;
! 19231: zend_free_op free_op2, free_op_data1;
! 19232: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19233: zval *object;
! 19234: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19235: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 19236: znode *result = &opline->result;
! 19237: int have_get_ptr = 0;
! 19238:
! 19239: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 19240: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 19241: }
! 19242:
! 19243: EX_T(result->u.var).var.ptr_ptr = NULL;
! 19244: make_real_object(object_ptr TSRMLS_CC);
! 19245: object = *object_ptr;
! 19246:
! 19247: if (Z_TYPE_P(object) != IS_OBJECT) {
! 19248: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 19249: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19250: FREE_OP(free_op_data1);
! 19251:
! 19252: if (!RETURN_VALUE_UNUSED(result)) {
! 19253: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 19254: EX_T(result->u.var).var.ptr_ptr = NULL;
! 19255: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 19256: }
! 19257: } else {
! 19258: /* here we are sure we are dealing with an object */
! 19259: if (0) {
! 19260: MAKE_REAL_ZVAL_PTR(property);
! 19261: }
! 19262:
! 19263: /* here property is a string */
! 19264: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 19265: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 19266: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 19267: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 19268: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 19269:
! 19270: have_get_ptr = 1;
! 19271: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 19272: if (!RETURN_VALUE_UNUSED(result)) {
! 19273: EX_T(result->u.var).var.ptr = *zptr;
! 19274: EX_T(result->u.var).var.ptr_ptr = NULL;
! 19275: PZVAL_LOCK(*zptr);
! 19276: }
! 19277: }
! 19278: }
! 19279:
! 19280: if (!have_get_ptr) {
! 19281: zval *z = NULL;
! 19282:
! 19283: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 19284: if (Z_OBJ_HT_P(object)->read_property) {
! 19285: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 19286: }
! 19287: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 19288: if (Z_OBJ_HT_P(object)->read_dimension) {
! 19289: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 19290: }
! 19291: }
! 19292: if (z) {
! 19293: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 19294: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 19295:
! 19296: if (Z_REFCOUNT_P(z) == 0) {
! 19297: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 19298: zval_dtor(z);
! 19299: FREE_ZVAL(z);
! 19300: }
! 19301: z = value;
! 19302: }
! 19303: Z_ADDREF_P(z);
! 19304: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 19305: binary_op(z, z, value TSRMLS_CC);
! 19306: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 19307: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 19308: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 19309: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 19310: }
! 19311: if (!RETURN_VALUE_UNUSED(result)) {
! 19312: EX_T(result->u.var).var.ptr = z;
! 19313: EX_T(result->u.var).var.ptr_ptr = NULL;
! 19314: PZVAL_LOCK(z);
! 19315: }
! 19316: zval_ptr_dtor(&z);
! 19317: } else {
! 19318: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 19319: if (!RETURN_VALUE_UNUSED(result)) {
! 19320: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 19321: EX_T(result->u.var).var.ptr_ptr = NULL;
! 19322: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 19323: }
! 19324: }
! 19325: }
! 19326:
! 19327: if (0) {
! 19328: zval_ptr_dtor(&property);
! 19329: } else {
! 19330: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19331: }
! 19332: FREE_OP(free_op_data1);
! 19333: }
! 19334:
! 19335: /* assign_obj has two opcodes! */
! 19336: ZEND_VM_INC_OPCODE();
! 19337: ZEND_VM_NEXT_OPCODE();
! 19338: }
! 19339:
! 19340: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 19341: {
! 19342: zend_op *opline = EX(opline);
! 19343: zend_free_op free_op2, free_op_data2, free_op_data1;
! 19344: zval **var_ptr;
! 19345: zval *value;
! 19346:
! 19347: switch (opline->extended_value) {
! 19348: case ZEND_ASSIGN_OBJ:
! 19349: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19350: break;
! 19351: case ZEND_ASSIGN_DIM: {
! 19352: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19353:
! 19354: if (IS_UNUSED == IS_VAR && !container) {
! 19355: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 19356: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 19357: if (IS_UNUSED == IS_VAR && !0) {
! 19358: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 19359: }
! 19360: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19361: } else {
! 19362: zend_op *op_data = opline+1;
! 19363: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19364:
! 19365: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 19366: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 19367: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 19368: ZEND_VM_INC_OPCODE();
! 19369: }
! 19370: }
! 19371: break;
! 19372: default:
! 19373: value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19374: var_ptr = NULL;
! 19375: /* do nothing */
! 19376: break;
! 19377: }
! 19378:
! 19379: if (!var_ptr) {
! 19380: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 19381: }
! 19382:
! 19383: if (*var_ptr == EG(error_zval_ptr)) {
! 19384: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19385: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 19386: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 19387: }
! 19388: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19389:
! 19390: ZEND_VM_NEXT_OPCODE();
! 19391: }
! 19392:
! 19393: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 19394:
! 19395: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 19396: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 19397: /* proxy object */
! 19398: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 19399: Z_ADDREF_P(objval);
! 19400: binary_op(objval, objval, value TSRMLS_CC);
! 19401: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 19402: zval_ptr_dtor(&objval);
! 19403: } else {
! 19404: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 19405: }
! 19406:
! 19407: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19408: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 19409: PZVAL_LOCK(*var_ptr);
! 19410: }
! 19411: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19412:
! 19413: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 19414: FREE_OP(free_op_data1);
! 19415: FREE_OP_VAR_PTR(free_op_data2);
! 19416: }
! 19417:
! 19418: ZEND_VM_NEXT_OPCODE();
! 19419: }
! 19420:
! 19421: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19422: {
! 19423: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19424: }
! 19425:
! 19426: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19427: {
! 19428: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19429: }
! 19430:
! 19431: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19432: {
! 19433: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19434: }
! 19435:
! 19436: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19437: {
! 19438: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19439: }
! 19440:
! 19441: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19442: {
! 19443: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19444: }
! 19445:
! 19446: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19447: {
! 19448: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19449: }
! 19450:
! 19451: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19452: {
! 19453: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19454: }
! 19455:
! 19456: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19457: {
! 19458: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19459: }
! 19460:
! 19461: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19462: {
! 19463: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19464: }
! 19465:
! 19466: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19467: {
! 19468: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19469: }
! 19470:
! 19471: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19472: {
! 19473: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19474: }
! 19475:
! 19476: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 19477: {
! 19478: zend_op *opline = EX(opline);
! 19479: zend_free_op free_op2;
! 19480: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19481: zval *object;
! 19482: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19483: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 19484: int have_get_ptr = 0;
! 19485:
! 19486: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 19487: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 19488: }
! 19489:
! 19490: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 19491: object = *object_ptr;
! 19492:
! 19493: if (Z_TYPE_P(object) != IS_OBJECT) {
! 19494: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 19495: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19496: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19497: *retval = EG(uninitialized_zval_ptr);
! 19498: PZVAL_LOCK(*retval);
! 19499: }
! 19500:
! 19501: ZEND_VM_NEXT_OPCODE();
! 19502: }
! 19503:
! 19504: /* here we are sure we are dealing with an object */
! 19505:
! 19506: if (0) {
! 19507: MAKE_REAL_ZVAL_PTR(property);
! 19508: }
! 19509:
! 19510: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 19511: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 19512: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 19513: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 19514:
! 19515: have_get_ptr = 1;
! 19516: incdec_op(*zptr);
! 19517: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19518: *retval = *zptr;
! 19519: PZVAL_LOCK(*retval);
! 19520: }
! 19521: }
! 19522: }
! 19523:
! 19524: if (!have_get_ptr) {
! 19525: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 19526: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 19527:
! 19528: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 19529: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 19530:
! 19531: if (Z_REFCOUNT_P(z) == 0) {
! 19532: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 19533: zval_dtor(z);
! 19534: FREE_ZVAL(z);
! 19535: }
! 19536: z = value;
! 19537: }
! 19538: Z_ADDREF_P(z);
! 19539: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 19540: incdec_op(z);
! 19541: *retval = z;
! 19542: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 19543: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 19544: zval_ptr_dtor(&z);
! 19545: } else {
! 19546: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 19547: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19548: *retval = EG(uninitialized_zval_ptr);
! 19549: PZVAL_LOCK(*retval);
! 19550: }
! 19551: }
! 19552: }
! 19553:
! 19554: if (0) {
! 19555: zval_ptr_dtor(&property);
! 19556: } else {
! 19557: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19558: }
! 19559:
! 19560: ZEND_VM_NEXT_OPCODE();
! 19561: }
! 19562:
! 19563: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19564: {
! 19565: return zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19566: }
! 19567:
! 19568: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19569: {
! 19570: return zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19571: }
! 19572:
! 19573: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 19574: {
! 19575: zend_op *opline = EX(opline);
! 19576: zend_free_op free_op2;
! 19577: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19578: zval *object;
! 19579: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19580: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 19581: int have_get_ptr = 0;
! 19582:
! 19583: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 19584: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 19585: }
! 19586:
! 19587: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 19588: object = *object_ptr;
! 19589:
! 19590: if (Z_TYPE_P(object) != IS_OBJECT) {
! 19591: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 19592: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19593: *retval = *EG(uninitialized_zval_ptr);
! 19594:
! 19595: ZEND_VM_NEXT_OPCODE();
! 19596: }
! 19597:
! 19598: /* here we are sure we are dealing with an object */
! 19599:
! 19600: if (0) {
! 19601: MAKE_REAL_ZVAL_PTR(property);
! 19602: }
! 19603:
! 19604: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 19605: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 19606: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 19607: have_get_ptr = 1;
! 19608: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 19609:
! 19610: *retval = **zptr;
! 19611: zendi_zval_copy_ctor(*retval);
! 19612:
! 19613: incdec_op(*zptr);
! 19614:
! 19615: }
! 19616: }
! 19617:
! 19618: if (!have_get_ptr) {
! 19619: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 19620: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 19621: zval *z_copy;
! 19622:
! 19623: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 19624: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 19625:
! 19626: if (Z_REFCOUNT_P(z) == 0) {
! 19627: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 19628: zval_dtor(z);
! 19629: FREE_ZVAL(z);
! 19630: }
! 19631: z = value;
! 19632: }
! 19633: *retval = *z;
! 19634: zendi_zval_copy_ctor(*retval);
! 19635: ALLOC_ZVAL(z_copy);
! 19636: *z_copy = *z;
! 19637: zendi_zval_copy_ctor(*z_copy);
! 19638: INIT_PZVAL(z_copy);
! 19639: incdec_op(z_copy);
! 19640: Z_ADDREF_P(z);
! 19641: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 19642: zval_ptr_dtor(&z_copy);
! 19643: zval_ptr_dtor(&z);
! 19644: } else {
! 19645: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 19646: *retval = *EG(uninitialized_zval_ptr);
! 19647: }
! 19648: }
! 19649:
! 19650: if (0) {
! 19651: zval_ptr_dtor(&property);
! 19652: } else {
! 19653: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19654: }
! 19655:
! 19656: ZEND_VM_NEXT_OPCODE();
! 19657: }
! 19658:
! 19659: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19660: {
! 19661: return zend_post_incdec_property_helper_SPEC_UNUSED_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19662: }
! 19663:
! 19664: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19665: {
! 19666: return zend_post_incdec_property_helper_SPEC_UNUSED_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19667: }
! 19668:
! 19669: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
! 19670: {
! 19671: zend_op *opline = EX(opline);
! 19672:
! 19673: zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
! 19674: zend_free_op free_op2;
! 19675: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19676:
! 19677: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 19678: if (type != BP_VAR_IS) {
! 19679: zend_error(E_NOTICE, "Trying to get property of non-object");
! 19680: }
! 19681: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 19682: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 19683: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 19684: }
! 19685: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19686: } else {
! 19687: zval *retval;
! 19688:
! 19689: if (0) {
! 19690: MAKE_REAL_ZVAL_PTR(offset);
! 19691: }
! 19692:
! 19693: /* here we are sure we are dealing with an object */
! 19694: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 19695:
! 19696: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 19697: if (Z_REFCOUNT_P(retval) == 0) {
! 19698: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 19699: zval_dtor(retval);
! 19700: FREE_ZVAL(retval);
! 19701: }
! 19702: } else {
! 19703: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 19704: PZVAL_LOCK(retval);
! 19705: }
! 19706:
! 19707: if (0) {
! 19708: zval_ptr_dtor(&offset);
! 19709: } else {
! 19710: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19711: }
! 19712: }
! 19713:
! 19714: ZEND_VM_NEXT_OPCODE();
! 19715: }
! 19716:
! 19717: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19718: {
! 19719: return zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19720: }
! 19721:
! 19722: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19723: {
! 19724: zend_op *opline = EX(opline);
! 19725: zend_free_op free_op1, free_op2;
! 19726: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19727: zval **container;
! 19728:
! 19729: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 19730: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 19731: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 19732: }
! 19733:
! 19734: if (0) {
! 19735: MAKE_REAL_ZVAL_PTR(property);
! 19736: }
! 19737: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19738: if (IS_UNUSED == IS_VAR && !container) {
! 19739: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 19740: }
! 19741: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 19742: if (0) {
! 19743: zval_ptr_dtor(&property);
! 19744: } else {
! 19745: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19746: }
! 19747: if (IS_UNUSED == IS_VAR && 0 &&
! 19748: READY_TO_DESTROY(free_op1.var)) {
! 19749: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 19750: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 19751: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 19752: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 19753: }
! 19754: }
! 19755:
! 19756: /* We are going to assign the result by reference */
! 19757: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 19758: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 19759: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 19760: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 19761: }
! 19762:
! 19763: ZEND_VM_NEXT_OPCODE();
! 19764: }
! 19765:
! 19766: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19767: {
! 19768: zend_op *opline = EX(opline);
! 19769: zend_free_op free_op1, free_op2;
! 19770: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19771: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19772:
! 19773: if (0) {
! 19774: MAKE_REAL_ZVAL_PTR(property);
! 19775: }
! 19776: if (IS_UNUSED == IS_VAR && !container) {
! 19777: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 19778: }
! 19779: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 19780: if (0) {
! 19781: zval_ptr_dtor(&property);
! 19782: } else {
! 19783: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19784: }
! 19785: if (IS_UNUSED == IS_VAR && 0 &&
! 19786: READY_TO_DESTROY(free_op1.var)) {
! 19787: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 19788: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 19789: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 19790: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 19791: }
! 19792: }
! 19793:
! 19794: ZEND_VM_NEXT_OPCODE();
! 19795: }
! 19796:
! 19797: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19798: {
! 19799: return zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19800: }
! 19801:
! 19802: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19803: {
! 19804: zend_op *opline = EX(opline);
! 19805:
! 19806: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 19807: /* Behave like FETCH_OBJ_W */
! 19808: zend_free_op free_op1, free_op2;
! 19809: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19810: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19811:
! 19812: if (0) {
! 19813: MAKE_REAL_ZVAL_PTR(property);
! 19814: }
! 19815: if (IS_UNUSED == IS_VAR && !container) {
! 19816: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 19817: }
! 19818: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 19819: if (0) {
! 19820: zval_ptr_dtor(&property);
! 19821: } else {
! 19822: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19823: }
! 19824: if (IS_UNUSED == IS_VAR && 0 &&
! 19825: READY_TO_DESTROY(free_op1.var)) {
! 19826: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 19827: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 19828: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 19829: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 19830: }
! 19831: }
! 19832:
! 19833: ZEND_VM_NEXT_OPCODE();
! 19834: } else {
! 19835: return zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 19836: }
! 19837: }
! 19838:
! 19839: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19840: {
! 19841: zend_op *opline = EX(opline);
! 19842: zend_free_op free_op1, free_op2, free_res;
! 19843: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19844: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19845:
! 19846: if (IS_UNUSED == IS_CV) {
! 19847: if (container != &EG(uninitialized_zval_ptr)) {
! 19848: SEPARATE_ZVAL_IF_NOT_REF(container);
! 19849: }
! 19850: }
! 19851: if (0) {
! 19852: MAKE_REAL_ZVAL_PTR(property);
! 19853: }
! 19854: if (IS_UNUSED == IS_VAR && !container) {
! 19855: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 19856: }
! 19857: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 19858: if (0) {
! 19859: zval_ptr_dtor(&property);
! 19860: } else {
! 19861: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19862: }
! 19863: if (IS_UNUSED == IS_VAR && 0 &&
! 19864: READY_TO_DESTROY(free_op1.var)) {
! 19865: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 19866: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 19867: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 19868: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 19869: }
! 19870: }
! 19871:
! 19872: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 19873: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 19874: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 19875: }
! 19876: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 19877: FREE_OP_VAR_PTR(free_res);
! 19878: ZEND_VM_NEXT_OPCODE();
! 19879: }
! 19880:
! 19881: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19882: {
! 19883: zend_op *opline = EX(opline);
! 19884: zend_op *op_data = opline+1;
! 19885: zend_free_op free_op2;
! 19886: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 19887: zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19888:
! 19889: if (0) {
! 19890: MAKE_REAL_ZVAL_PTR(property_name);
! 19891: }
! 19892: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 19893: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 19894: }
! 19895: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 19896: if (0) {
! 19897: zval_ptr_dtor(&property_name);
! 19898: } else {
! 19899: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19900: }
! 19901:
! 19902: /* assign_obj has two opcodes! */
! 19903: ZEND_VM_INC_OPCODE();
! 19904: ZEND_VM_NEXT_OPCODE();
! 19905: }
! 19906:
! 19907: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19908: {
! 19909: zend_op *opline = EX(opline);
! 19910: zend_free_op free_op2;
! 19911: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 19912: zval *var = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19913: zval var_copy;
! 19914: int use_copy = 0;
! 19915:
! 19916: if (IS_UNUSED == IS_UNUSED) {
! 19917: /* Initialize for erealloc in add_string_to_string */
! 19918: Z_STRVAL_P(str) = NULL;
! 19919: Z_STRLEN_P(str) = 0;
! 19920: Z_TYPE_P(str) = IS_STRING;
! 19921:
! 19922: INIT_PZVAL(str);
! 19923: }
! 19924:
! 19925: if (Z_TYPE_P(var) != IS_STRING) {
! 19926: zend_make_printable_zval(var, &var_copy, &use_copy);
! 19927:
! 19928: if (use_copy) {
! 19929: var = &var_copy;
! 19930: }
! 19931: }
! 19932: add_string_to_string(str, str, var);
! 19933:
! 19934: if (use_copy) {
! 19935: zval_dtor(var);
! 19936: }
! 19937: /* original comment, possibly problematic:
! 19938: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 19939: * (Zeev): I don't think it's problematic, we only use variables
! 19940: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 19941: * string offsets or overloaded objects
! 19942: */
! 19943: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 19944:
! 19945: ZEND_VM_NEXT_OPCODE();
! 19946: }
! 19947:
! 19948: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 19949: {
! 19950: zend_op *opline = EX(opline);
! 19951: zval *function_name;
! 19952: char *function_name_strval;
! 19953: int function_name_strlen;
! 19954: zend_free_op free_op2;
! 19955:
! 19956: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 19957:
! 19958: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 19959:
! 19960: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 19961: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 19962: }
! 19963:
! 19964: function_name_strval = Z_STRVAL_P(function_name);
! 19965: function_name_strlen = Z_STRLEN_P(function_name);
! 19966:
! 19967: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
! 19968:
! 19969: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 19970: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 19971: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 19972: }
! 19973:
! 19974: /* First, locate the function. */
! 19975: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 19976: if (!EX(fbc)) {
! 19977: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 19978: }
! 19979:
! 19980: EX(called_scope) = Z_OBJCE_P(EX(object));
! 19981: } else {
! 19982: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 19983: }
! 19984:
! 19985: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 19986: EX(object) = NULL;
! 19987: } else {
! 19988: if (!PZVAL_IS_REF(EX(object))) {
! 19989: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 19990: } else {
! 19991: zval *this_ptr;
! 19992: ALLOC_ZVAL(this_ptr);
! 19993: INIT_PZVAL_COPY(this_ptr, EX(object));
! 19994: zval_copy_ctor(this_ptr);
! 19995: EX(object) = this_ptr;
! 19996: }
! 19997: }
! 19998:
! 19999: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20000:
! 20001: ZEND_VM_NEXT_OPCODE();
! 20002: }
! 20003:
! 20004: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20005: {
! 20006: zend_op *opline = EX(opline);
! 20007:
! 20008: array_init(&EX_T(opline->result.u.var).tmp_var);
! 20009: if (IS_UNUSED == IS_UNUSED) {
! 20010: ZEND_VM_NEXT_OPCODE();
! 20011: #if 0 || IS_UNUSED != IS_UNUSED
! 20012: } else {
! 20013: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20014: #endif
! 20015: }
! 20016: }
! 20017:
! 20018: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20019: {
! 20020: zend_op *opline = EX(opline);
! 20021: zend_free_op free_op2;
! 20022: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20023: zval *offset;
! 20024:
! 20025: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 20026: SEPARATE_ZVAL_IF_NOT_REF(container);
! 20027: }
! 20028: offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 20029:
! 20030: if (IS_UNUSED != IS_VAR || container) {
! 20031: switch (Z_TYPE_PP(container)) {
! 20032: case IS_ARRAY: {
! 20033: HashTable *ht = Z_ARRVAL_PP(container);
! 20034:
! 20035: switch (Z_TYPE_P(offset)) {
! 20036: case IS_DOUBLE:
! 20037: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 20038: break;
! 20039: case IS_RESOURCE:
! 20040: case IS_BOOL:
! 20041: case IS_LONG:
! 20042: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 20043: break;
! 20044: case IS_STRING:
! 20045: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 20046: Z_ADDREF_P(offset);
! 20047: }
! 20048: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 20049: ht == &EG(symbol_table)) {
! 20050: zend_execute_data *ex;
! 20051: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 20052:
! 20053: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 20054: if (ex->op_array && ex->symbol_table == ht) {
! 20055: int i;
! 20056:
! 20057: for (i = 0; i < ex->op_array->last_var; i++) {
! 20058: if (ex->op_array->vars[i].hash_value == hash_value &&
! 20059: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 20060: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 20061: ex->CVs[i] = NULL;
! 20062: break;
! 20063: }
! 20064: }
! 20065: }
! 20066: }
! 20067: }
! 20068: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 20069: zval_ptr_dtor(&offset);
! 20070: }
! 20071: break;
! 20072: case IS_NULL:
! 20073: zend_hash_del(ht, "", sizeof(""));
! 20074: break;
! 20075: default:
! 20076: zend_error(E_WARNING, "Illegal offset type in unset");
! 20077: break;
! 20078: }
! 20079: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20080: break;
! 20081: }
! 20082: case IS_OBJECT:
! 20083: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 20084: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 20085: }
! 20086: if (0) {
! 20087: MAKE_REAL_ZVAL_PTR(offset);
! 20088: }
! 20089: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 20090: if (0) {
! 20091: zval_ptr_dtor(&offset);
! 20092: } else {
! 20093: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20094: }
! 20095: break;
! 20096: case IS_STRING:
! 20097: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 20098: ZEND_VM_CONTINUE(); /* bailed out before */
! 20099: default:
! 20100: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20101: break;
! 20102: }
! 20103: } else {
! 20104: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20105: }
! 20106:
! 20107: ZEND_VM_NEXT_OPCODE();
! 20108: }
! 20109:
! 20110: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20111: {
! 20112: zend_op *opline = EX(opline);
! 20113: zend_free_op free_op2;
! 20114: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20115: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 20116:
! 20117: if (IS_UNUSED != IS_VAR || container) {
! 20118: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 20119: SEPARATE_ZVAL_IF_NOT_REF(container);
! 20120: }
! 20121: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 20122: if (0) {
! 20123: MAKE_REAL_ZVAL_PTR(offset);
! 20124: }
! 20125: if (Z_OBJ_HT_P(*container)->unset_property) {
! 20126: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 20127: } else {
! 20128: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 20129: }
! 20130: if (0) {
! 20131: zval_ptr_dtor(&offset);
! 20132: } else {
! 20133: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20134: }
! 20135: } else {
! 20136: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20137: }
! 20138: } else {
! 20139: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20140: }
! 20141:
! 20142: ZEND_VM_NEXT_OPCODE();
! 20143: }
! 20144:
! 20145: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 20146: {
! 20147: zend_op *opline = EX(opline);
! 20148:
! 20149: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20150: zval **value = NULL;
! 20151: int result = 0;
! 20152:
! 20153: if (IS_UNUSED != IS_VAR || container) {
! 20154: zend_free_op free_op2;
! 20155: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 20156:
! 20157: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 20158: HashTable *ht;
! 20159: int isset = 0;
! 20160:
! 20161: ht = Z_ARRVAL_PP(container);
! 20162:
! 20163: switch (Z_TYPE_P(offset)) {
! 20164: case IS_DOUBLE:
! 20165: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 20166: isset = 1;
! 20167: }
! 20168: break;
! 20169: case IS_RESOURCE:
! 20170: case IS_BOOL:
! 20171: case IS_LONG:
! 20172: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 20173: isset = 1;
! 20174: }
! 20175: break;
! 20176: case IS_STRING:
! 20177: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 20178: isset = 1;
! 20179: }
! 20180: break;
! 20181: case IS_NULL:
! 20182: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 20183: isset = 1;
! 20184: }
! 20185: break;
! 20186: default:
! 20187: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 20188:
! 20189: break;
! 20190: }
! 20191:
! 20192: switch (opline->extended_value) {
! 20193: case ZEND_ISSET:
! 20194: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 20195: result = 0;
! 20196: } else {
! 20197: result = isset;
! 20198: }
! 20199: break;
! 20200: case ZEND_ISEMPTY:
! 20201: if (!isset || !i_zend_is_true(*value)) {
! 20202: result = 0;
! 20203: } else {
! 20204: result = 1;
! 20205: }
! 20206: break;
! 20207: }
! 20208: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20209: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 20210: if (0) {
! 20211: MAKE_REAL_ZVAL_PTR(offset);
! 20212: }
! 20213: if (prop_dim) {
! 20214: if (Z_OBJ_HT_P(*container)->has_property) {
! 20215: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 20216: } else {
! 20217: zend_error(E_NOTICE, "Trying to check property of non-object");
! 20218: result = 0;
! 20219: }
! 20220: } else {
! 20221: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 20222: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 20223: } else {
! 20224: zend_error(E_NOTICE, "Trying to check element of non-array");
! 20225: result = 0;
! 20226: }
! 20227: }
! 20228: if (0) {
! 20229: zval_ptr_dtor(&offset);
! 20230: } else {
! 20231: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20232: }
! 20233: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 20234: zval tmp;
! 20235:
! 20236: if (Z_TYPE_P(offset) != IS_LONG) {
! 20237: tmp = *offset;
! 20238: zval_copy_ctor(&tmp);
! 20239: convert_to_long(&tmp);
! 20240: offset = &tmp;
! 20241: }
! 20242: if (Z_TYPE_P(offset) == IS_LONG) {
! 20243: switch (opline->extended_value) {
! 20244: case ZEND_ISSET:
! 20245: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 20246: result = 1;
! 20247: }
! 20248: break;
! 20249: case ZEND_ISEMPTY:
! 20250: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 20251: result = 1;
! 20252: }
! 20253: break;
! 20254: }
! 20255: }
! 20256: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20257: } else {
! 20258: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 20259: }
! 20260: }
! 20261:
! 20262: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 20263:
! 20264: switch (opline->extended_value) {
! 20265: case ZEND_ISSET:
! 20266: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 20267: break;
! 20268: case ZEND_ISEMPTY:
! 20269: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 20270: break;
! 20271: }
! 20272:
! 20273: ZEND_VM_NEXT_OPCODE();
! 20274: }
! 20275:
! 20276: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20277: {
! 20278: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20279: }
! 20280:
! 20281: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20282: {
! 20283: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20284: }
! 20285:
! 20286: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 20287: {
! 20288: zend_op *opline = EX(opline);
! 20289: zend_op *op_data = opline+1;
! 20290: zend_free_op free_op_data1;
! 20291: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20292: zval *object;
! 20293: zval *property = NULL;
! 20294: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 20295: znode *result = &opline->result;
! 20296: int have_get_ptr = 0;
! 20297:
! 20298: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 20299: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 20300: }
! 20301:
! 20302: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20303: make_real_object(object_ptr TSRMLS_CC);
! 20304: object = *object_ptr;
! 20305:
! 20306: if (Z_TYPE_P(object) != IS_OBJECT) {
! 20307: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 20308:
! 20309: FREE_OP(free_op_data1);
! 20310:
! 20311: if (!RETURN_VALUE_UNUSED(result)) {
! 20312: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 20313: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20314: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20315: }
! 20316: } else {
! 20317: /* here we are sure we are dealing with an object */
! 20318: if (0) {
! 20319: MAKE_REAL_ZVAL_PTR(property);
! 20320: }
! 20321:
! 20322: /* here property is a string */
! 20323: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 20324: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 20325: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 20326: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 20327: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 20328:
! 20329: have_get_ptr = 1;
! 20330: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 20331: if (!RETURN_VALUE_UNUSED(result)) {
! 20332: EX_T(result->u.var).var.ptr = *zptr;
! 20333: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20334: PZVAL_LOCK(*zptr);
! 20335: }
! 20336: }
! 20337: }
! 20338:
! 20339: if (!have_get_ptr) {
! 20340: zval *z = NULL;
! 20341:
! 20342: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 20343: if (Z_OBJ_HT_P(object)->read_property) {
! 20344: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 20345: }
! 20346: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 20347: if (Z_OBJ_HT_P(object)->read_dimension) {
! 20348: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 20349: }
! 20350: }
! 20351: if (z) {
! 20352: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 20353: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 20354:
! 20355: if (Z_REFCOUNT_P(z) == 0) {
! 20356: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 20357: zval_dtor(z);
! 20358: FREE_ZVAL(z);
! 20359: }
! 20360: z = value;
! 20361: }
! 20362: Z_ADDREF_P(z);
! 20363: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 20364: binary_op(z, z, value TSRMLS_CC);
! 20365: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 20366: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 20367: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 20368: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 20369: }
! 20370: if (!RETURN_VALUE_UNUSED(result)) {
! 20371: EX_T(result->u.var).var.ptr = z;
! 20372: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20373: PZVAL_LOCK(z);
! 20374: }
! 20375: zval_ptr_dtor(&z);
! 20376: } else {
! 20377: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 20378: if (!RETURN_VALUE_UNUSED(result)) {
! 20379: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 20380: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20381: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20382: }
! 20383: }
! 20384: }
! 20385:
! 20386: if (0) {
! 20387: zval_ptr_dtor(&property);
! 20388: } else {
! 20389:
! 20390: }
! 20391: FREE_OP(free_op_data1);
! 20392: }
! 20393:
! 20394: /* assign_obj has two opcodes! */
! 20395: ZEND_VM_INC_OPCODE();
! 20396: ZEND_VM_NEXT_OPCODE();
! 20397: }
! 20398:
! 20399: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 20400: {
! 20401: zend_op *opline = EX(opline);
! 20402: zend_free_op free_op_data2, free_op_data1;
! 20403: zval **var_ptr;
! 20404: zval *value;
! 20405:
! 20406: switch (opline->extended_value) {
! 20407: case ZEND_ASSIGN_OBJ:
! 20408: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20409: break;
! 20410: case ZEND_ASSIGN_DIM: {
! 20411: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20412:
! 20413: if (IS_UNUSED == IS_VAR && !container) {
! 20414: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 20415: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 20416: if (IS_UNUSED == IS_VAR && !0) {
! 20417: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 20418: }
! 20419: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20420: } else {
! 20421: zend_op *op_data = opline+1;
! 20422: zval *dim = NULL;
! 20423:
! 20424: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 20425: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 20426: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 20427: ZEND_VM_INC_OPCODE();
! 20428: }
! 20429: }
! 20430: break;
! 20431: default:
! 20432: value = NULL;
! 20433: var_ptr = NULL;
! 20434: /* do nothing */
! 20435: break;
! 20436: }
! 20437:
! 20438: if (!var_ptr) {
! 20439: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 20440: }
! 20441:
! 20442: if (*var_ptr == EG(error_zval_ptr)) {
! 20443: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20444: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 20445: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20446: }
! 20447:
! 20448:
! 20449: ZEND_VM_NEXT_OPCODE();
! 20450: }
! 20451:
! 20452: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 20453:
! 20454: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 20455: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 20456: /* proxy object */
! 20457: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 20458: Z_ADDREF_P(objval);
! 20459: binary_op(objval, objval, value TSRMLS_CC);
! 20460: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 20461: zval_ptr_dtor(&objval);
! 20462: } else {
! 20463: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 20464: }
! 20465:
! 20466: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20467: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 20468: PZVAL_LOCK(*var_ptr);
! 20469: }
! 20470:
! 20471: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 20472: FREE_OP(free_op_data1);
! 20473: FREE_OP_VAR_PTR(free_op_data2);
! 20474: }
! 20475:
! 20476: ZEND_VM_NEXT_OPCODE();
! 20477: }
! 20478:
! 20479: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20480: {
! 20481: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20482: }
! 20483:
! 20484: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20485: {
! 20486: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20487: }
! 20488:
! 20489: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20490: {
! 20491: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20492: }
! 20493:
! 20494: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20495: {
! 20496: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20497: }
! 20498:
! 20499: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20500: {
! 20501: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20502: }
! 20503:
! 20504: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20505: {
! 20506: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20507: }
! 20508:
! 20509: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20510: {
! 20511: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20512: }
! 20513:
! 20514: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20515: {
! 20516: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20517: }
! 20518:
! 20519: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20520: {
! 20521: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20522: }
! 20523:
! 20524: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20525: {
! 20526: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20527: }
! 20528:
! 20529: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20530: {
! 20531: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20532: }
! 20533:
! 20534: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20535: {
! 20536: zend_op *opline = EX(opline);
! 20537:
! 20538: array_init(&EX_T(opline->result.u.var).tmp_var);
! 20539: if (IS_UNUSED == IS_UNUSED) {
! 20540: ZEND_VM_NEXT_OPCODE();
! 20541: #if 0 || IS_UNUSED != IS_UNUSED
! 20542: } else {
! 20543: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20544: #endif
! 20545: }
! 20546: }
! 20547:
! 20548: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 20549: {
! 20550: zend_op *opline = EX(opline);
! 20551: zend_op *op_data = opline+1;
! 20552: zend_free_op free_op_data1;
! 20553: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20554: zval *object;
! 20555: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20556: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 20557: znode *result = &opline->result;
! 20558: int have_get_ptr = 0;
! 20559:
! 20560: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 20561: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 20562: }
! 20563:
! 20564: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20565: make_real_object(object_ptr TSRMLS_CC);
! 20566: object = *object_ptr;
! 20567:
! 20568: if (Z_TYPE_P(object) != IS_OBJECT) {
! 20569: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 20570:
! 20571: FREE_OP(free_op_data1);
! 20572:
! 20573: if (!RETURN_VALUE_UNUSED(result)) {
! 20574: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 20575: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20576: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20577: }
! 20578: } else {
! 20579: /* here we are sure we are dealing with an object */
! 20580: if (0) {
! 20581: MAKE_REAL_ZVAL_PTR(property);
! 20582: }
! 20583:
! 20584: /* here property is a string */
! 20585: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 20586: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 20587: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 20588: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 20589: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 20590:
! 20591: have_get_ptr = 1;
! 20592: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 20593: if (!RETURN_VALUE_UNUSED(result)) {
! 20594: EX_T(result->u.var).var.ptr = *zptr;
! 20595: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20596: PZVAL_LOCK(*zptr);
! 20597: }
! 20598: }
! 20599: }
! 20600:
! 20601: if (!have_get_ptr) {
! 20602: zval *z = NULL;
! 20603:
! 20604: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 20605: if (Z_OBJ_HT_P(object)->read_property) {
! 20606: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 20607: }
! 20608: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 20609: if (Z_OBJ_HT_P(object)->read_dimension) {
! 20610: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 20611: }
! 20612: }
! 20613: if (z) {
! 20614: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 20615: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 20616:
! 20617: if (Z_REFCOUNT_P(z) == 0) {
! 20618: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 20619: zval_dtor(z);
! 20620: FREE_ZVAL(z);
! 20621: }
! 20622: z = value;
! 20623: }
! 20624: Z_ADDREF_P(z);
! 20625: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 20626: binary_op(z, z, value TSRMLS_CC);
! 20627: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 20628: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 20629: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 20630: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 20631: }
! 20632: if (!RETURN_VALUE_UNUSED(result)) {
! 20633: EX_T(result->u.var).var.ptr = z;
! 20634: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20635: PZVAL_LOCK(z);
! 20636: }
! 20637: zval_ptr_dtor(&z);
! 20638: } else {
! 20639: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 20640: if (!RETURN_VALUE_UNUSED(result)) {
! 20641: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 20642: EX_T(result->u.var).var.ptr_ptr = NULL;
! 20643: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20644: }
! 20645: }
! 20646: }
! 20647:
! 20648: if (0) {
! 20649: zval_ptr_dtor(&property);
! 20650: } else {
! 20651:
! 20652: }
! 20653: FREE_OP(free_op_data1);
! 20654: }
! 20655:
! 20656: /* assign_obj has two opcodes! */
! 20657: ZEND_VM_INC_OPCODE();
! 20658: ZEND_VM_NEXT_OPCODE();
! 20659: }
! 20660:
! 20661: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 20662: {
! 20663: zend_op *opline = EX(opline);
! 20664: zend_free_op free_op_data2, free_op_data1;
! 20665: zval **var_ptr;
! 20666: zval *value;
! 20667:
! 20668: switch (opline->extended_value) {
! 20669: case ZEND_ASSIGN_OBJ:
! 20670: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20671: break;
! 20672: case ZEND_ASSIGN_DIM: {
! 20673: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20674:
! 20675: if (IS_UNUSED == IS_VAR && !container) {
! 20676: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 20677: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 20678: if (IS_UNUSED == IS_VAR && !0) {
! 20679: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 20680: }
! 20681: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20682: } else {
! 20683: zend_op *op_data = opline+1;
! 20684: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20685:
! 20686: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 20687: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 20688: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 20689: ZEND_VM_INC_OPCODE();
! 20690: }
! 20691: }
! 20692: break;
! 20693: default:
! 20694: value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20695: var_ptr = NULL;
! 20696: /* do nothing */
! 20697: break;
! 20698: }
! 20699:
! 20700: if (!var_ptr) {
! 20701: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 20702: }
! 20703:
! 20704: if (*var_ptr == EG(error_zval_ptr)) {
! 20705: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20706: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 20707: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 20708: }
! 20709:
! 20710:
! 20711: ZEND_VM_NEXT_OPCODE();
! 20712: }
! 20713:
! 20714: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 20715:
! 20716: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 20717: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 20718: /* proxy object */
! 20719: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 20720: Z_ADDREF_P(objval);
! 20721: binary_op(objval, objval, value TSRMLS_CC);
! 20722: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 20723: zval_ptr_dtor(&objval);
! 20724: } else {
! 20725: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 20726: }
! 20727:
! 20728: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20729: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 20730: PZVAL_LOCK(*var_ptr);
! 20731: }
! 20732:
! 20733: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 20734: FREE_OP(free_op_data1);
! 20735: FREE_OP_VAR_PTR(free_op_data2);
! 20736: }
! 20737:
! 20738: ZEND_VM_NEXT_OPCODE();
! 20739: }
! 20740:
! 20741: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20742: {
! 20743: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20744: }
! 20745:
! 20746: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20747: {
! 20748: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20749: }
! 20750:
! 20751: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20752: {
! 20753: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20754: }
! 20755:
! 20756: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20757: {
! 20758: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20759: }
! 20760:
! 20761: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20762: {
! 20763: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20764: }
! 20765:
! 20766: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20767: {
! 20768: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20769: }
! 20770:
! 20771: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20772: {
! 20773: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20774: }
! 20775:
! 20776: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20777: {
! 20778: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20779: }
! 20780:
! 20781: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20782: {
! 20783: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20784: }
! 20785:
! 20786: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20787: {
! 20788: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20789: }
! 20790:
! 20791: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20792: {
! 20793: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20794: }
! 20795:
! 20796: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 20797: {
! 20798: zend_op *opline = EX(opline);
! 20799:
! 20800: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20801: zval *object;
! 20802: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20803: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 20804: int have_get_ptr = 0;
! 20805:
! 20806: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 20807: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 20808: }
! 20809:
! 20810: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 20811: object = *object_ptr;
! 20812:
! 20813: if (Z_TYPE_P(object) != IS_OBJECT) {
! 20814: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 20815:
! 20816: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20817: *retval = EG(uninitialized_zval_ptr);
! 20818: PZVAL_LOCK(*retval);
! 20819: }
! 20820:
! 20821: ZEND_VM_NEXT_OPCODE();
! 20822: }
! 20823:
! 20824: /* here we are sure we are dealing with an object */
! 20825:
! 20826: if (0) {
! 20827: MAKE_REAL_ZVAL_PTR(property);
! 20828: }
! 20829:
! 20830: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 20831: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 20832: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 20833: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 20834:
! 20835: have_get_ptr = 1;
! 20836: incdec_op(*zptr);
! 20837: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20838: *retval = *zptr;
! 20839: PZVAL_LOCK(*retval);
! 20840: }
! 20841: }
! 20842: }
! 20843:
! 20844: if (!have_get_ptr) {
! 20845: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 20846: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 20847:
! 20848: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 20849: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 20850:
! 20851: if (Z_REFCOUNT_P(z) == 0) {
! 20852: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 20853: zval_dtor(z);
! 20854: FREE_ZVAL(z);
! 20855: }
! 20856: z = value;
! 20857: }
! 20858: Z_ADDREF_P(z);
! 20859: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 20860: incdec_op(z);
! 20861: *retval = z;
! 20862: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 20863: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 20864: zval_ptr_dtor(&z);
! 20865: } else {
! 20866: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 20867: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 20868: *retval = EG(uninitialized_zval_ptr);
! 20869: PZVAL_LOCK(*retval);
! 20870: }
! 20871: }
! 20872: }
! 20873:
! 20874: if (0) {
! 20875: zval_ptr_dtor(&property);
! 20876: } else {
! 20877:
! 20878: }
! 20879:
! 20880: ZEND_VM_NEXT_OPCODE();
! 20881: }
! 20882:
! 20883: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20884: {
! 20885: return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20886: }
! 20887:
! 20888: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20889: {
! 20890: return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20891: }
! 20892:
! 20893: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 20894: {
! 20895: zend_op *opline = EX(opline);
! 20896:
! 20897: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 20898: zval *object;
! 20899: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20900: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 20901: int have_get_ptr = 0;
! 20902:
! 20903: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 20904: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 20905: }
! 20906:
! 20907: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 20908: object = *object_ptr;
! 20909:
! 20910: if (Z_TYPE_P(object) != IS_OBJECT) {
! 20911: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 20912:
! 20913: *retval = *EG(uninitialized_zval_ptr);
! 20914:
! 20915: ZEND_VM_NEXT_OPCODE();
! 20916: }
! 20917:
! 20918: /* here we are sure we are dealing with an object */
! 20919:
! 20920: if (0) {
! 20921: MAKE_REAL_ZVAL_PTR(property);
! 20922: }
! 20923:
! 20924: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 20925: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 20926: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 20927: have_get_ptr = 1;
! 20928: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 20929:
! 20930: *retval = **zptr;
! 20931: zendi_zval_copy_ctor(*retval);
! 20932:
! 20933: incdec_op(*zptr);
! 20934:
! 20935: }
! 20936: }
! 20937:
! 20938: if (!have_get_ptr) {
! 20939: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 20940: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 20941: zval *z_copy;
! 20942:
! 20943: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 20944: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 20945:
! 20946: if (Z_REFCOUNT_P(z) == 0) {
! 20947: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 20948: zval_dtor(z);
! 20949: FREE_ZVAL(z);
! 20950: }
! 20951: z = value;
! 20952: }
! 20953: *retval = *z;
! 20954: zendi_zval_copy_ctor(*retval);
! 20955: ALLOC_ZVAL(z_copy);
! 20956: *z_copy = *z;
! 20957: zendi_zval_copy_ctor(*z_copy);
! 20958: INIT_PZVAL(z_copy);
! 20959: incdec_op(z_copy);
! 20960: Z_ADDREF_P(z);
! 20961: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 20962: zval_ptr_dtor(&z_copy);
! 20963: zval_ptr_dtor(&z);
! 20964: } else {
! 20965: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 20966: *retval = *EG(uninitialized_zval_ptr);
! 20967: }
! 20968: }
! 20969:
! 20970: if (0) {
! 20971: zval_ptr_dtor(&property);
! 20972: } else {
! 20973:
! 20974: }
! 20975:
! 20976: ZEND_VM_NEXT_OPCODE();
! 20977: }
! 20978:
! 20979: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20980: {
! 20981: return zend_post_incdec_property_helper_SPEC_UNUSED_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20982: }
! 20983:
! 20984: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 20985: {
! 20986: return zend_post_incdec_property_helper_SPEC_UNUSED_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 20987: }
! 20988:
! 20989: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
! 20990: {
! 20991: zend_op *opline = EX(opline);
! 20992:
! 20993: zval *container = _get_obj_zval_ptr_unused(TSRMLS_C);
! 20994:
! 20995: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 20996:
! 20997: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 20998: if (type != BP_VAR_IS) {
! 20999: zend_error(E_NOTICE, "Trying to get property of non-object");
! 21000: }
! 21001: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21002: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 21003: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 21004: }
! 21005:
! 21006: } else {
! 21007: zval *retval;
! 21008:
! 21009: if (0) {
! 21010: MAKE_REAL_ZVAL_PTR(offset);
! 21011: }
! 21012:
! 21013: /* here we are sure we are dealing with an object */
! 21014: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 21015:
! 21016: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 21017: if (Z_REFCOUNT_P(retval) == 0) {
! 21018: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 21019: zval_dtor(retval);
! 21020: FREE_ZVAL(retval);
! 21021: }
! 21022: } else {
! 21023: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 21024: PZVAL_LOCK(retval);
! 21025: }
! 21026:
! 21027: if (0) {
! 21028: zval_ptr_dtor(&offset);
! 21029: } else {
! 21030:
! 21031: }
! 21032: }
! 21033:
! 21034: ZEND_VM_NEXT_OPCODE();
! 21035: }
! 21036:
! 21037: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21038: {
! 21039: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21040: }
! 21041:
! 21042: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21043: {
! 21044: zend_op *opline = EX(opline);
! 21045: zend_free_op free_op1;
! 21046: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21047: zval **container;
! 21048:
! 21049: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 21050: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 21051: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 21052: }
! 21053:
! 21054: if (0) {
! 21055: MAKE_REAL_ZVAL_PTR(property);
! 21056: }
! 21057: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21058: if (IS_UNUSED == IS_VAR && !container) {
! 21059: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 21060: }
! 21061: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 21062: if (0) {
! 21063: zval_ptr_dtor(&property);
! 21064: } else {
! 21065:
! 21066: }
! 21067: if (IS_UNUSED == IS_VAR && 0 &&
! 21068: READY_TO_DESTROY(free_op1.var)) {
! 21069: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 21070: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 21071: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 21072: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 21073: }
! 21074: }
! 21075:
! 21076: /* We are going to assign the result by reference */
! 21077: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 21078: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 21079: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 21080: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 21081: }
! 21082:
! 21083: ZEND_VM_NEXT_OPCODE();
! 21084: }
! 21085:
! 21086: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21087: {
! 21088: zend_op *opline = EX(opline);
! 21089: zend_free_op free_op1;
! 21090: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21091: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21092:
! 21093: if (0) {
! 21094: MAKE_REAL_ZVAL_PTR(property);
! 21095: }
! 21096: if (IS_UNUSED == IS_VAR && !container) {
! 21097: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 21098: }
! 21099: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 21100: if (0) {
! 21101: zval_ptr_dtor(&property);
! 21102: } else {
! 21103:
! 21104: }
! 21105: if (IS_UNUSED == IS_VAR && 0 &&
! 21106: READY_TO_DESTROY(free_op1.var)) {
! 21107: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 21108: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 21109: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 21110: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 21111: }
! 21112: }
! 21113:
! 21114: ZEND_VM_NEXT_OPCODE();
! 21115: }
! 21116:
! 21117: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21118: {
! 21119: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21120: }
! 21121:
! 21122: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21123: {
! 21124: zend_op *opline = EX(opline);
! 21125:
! 21126: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 21127: /* Behave like FETCH_OBJ_W */
! 21128: zend_free_op free_op1;
! 21129: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21130: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21131:
! 21132: if (0) {
! 21133: MAKE_REAL_ZVAL_PTR(property);
! 21134: }
! 21135: if (IS_UNUSED == IS_VAR && !container) {
! 21136: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 21137: }
! 21138: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 21139: if (0) {
! 21140: zval_ptr_dtor(&property);
! 21141: } else {
! 21142:
! 21143: }
! 21144: if (IS_UNUSED == IS_VAR && 0 &&
! 21145: READY_TO_DESTROY(free_op1.var)) {
! 21146: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 21147: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 21148: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 21149: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 21150: }
! 21151: }
! 21152:
! 21153: ZEND_VM_NEXT_OPCODE();
! 21154: } else {
! 21155: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21156: }
! 21157: }
! 21158:
! 21159: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21160: {
! 21161: zend_op *opline = EX(opline);
! 21162: zend_free_op free_op1, free_res;
! 21163: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21164: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21165:
! 21166: if (IS_UNUSED == IS_CV) {
! 21167: if (container != &EG(uninitialized_zval_ptr)) {
! 21168: SEPARATE_ZVAL_IF_NOT_REF(container);
! 21169: }
! 21170: }
! 21171: if (0) {
! 21172: MAKE_REAL_ZVAL_PTR(property);
! 21173: }
! 21174: if (IS_UNUSED == IS_VAR && !container) {
! 21175: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 21176: }
! 21177: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 21178: if (0) {
! 21179: zval_ptr_dtor(&property);
! 21180: } else {
! 21181:
! 21182: }
! 21183: if (IS_UNUSED == IS_VAR && 0 &&
! 21184: READY_TO_DESTROY(free_op1.var)) {
! 21185: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 21186: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 21187: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 21188: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 21189: }
! 21190: }
! 21191:
! 21192: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 21193: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 21194: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 21195: }
! 21196: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 21197: FREE_OP_VAR_PTR(free_res);
! 21198: ZEND_VM_NEXT_OPCODE();
! 21199: }
! 21200:
! 21201: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21202: {
! 21203: zend_op *opline = EX(opline);
! 21204: zend_op *op_data = opline+1;
! 21205:
! 21206: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21207: zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21208:
! 21209: if (0) {
! 21210: MAKE_REAL_ZVAL_PTR(property_name);
! 21211: }
! 21212: if (IS_UNUSED == IS_VAR && !object_ptr) {
! 21213: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 21214: }
! 21215: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 21216: if (0) {
! 21217: zval_ptr_dtor(&property_name);
! 21218: } else {
! 21219:
! 21220: }
! 21221:
! 21222: /* assign_obj has two opcodes! */
! 21223: ZEND_VM_INC_OPCODE();
! 21224: ZEND_VM_NEXT_OPCODE();
! 21225: }
! 21226:
! 21227: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21228: {
! 21229: zend_op *opline = EX(opline);
! 21230:
! 21231: zval *str = &EX_T(opline->result.u.var).tmp_var;
! 21232: zval *var = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21233: zval var_copy;
! 21234: int use_copy = 0;
! 21235:
! 21236: if (IS_UNUSED == IS_UNUSED) {
! 21237: /* Initialize for erealloc in add_string_to_string */
! 21238: Z_STRVAL_P(str) = NULL;
! 21239: Z_STRLEN_P(str) = 0;
! 21240: Z_TYPE_P(str) = IS_STRING;
! 21241:
! 21242: INIT_PZVAL(str);
! 21243: }
! 21244:
! 21245: if (Z_TYPE_P(var) != IS_STRING) {
! 21246: zend_make_printable_zval(var, &var_copy, &use_copy);
! 21247:
! 21248: if (use_copy) {
! 21249: var = &var_copy;
! 21250: }
! 21251: }
! 21252: add_string_to_string(str, str, var);
! 21253:
! 21254: if (use_copy) {
! 21255: zval_dtor(var);
! 21256: }
! 21257: /* original comment, possibly problematic:
! 21258: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
! 21259: * (Zeev): I don't think it's problematic, we only use variables
! 21260: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
! 21261: * string offsets or overloaded objects
! 21262: */
! 21263:
! 21264: ZEND_VM_NEXT_OPCODE();
! 21265: }
! 21266:
! 21267: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21268: {
! 21269: zend_op *opline = EX(opline);
! 21270: zval *function_name;
! 21271: char *function_name_strval;
! 21272: int function_name_strlen;
! 21273:
! 21274:
! 21275: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 21276:
! 21277: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21278:
! 21279: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 21280: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 21281: }
! 21282:
! 21283: function_name_strval = Z_STRVAL_P(function_name);
! 21284: function_name_strlen = Z_STRLEN_P(function_name);
! 21285:
! 21286: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
! 21287:
! 21288: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 21289: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 21290: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 21291: }
! 21292:
! 21293: /* First, locate the function. */
! 21294: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 21295: if (!EX(fbc)) {
! 21296: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 21297: }
! 21298:
! 21299: EX(called_scope) = Z_OBJCE_P(EX(object));
! 21300: } else {
! 21301: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 21302: }
! 21303:
! 21304: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 21305: EX(object) = NULL;
! 21306: } else {
! 21307: if (!PZVAL_IS_REF(EX(object))) {
! 21308: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 21309: } else {
! 21310: zval *this_ptr;
! 21311: ALLOC_ZVAL(this_ptr);
! 21312: INIT_PZVAL_COPY(this_ptr, EX(object));
! 21313: zval_copy_ctor(this_ptr);
! 21314: EX(object) = this_ptr;
! 21315: }
! 21316: }
! 21317:
! 21318:
! 21319: ZEND_VM_NEXT_OPCODE();
! 21320: }
! 21321:
! 21322: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21323: {
! 21324: zend_op *opline = EX(opline);
! 21325:
! 21326: array_init(&EX_T(opline->result.u.var).tmp_var);
! 21327: if (IS_UNUSED == IS_UNUSED) {
! 21328: ZEND_VM_NEXT_OPCODE();
! 21329: #if 0 || IS_UNUSED != IS_UNUSED
! 21330: } else {
! 21331: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21332: #endif
! 21333: }
! 21334: }
! 21335:
! 21336: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21337: {
! 21338: zend_op *opline = EX(opline);
! 21339:
! 21340: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21341: zval *offset;
! 21342:
! 21343: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 21344: SEPARATE_ZVAL_IF_NOT_REF(container);
! 21345: }
! 21346: offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21347:
! 21348: if (IS_UNUSED != IS_VAR || container) {
! 21349: switch (Z_TYPE_PP(container)) {
! 21350: case IS_ARRAY: {
! 21351: HashTable *ht = Z_ARRVAL_PP(container);
! 21352:
! 21353: switch (Z_TYPE_P(offset)) {
! 21354: case IS_DOUBLE:
! 21355: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 21356: break;
! 21357: case IS_RESOURCE:
! 21358: case IS_BOOL:
! 21359: case IS_LONG:
! 21360: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 21361: break;
! 21362: case IS_STRING:
! 21363: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 21364: Z_ADDREF_P(offset);
! 21365: }
! 21366: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 21367: ht == &EG(symbol_table)) {
! 21368: zend_execute_data *ex;
! 21369: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 21370:
! 21371: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 21372: if (ex->op_array && ex->symbol_table == ht) {
! 21373: int i;
! 21374:
! 21375: for (i = 0; i < ex->op_array->last_var; i++) {
! 21376: if (ex->op_array->vars[i].hash_value == hash_value &&
! 21377: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 21378: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 21379: ex->CVs[i] = NULL;
! 21380: break;
! 21381: }
! 21382: }
! 21383: }
! 21384: }
! 21385: }
! 21386: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 21387: zval_ptr_dtor(&offset);
! 21388: }
! 21389: break;
! 21390: case IS_NULL:
! 21391: zend_hash_del(ht, "", sizeof(""));
! 21392: break;
! 21393: default:
! 21394: zend_error(E_WARNING, "Illegal offset type in unset");
! 21395: break;
! 21396: }
! 21397:
! 21398: break;
! 21399: }
! 21400: case IS_OBJECT:
! 21401: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 21402: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 21403: }
! 21404: if (0) {
! 21405: MAKE_REAL_ZVAL_PTR(offset);
! 21406: }
! 21407: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 21408: if (0) {
! 21409: zval_ptr_dtor(&offset);
! 21410: } else {
! 21411:
! 21412: }
! 21413: break;
! 21414: case IS_STRING:
! 21415: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 21416: ZEND_VM_CONTINUE(); /* bailed out before */
! 21417: default:
! 21418:
! 21419: break;
! 21420: }
! 21421: } else {
! 21422:
! 21423: }
! 21424:
! 21425: ZEND_VM_NEXT_OPCODE();
! 21426: }
! 21427:
! 21428: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21429: {
! 21430: zend_op *opline = EX(opline);
! 21431:
! 21432: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21433: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21434:
! 21435: if (IS_UNUSED != IS_VAR || container) {
! 21436: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 21437: SEPARATE_ZVAL_IF_NOT_REF(container);
! 21438: }
! 21439: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 21440: if (0) {
! 21441: MAKE_REAL_ZVAL_PTR(offset);
! 21442: }
! 21443: if (Z_OBJ_HT_P(*container)->unset_property) {
! 21444: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 21445: } else {
! 21446: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 21447: }
! 21448: if (0) {
! 21449: zval_ptr_dtor(&offset);
! 21450: } else {
! 21451:
! 21452: }
! 21453: } else {
! 21454:
! 21455: }
! 21456: } else {
! 21457:
! 21458: }
! 21459:
! 21460: ZEND_VM_NEXT_OPCODE();
! 21461: }
! 21462:
! 21463: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 21464: {
! 21465: zend_op *opline = EX(opline);
! 21466:
! 21467: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
! 21468: zval **value = NULL;
! 21469: int result = 0;
! 21470:
! 21471: if (IS_UNUSED != IS_VAR || container) {
! 21472:
! 21473: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21474:
! 21475: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 21476: HashTable *ht;
! 21477: int isset = 0;
! 21478:
! 21479: ht = Z_ARRVAL_PP(container);
! 21480:
! 21481: switch (Z_TYPE_P(offset)) {
! 21482: case IS_DOUBLE:
! 21483: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 21484: isset = 1;
! 21485: }
! 21486: break;
! 21487: case IS_RESOURCE:
! 21488: case IS_BOOL:
! 21489: case IS_LONG:
! 21490: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 21491: isset = 1;
! 21492: }
! 21493: break;
! 21494: case IS_STRING:
! 21495: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 21496: isset = 1;
! 21497: }
! 21498: break;
! 21499: case IS_NULL:
! 21500: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 21501: isset = 1;
! 21502: }
! 21503: break;
! 21504: default:
! 21505: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 21506:
! 21507: break;
! 21508: }
! 21509:
! 21510: switch (opline->extended_value) {
! 21511: case ZEND_ISSET:
! 21512: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 21513: result = 0;
! 21514: } else {
! 21515: result = isset;
! 21516: }
! 21517: break;
! 21518: case ZEND_ISEMPTY:
! 21519: if (!isset || !i_zend_is_true(*value)) {
! 21520: result = 0;
! 21521: } else {
! 21522: result = 1;
! 21523: }
! 21524: break;
! 21525: }
! 21526:
! 21527: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 21528: if (0) {
! 21529: MAKE_REAL_ZVAL_PTR(offset);
! 21530: }
! 21531: if (prop_dim) {
! 21532: if (Z_OBJ_HT_P(*container)->has_property) {
! 21533: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 21534: } else {
! 21535: zend_error(E_NOTICE, "Trying to check property of non-object");
! 21536: result = 0;
! 21537: }
! 21538: } else {
! 21539: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 21540: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 21541: } else {
! 21542: zend_error(E_NOTICE, "Trying to check element of non-array");
! 21543: result = 0;
! 21544: }
! 21545: }
! 21546: if (0) {
! 21547: zval_ptr_dtor(&offset);
! 21548: } else {
! 21549:
! 21550: }
! 21551: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 21552: zval tmp;
! 21553:
! 21554: if (Z_TYPE_P(offset) != IS_LONG) {
! 21555: tmp = *offset;
! 21556: zval_copy_ctor(&tmp);
! 21557: convert_to_long(&tmp);
! 21558: offset = &tmp;
! 21559: }
! 21560: if (Z_TYPE_P(offset) == IS_LONG) {
! 21561: switch (opline->extended_value) {
! 21562: case ZEND_ISSET:
! 21563: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 21564: result = 1;
! 21565: }
! 21566: break;
! 21567: case ZEND_ISEMPTY:
! 21568: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 21569: result = 1;
! 21570: }
! 21571: break;
! 21572: }
! 21573: }
! 21574:
! 21575: } else {
! 21576:
! 21577: }
! 21578: }
! 21579:
! 21580: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 21581:
! 21582: switch (opline->extended_value) {
! 21583: case ZEND_ISSET:
! 21584: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 21585: break;
! 21586: case ZEND_ISEMPTY:
! 21587: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 21588: break;
! 21589: }
! 21590:
! 21591: ZEND_VM_NEXT_OPCODE();
! 21592: }
! 21593:
! 21594: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21595: {
! 21596: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21597: }
! 21598:
! 21599: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21600: {
! 21601: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21602: }
! 21603:
! 21604: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21605: {
! 21606: zend_op *opline = EX(opline);
! 21607:
! 21608:
! 21609: bitwise_not_function(&EX_T(opline->result.u.var).tmp_var,
! 21610: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 21611:
! 21612: ZEND_VM_NEXT_OPCODE();
! 21613: }
! 21614:
! 21615: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21616: {
! 21617: zend_op *opline = EX(opline);
! 21618:
! 21619:
! 21620: boolean_not_function(&EX_T(opline->result.u.var).tmp_var,
! 21621: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 21622:
! 21623: ZEND_VM_NEXT_OPCODE();
! 21624: }
! 21625:
! 21626: static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21627: {
! 21628: zend_op *opline = EX(opline);
! 21629:
! 21630: zval **var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 21631:
! 21632: if (IS_CV == IS_VAR && !var_ptr) {
! 21633: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 21634: }
! 21635: if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 21636: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21637: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 21638: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 21639: }
! 21640:
! 21641: ZEND_VM_NEXT_OPCODE();
! 21642: }
! 21643:
! 21644: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 21645:
! 21646: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 21647: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 21648: /* proxy object */
! 21649: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 21650: Z_ADDREF_P(val);
! 21651: increment_function(val);
! 21652: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 21653: zval_ptr_dtor(&val);
! 21654: } else {
! 21655: increment_function(*var_ptr);
! 21656: }
! 21657:
! 21658: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21659: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 21660: PZVAL_LOCK(*var_ptr);
! 21661: }
! 21662:
! 21663: ZEND_VM_NEXT_OPCODE();
! 21664: }
! 21665:
! 21666: static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21667: {
! 21668: zend_op *opline = EX(opline);
! 21669:
! 21670: zval **var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 21671:
! 21672: if (IS_CV == IS_VAR && !var_ptr) {
! 21673: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 21674: }
! 21675: if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 21676: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21677: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 21678: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 21679: }
! 21680:
! 21681: ZEND_VM_NEXT_OPCODE();
! 21682: }
! 21683:
! 21684: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 21685:
! 21686: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 21687: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 21688: /* proxy object */
! 21689: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 21690: Z_ADDREF_P(val);
! 21691: decrement_function(val);
! 21692: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 21693: zval_ptr_dtor(&val);
! 21694: } else {
! 21695: decrement_function(*var_ptr);
! 21696: }
! 21697:
! 21698: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21699: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 21700: PZVAL_LOCK(*var_ptr);
! 21701: }
! 21702:
! 21703: ZEND_VM_NEXT_OPCODE();
! 21704: }
! 21705:
! 21706: static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21707: {
! 21708: zend_op *opline = EX(opline);
! 21709:
! 21710: zval **var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 21711:
! 21712: if (IS_CV == IS_VAR && !var_ptr) {
! 21713: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 21714: }
! 21715: if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 21716: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21717: EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
! 21718: }
! 21719:
! 21720: ZEND_VM_NEXT_OPCODE();
! 21721: }
! 21722:
! 21723: EX_T(opline->result.u.var).tmp_var = **var_ptr;
! 21724: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 21725:
! 21726: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 21727:
! 21728: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 21729: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 21730: /* proxy object */
! 21731: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 21732: Z_ADDREF_P(val);
! 21733: increment_function(val);
! 21734: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 21735: zval_ptr_dtor(&val);
! 21736: } else {
! 21737: increment_function(*var_ptr);
! 21738: }
! 21739:
! 21740: ZEND_VM_NEXT_OPCODE();
! 21741: }
! 21742:
! 21743: static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21744: {
! 21745: zend_op *opline = EX(opline);
! 21746:
! 21747: zval **var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 21748:
! 21749: if (IS_CV == IS_VAR && !var_ptr) {
! 21750: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 21751: }
! 21752: if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
! 21753: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21754: EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
! 21755: }
! 21756:
! 21757: ZEND_VM_NEXT_OPCODE();
! 21758: }
! 21759:
! 21760: EX_T(opline->result.u.var).tmp_var = **var_ptr;
! 21761: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 21762:
! 21763: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 21764:
! 21765: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 21766: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 21767: /* proxy object */
! 21768: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 21769: Z_ADDREF_P(val);
! 21770: decrement_function(val);
! 21771: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
! 21772: zval_ptr_dtor(&val);
! 21773: } else {
! 21774: decrement_function(*var_ptr);
! 21775: }
! 21776:
! 21777: ZEND_VM_NEXT_OPCODE();
! 21778: }
! 21779:
! 21780: static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21781: {
! 21782: zend_op *opline = EX(opline);
! 21783:
! 21784: zval z_copy;
! 21785: zval *z = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21786:
! 21787: if (IS_CV != IS_CONST &&
! 21788: Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get_method != NULL) {
! 21789: if (IS_CV == IS_TMP_VAR) {
! 21790: INIT_PZVAL(z);
! 21791: }
! 21792: if (zend_std_cast_object_tostring(z, &z_copy, IS_STRING TSRMLS_CC) == SUCCESS) {
! 21793: zend_print_variable(&z_copy);
! 21794: zval_dtor(&z_copy);
! 21795: } else {
! 21796: zend_print_variable(z);
! 21797: }
! 21798: } else {
! 21799: zend_print_variable(z);
! 21800: }
! 21801:
! 21802: ZEND_VM_NEXT_OPCODE();
! 21803: }
! 21804:
! 21805: static int ZEND_FASTCALL ZEND_PRINT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21806: {
! 21807: zend_op *opline = EX(opline);
! 21808:
! 21809: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 21810: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_LONG;
! 21811:
! 21812: return ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21813: }
! 21814:
! 21815: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
! 21816: {
! 21817: zend_op *opline = EX(opline);
! 21818: zend_free_op free_op1;
! 21819: zval *varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21820: zval **retval;
! 21821: zval tmp_varname;
! 21822: HashTable *target_symbol_table;
! 21823:
! 21824: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
! 21825: tmp_varname = *varname;
! 21826: zval_copy_ctor(&tmp_varname);
! 21827: convert_to_string(&tmp_varname);
! 21828: varname = &tmp_varname;
! 21829: }
! 21830:
! 21831: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 21832: 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);
! 21833:
! 21834: } else {
! 21835: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), type, varname TSRMLS_CC);
! 21836: /*
! 21837: if (!target_symbol_table) {
! 21838: ZEND_VM_NEXT_OPCODE();
! 21839: }
! 21840: */
! 21841: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &retval) == FAILURE) {
! 21842: switch (type) {
! 21843: case BP_VAR_R:
! 21844: case BP_VAR_UNSET:
! 21845: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 21846: /* break missing intentionally */
! 21847: case BP_VAR_IS:
! 21848: retval = &EG(uninitialized_zval_ptr);
! 21849: break;
! 21850: case BP_VAR_RW:
! 21851: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
! 21852: /* break missing intentionally */
! 21853: case BP_VAR_W: {
! 21854: zval *new_zval = &EG(uninitialized_zval);
! 21855:
! 21856: Z_ADDREF_P(new_zval);
! 21857: zend_hash_update(target_symbol_table, varname->value.str.val, varname->value.str.len+1, &new_zval, sizeof(zval *), (void **) &retval);
! 21858: }
! 21859: break;
! 21860: EMPTY_SWITCH_DEFAULT_CASE()
! 21861: }
! 21862: }
! 21863: switch (opline->op2.u.EA.type) {
! 21864: case ZEND_FETCH_GLOBAL:
! 21865: if (IS_CV != IS_TMP_VAR) {
! 21866:
! 21867: }
! 21868: break;
! 21869: case ZEND_FETCH_LOCAL:
! 21870:
! 21871: break;
! 21872: case ZEND_FETCH_STATIC:
! 21873: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
! 21874: break;
! 21875: case ZEND_FETCH_GLOBAL_LOCK:
! 21876: if (IS_CV == IS_VAR && !free_op1.var) {
! 21877: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 21878: }
! 21879: break;
! 21880: }
! 21881: }
! 21882:
! 21883:
! 21884: if (IS_CV != IS_CONST && varname == &tmp_varname) {
! 21885: zval_dtor(varname);
! 21886: }
! 21887: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 21888: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 21889: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
! 21890: }
! 21891: PZVAL_LOCK(*retval);
! 21892: switch (type) {
! 21893: case BP_VAR_R:
! 21894: case BP_VAR_IS:
! 21895: AI_SET_PTR(EX_T(opline->result.u.var).var, *retval);
! 21896: break;
! 21897: case BP_VAR_UNSET: {
! 21898: zend_free_op free_res;
! 21899:
! 21900: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 21901: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 21902: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 21903: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 21904: }
! 21905: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 21906: FREE_OP_VAR_PTR(free_res);
! 21907: break;
! 21908: default:
! 21909: EX_T(opline->result.u.var).var.ptr_ptr = retval;
! 21910: break;
! 21911: }
! 21912: }
! 21913: }
! 21914: ZEND_VM_NEXT_OPCODE();
! 21915: }
! 21916:
! 21917: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21918: {
! 21919: return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21920: }
! 21921:
! 21922: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21923: {
! 21924: return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21925: }
! 21926:
! 21927: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21928: {
! 21929: return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21930: }
! 21931:
! 21932: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21933: {
! 21934: return zend_fetch_var_address_helper_SPEC_CV(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21935: }
! 21936:
! 21937: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21938: {
! 21939: return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21940: }
! 21941:
! 21942: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21943: {
! 21944: return zend_fetch_var_address_helper_SPEC_CV(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 21945: }
! 21946:
! 21947: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21948: {
! 21949: zend_op *opline = EX(opline);
! 21950:
! 21951: zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21952: int ret;
! 21953:
! 21954: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 21955: ret = Z_LVAL_P(val);
! 21956: } else {
! 21957: ret = i_zend_is_true(val);
! 21958:
! 21959: if (UNEXPECTED(EG(exception) != NULL)) {
! 21960: ZEND_VM_CONTINUE();
! 21961: }
! 21962: }
! 21963: if (!ret) {
! 21964: #if DEBUG_ZEND>=2
! 21965: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 21966: #endif
! 21967: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 21968: ZEND_VM_CONTINUE();
! 21969: }
! 21970:
! 21971: ZEND_VM_NEXT_OPCODE();
! 21972: }
! 21973:
! 21974: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 21975: {
! 21976: zend_op *opline = EX(opline);
! 21977:
! 21978: zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 21979: int ret;
! 21980:
! 21981: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 21982: ret = Z_LVAL_P(val);
! 21983: } else {
! 21984: ret = i_zend_is_true(val);
! 21985:
! 21986: if (UNEXPECTED(EG(exception) != NULL)) {
! 21987: ZEND_VM_CONTINUE();
! 21988: }
! 21989: }
! 21990: if (ret) {
! 21991: #if DEBUG_ZEND>=2
! 21992: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 21993: #endif
! 21994: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 21995: ZEND_VM_CONTINUE();
! 21996: }
! 21997:
! 21998: ZEND_VM_NEXT_OPCODE();
! 21999: }
! 22000:
! 22001: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22002: {
! 22003: zend_op *opline = EX(opline);
! 22004:
! 22005: zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22006: int retval;
! 22007:
! 22008: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 22009: retval = Z_LVAL_P(val);
! 22010: } else {
! 22011: retval = i_zend_is_true(val);
! 22012:
! 22013: if (UNEXPECTED(EG(exception) != NULL)) {
! 22014: ZEND_VM_CONTINUE();
! 22015: }
! 22016: }
! 22017: if (EXPECTED(retval != 0)) {
! 22018: #if DEBUG_ZEND>=2
! 22019: printf("Conditional jmp on true to %d\n", opline->extended_value);
! 22020: #endif
! 22021: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
! 22022: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 22023: } else {
! 22024: #if DEBUG_ZEND>=2
! 22025: printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);
! 22026: #endif
! 22027: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.u.opline_num]);
! 22028: ZEND_VM_CONTINUE(); /* CHECK_ME */
! 22029: }
! 22030: }
! 22031:
! 22032: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22033: {
! 22034: zend_op *opline = EX(opline);
! 22035:
! 22036: zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22037: int retval;
! 22038:
! 22039: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 22040: retval = Z_LVAL_P(val);
! 22041: } else {
! 22042: retval = i_zend_is_true(val);
! 22043:
! 22044: if (UNEXPECTED(EG(exception) != NULL)) {
! 22045: ZEND_VM_CONTINUE();
! 22046: }
! 22047: }
! 22048: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 22049: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 22050: if (!retval) {
! 22051: #if DEBUG_ZEND>=2
! 22052: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 22053: #endif
! 22054: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 22055: ZEND_VM_CONTINUE();
! 22056: }
! 22057: ZEND_VM_NEXT_OPCODE();
! 22058: }
! 22059:
! 22060: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22061: {
! 22062: zend_op *opline = EX(opline);
! 22063:
! 22064: zval *val = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22065: int retval;
! 22066:
! 22067: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(val) == IS_BOOL) {
! 22068: retval = Z_LVAL_P(val);
! 22069: } else {
! 22070: retval = i_zend_is_true(val);
! 22071:
! 22072: if (UNEXPECTED(EG(exception) != NULL)) {
! 22073: ZEND_VM_CONTINUE();
! 22074: }
! 22075: }
! 22076: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = retval;
! 22077: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 22078: if (retval) {
! 22079: #if DEBUG_ZEND>=2
! 22080: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 22081: #endif
! 22082: ZEND_VM_SET_OPCODE(opline->op2.u.jmp_addr);
! 22083: ZEND_VM_CONTINUE();
! 22084: }
! 22085: ZEND_VM_NEXT_OPCODE();
! 22086: }
! 22087:
! 22088: static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22089: {
! 22090: zend_op *opline = EX(opline);
! 22091: zval *retval_ptr;
! 22092: zval **retval_ptr_ptr;
! 22093:
! 22094:
! 22095: if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) {
! 22096:
! 22097: if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
! 22098: /* Not supposed to happen, but we'll allow it */
! 22099: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 22100: goto return_by_value;
! 22101: }
! 22102:
! 22103: retval_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 22104:
! 22105: if (IS_CV == IS_VAR && !retval_ptr_ptr) {
! 22106: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
! 22107: }
! 22108:
! 22109: if (IS_CV == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
! 22110: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 22111: EX_T(opline->op1.u.var).var.fcall_returned_reference) {
! 22112: } else if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 22113: if (IS_CV == IS_VAR && !0) {
! 22114: PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 22115: }
! 22116: zend_error(E_NOTICE, "Only variable references should be returned by reference");
! 22117: goto return_by_value;
! 22118: }
! 22119: }
! 22120:
! 22121: if (EG(return_value_ptr_ptr)) {
! 22122: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
! 22123: Z_ADDREF_PP(retval_ptr_ptr);
! 22124:
! 22125: (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
! 22126: }
! 22127: } else {
! 22128: return_by_value:
! 22129:
! 22130: retval_ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22131:
! 22132: if (!EG(return_value_ptr_ptr)) {
! 22133: if (IS_CV == IS_TMP_VAR) {
! 22134:
! 22135: }
! 22136: } else if (!0) { /* Not a temp var */
! 22137: if (IS_CV == IS_CONST ||
! 22138: EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
! 22139: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
! 22140: zval *ret;
! 22141:
! 22142: ALLOC_ZVAL(ret);
! 22143: INIT_PZVAL_COPY(ret, retval_ptr);
! 22144: zval_copy_ctor(ret);
! 22145: *EG(return_value_ptr_ptr) = ret;
! 22146: } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
! 22147: retval_ptr == &EG(uninitialized_zval)) {
! 22148: zval *ret;
! 22149:
! 22150: ALLOC_INIT_ZVAL(ret);
! 22151: *EG(return_value_ptr_ptr) = ret;
! 22152: } else {
! 22153: *EG(return_value_ptr_ptr) = retval_ptr;
! 22154: Z_ADDREF_P(retval_ptr);
! 22155: }
! 22156: } else {
! 22157: zval *ret;
! 22158:
! 22159: ALLOC_ZVAL(ret);
! 22160: INIT_PZVAL_COPY(ret, retval_ptr);
! 22161: *EG(return_value_ptr_ptr) = ret;
! 22162: }
! 22163: }
! 22164:
! 22165: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22166: }
! 22167:
! 22168: static int ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22169: {
! 22170: zend_op *opline = EX(opline);
! 22171: zval *value;
! 22172: zval *exception;
! 22173:
! 22174:
! 22175: value = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22176:
! 22177: if (IS_CV == IS_CONST || Z_TYPE_P(value) != IS_OBJECT) {
! 22178: zend_error_noreturn(E_ERROR, "Can only throw objects");
! 22179: }
! 22180: zend_exception_save(TSRMLS_C);
! 22181: /* Not sure if a complete copy is what we want here */
! 22182: ALLOC_ZVAL(exception);
! 22183: INIT_PZVAL_COPY(exception, value);
! 22184: if (!0) {
! 22185: zval_copy_ctor(exception);
! 22186: }
! 22187:
! 22188: zend_throw_exception_object(exception TSRMLS_CC);
! 22189: zend_exception_restore(TSRMLS_C);
! 22190:
! 22191: ZEND_VM_NEXT_OPCODE();
! 22192: }
! 22193:
! 22194: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22195: {
! 22196: zend_op *opline = EX(opline);
! 22197: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
! 22198: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 22199: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);
! 22200: }
! 22201: {
! 22202: zval *valptr;
! 22203: zval *value;
! 22204:
! 22205:
! 22206: value = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22207:
! 22208: ALLOC_ZVAL(valptr);
! 22209: INIT_PZVAL_COPY(valptr, value);
! 22210: if (!0) {
! 22211: zval_copy_ctor(valptr);
! 22212: }
! 22213: zend_vm_stack_push(valptr TSRMLS_CC);
! 22214:
! 22215: }
! 22216: ZEND_VM_NEXT_OPCODE();
! 22217: }
! 22218:
! 22219: static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
! 22220: {
! 22221: zend_op *opline = EX(opline);
! 22222: zval *varptr;
! 22223:
! 22224: varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22225:
! 22226: if (varptr == &EG(uninitialized_zval)) {
! 22227: ALLOC_ZVAL(varptr);
! 22228: INIT_ZVAL(*varptr);
! 22229: Z_SET_REFCOUNT_P(varptr, 0);
! 22230: } else if (PZVAL_IS_REF(varptr)) {
! 22231: zval *original_var = varptr;
! 22232:
! 22233: ALLOC_ZVAL(varptr);
! 22234: *varptr = *original_var;
! 22235: Z_UNSET_ISREF_P(varptr);
! 22236: Z_SET_REFCOUNT_P(varptr, 0);
! 22237: zval_copy_ctor(varptr);
! 22238: }
! 22239: Z_ADDREF_P(varptr);
! 22240: zend_vm_stack_push(varptr TSRMLS_CC);
! 22241: ; /* for string offsets */
! 22242:
! 22243: ZEND_VM_NEXT_OPCODE();
! 22244: }
! 22245:
! 22246: static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22247: {
! 22248: zend_op *opline = EX(opline);
! 22249: zend_free_op free_op1;
! 22250: zval *varptr;
! 22251:
! 22252: if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
! 22253: if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
! 22254: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22255: }
! 22256: } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 22257: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22258: }
! 22259:
! 22260: if (IS_CV == IS_VAR &&
! 22261: (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
! 22262: EX_T(opline->op1.u.var).var.fcall_returned_reference &&
! 22263: EX_T(opline->op1.u.var).var.ptr) {
! 22264: varptr = EX_T(opline->op1.u.var).var.ptr;
! 22265: PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
! 22266: } else {
! 22267: varptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22268: }
! 22269: if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
! 22270: EX_T(opline->op1.u.var).var.fcall_returned_reference) &&
! 22271: varptr != &EG(uninitialized_zval) &&
! 22272: (PZVAL_IS_REF(varptr) ||
! 22273: (Z_REFCOUNT_P(varptr) == 1 && (IS_CV == IS_CV || free_op1.var)))) {
! 22274: Z_SET_ISREF_P(varptr);
! 22275: Z_ADDREF_P(varptr);
! 22276: zend_vm_stack_push(varptr TSRMLS_CC);
! 22277: } else {
! 22278: zval *valptr;
! 22279:
! 22280: if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
! 22281: !(opline->extended_value & ZEND_ARG_SEND_SILENT) :
! 22282: !ARG_MAY_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 22283: zend_error(E_STRICT, "Only variables should be passed by reference");
! 22284: }
! 22285: ALLOC_ZVAL(valptr);
! 22286: INIT_PZVAL_COPY(valptr, varptr);
! 22287: if (!0) {
! 22288: zval_copy_ctor(valptr);
! 22289: }
! 22290: zend_vm_stack_push(valptr TSRMLS_CC);
! 22291: }
! 22292:
! 22293: ZEND_VM_NEXT_OPCODE();
! 22294: }
! 22295:
! 22296: static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22297: {
! 22298: zend_op *opline = EX(opline);
! 22299:
! 22300: zval **varptr_ptr;
! 22301: zval *varptr;
! 22302: varptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 22303:
! 22304: if (IS_CV == IS_VAR && !varptr_ptr) {
! 22305: zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
! 22306: }
! 22307:
! 22308: if (IS_CV == IS_VAR && *varptr_ptr == EG(error_zval_ptr)) {
! 22309: ALLOC_INIT_ZVAL(varptr);
! 22310: zend_vm_stack_push(varptr TSRMLS_CC);
! 22311: ZEND_VM_NEXT_OPCODE();
! 22312: }
! 22313:
! 22314: if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION && !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 22315: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22316: }
! 22317:
! 22318: SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr);
! 22319: varptr = *varptr_ptr;
! 22320: Z_ADDREF_P(varptr);
! 22321: zend_vm_stack_push(varptr TSRMLS_CC);
! 22322:
! 22323: ZEND_VM_NEXT_OPCODE();
! 22324: }
! 22325:
! 22326: static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22327: {
! 22328: zend_op *opline = EX(opline);
! 22329:
! 22330: if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME)
! 22331: && ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {
! 22332: return ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22333: }
! 22334: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 22335: }
! 22336:
! 22337: static int ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22338: {
! 22339: zend_op *opline = EX(opline);
! 22340:
! 22341:
! 22342: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
! 22343: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = i_zend_is_true(_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC));
! 22344: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 22345:
! 22346: ZEND_VM_NEXT_OPCODE();
! 22347: }
! 22348:
! 22349: static int ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22350: {
! 22351: zend_op *opline = EX(opline);
! 22352:
! 22353: zval *obj = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22354: zend_class_entry *ce;
! 22355: zend_function *clone;
! 22356: zend_object_clone_obj_t clone_call;
! 22357:
! 22358: if (IS_CV == IS_CONST ||
! 22359: (IS_CV == IS_VAR && !obj) ||
! 22360: Z_TYPE_P(obj) != IS_OBJECT) {
! 22361: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
! 22362: }
! 22363:
! 22364: ce = Z_OBJCE_P(obj);
! 22365: clone = ce ? ce->clone : NULL;
! 22366: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
! 22367: if (!clone_call) {
! 22368: if (ce) {
! 22369: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
! 22370: } else {
! 22371: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
! 22372: }
! 22373: }
! 22374:
! 22375: if (ce && clone) {
! 22376: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
! 22377: /* Ensure that if we're calling a private function, we're allowed to do so.
! 22378: */
! 22379: if (ce != EG(scope)) {
! 22380: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 22381: }
! 22382: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
! 22383: /* Ensure that if we're calling a protected function, we're allowed to do so.
! 22384: */
! 22385: if (!zend_check_protected(clone->common.scope, EG(scope))) {
! 22386: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
! 22387: }
! 22388: }
! 22389: }
! 22390:
! 22391: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 22392: if (!EG(exception)) {
! 22393: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 22394: Z_OBJVAL_P(EX_T(opline->result.u.var).var.ptr) = clone_call(obj TSRMLS_CC);
! 22395: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_OBJECT;
! 22396: Z_SET_REFCOUNT_P(EX_T(opline->result.u.var).var.ptr, 1);
! 22397: Z_SET_ISREF_P(EX_T(opline->result.u.var).var.ptr);
! 22398: if (!RETURN_VALUE_USED(opline) || EG(exception)) {
! 22399: zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
! 22400: }
! 22401: }
! 22402:
! 22403: ZEND_VM_NEXT_OPCODE();
! 22404: }
! 22405:
! 22406: static int ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22407: {
! 22408: zend_op *opline = EX(opline);
! 22409:
! 22410: zval *expr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22411: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 22412:
! 22413: if (opline->extended_value != IS_STRING) {
! 22414: *result = *expr;
! 22415: if (!0) {
! 22416: zendi_zval_copy_ctor(*result);
! 22417: }
! 22418: }
! 22419: switch (opline->extended_value) {
! 22420: case IS_NULL:
! 22421: convert_to_null(result);
! 22422: break;
! 22423: case IS_BOOL:
! 22424: convert_to_boolean(result);
! 22425: break;
! 22426: case IS_LONG:
! 22427: convert_to_long(result);
! 22428: break;
! 22429: case IS_DOUBLE:
! 22430: convert_to_double(result);
! 22431: break;
! 22432: case IS_STRING: {
! 22433: zval var_copy;
! 22434: int use_copy;
! 22435:
! 22436: zend_make_printable_zval(expr, &var_copy, &use_copy);
! 22437: if (use_copy) {
! 22438: *result = var_copy;
! 22439: if (0) {
! 22440:
! 22441: }
! 22442: } else {
! 22443: *result = *expr;
! 22444: if (!0) {
! 22445: zendi_zval_copy_ctor(*result);
! 22446: }
! 22447: }
! 22448: break;
! 22449: }
! 22450: case IS_ARRAY:
! 22451: convert_to_array(result);
! 22452: break;
! 22453: case IS_OBJECT:
! 22454: convert_to_object(result);
! 22455: break;
! 22456: }
! 22457:
! 22458: ZEND_VM_NEXT_OPCODE();
! 22459: }
! 22460:
! 22461: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22462: {
! 22463: zend_op *opline = EX(opline);
! 22464: zend_op_array *new_op_array=NULL;
! 22465: int return_value_used;
! 22466:
! 22467: zval *inc_filename = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22468: zval tmp_inc_filename;
! 22469: zend_bool failure_retval=0;
! 22470:
! 22471: if (inc_filename->type!=IS_STRING) {
! 22472: tmp_inc_filename = *inc_filename;
! 22473: zval_copy_ctor(&tmp_inc_filename);
! 22474: convert_to_string(&tmp_inc_filename);
! 22475: inc_filename = &tmp_inc_filename;
! 22476: }
! 22477:
! 22478: return_value_used = RETURN_VALUE_USED(opline);
! 22479:
! 22480: if (Z_LVAL(opline->op2.u.constant) != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
! 22481: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE || Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE) {
! 22482: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 22483: } else {
! 22484: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 22485: }
! 22486: } else {
! 22487: switch (Z_LVAL(opline->op2.u.constant)) {
! 22488: case ZEND_INCLUDE_ONCE:
! 22489: case ZEND_REQUIRE_ONCE: {
! 22490: zend_file_handle file_handle;
! 22491: char *resolved_path;
! 22492:
! 22493: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
! 22494: if (resolved_path) {
! 22495: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
! 22496: } else {
! 22497: resolved_path = Z_STRVAL_P(inc_filename);
! 22498: }
! 22499:
! 22500: if (failure_retval) {
! 22501: /* do nothing, file already included */
! 22502: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
! 22503:
! 22504: if (!file_handle.opened_path) {
! 22505: file_handle.opened_path = estrdup(resolved_path);
! 22506: }
! 22507:
! 22508: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
! 22509: new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
! 22510: zend_destroy_file_handle(&file_handle TSRMLS_CC);
! 22511: } else {
! 22512: zend_file_handle_dtor(&file_handle TSRMLS_CC);
! 22513: failure_retval=1;
! 22514: }
! 22515: } else {
! 22516: if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
! 22517: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 22518: } else {
! 22519: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
! 22520: }
! 22521: }
! 22522: if (resolved_path != Z_STRVAL_P(inc_filename)) {
! 22523: efree(resolved_path);
! 22524: }
! 22525: }
! 22526: break;
! 22527: case ZEND_INCLUDE:
! 22528: case ZEND_REQUIRE:
! 22529: new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
! 22530: break;
! 22531: case ZEND_EVAL: {
! 22532: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
! 22533:
! 22534: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
! 22535: efree(eval_desc);
! 22536: }
! 22537: break;
! 22538: EMPTY_SWITCH_DEFAULT_CASE()
! 22539: }
! 22540: }
! 22541: if (inc_filename==&tmp_inc_filename) {
! 22542: zval_dtor(&tmp_inc_filename);
! 22543: }
! 22544:
! 22545: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 22546: if (new_op_array && !EG(exception)) {
! 22547: EX(original_return_value) = EG(return_value_ptr_ptr);
! 22548: EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
! 22549: EG(active_op_array) = new_op_array;
! 22550: EX_T(opline->result.u.var).var.ptr = NULL;
! 22551:
! 22552: EX(current_object) = EX(object);
! 22553:
! 22554: EX(function_state).function = (zend_function *) new_op_array;
! 22555: EX(object) = NULL;
! 22556:
! 22557: if (!EG(active_symbol_table)) {
! 22558: zend_rebuild_symbol_table(TSRMLS_C);
! 22559: }
! 22560:
! 22561: if (zend_execute == execute) {
! 22562: EX(call_opline) = opline;
! 22563: ZEND_VM_ENTER();
! 22564: } else {
! 22565: zend_execute(new_op_array TSRMLS_CC);
! 22566: }
! 22567:
! 22568: EX(function_state).function = (zend_function *) EX(op_array);
! 22569: EX(object) = EX(current_object);
! 22570:
! 22571: if (return_value_used) {
! 22572: if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
! 22573: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 22574: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 22575: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = 1;
! 22576: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 22577: }
! 22578: }
! 22579:
! 22580: EG(opline_ptr) = &EX(opline);
! 22581: EG(active_op_array) = EX(op_array);
! 22582: EG(return_value_ptr_ptr) = EX(original_return_value);
! 22583: destroy_op_array(new_op_array TSRMLS_CC);
! 22584: efree(new_op_array);
! 22585: if (EG(exception)) {
! 22586: zend_throw_exception_internal(NULL TSRMLS_CC);
! 22587: }
! 22588: } else {
! 22589: if (return_value_used) {
! 22590: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 22591: INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);
! 22592: Z_LVAL_P(EX_T(opline->result.u.var).var.ptr) = failure_retval;
! 22593: Z_TYPE_P(EX_T(opline->result.u.var).var.ptr) = IS_BOOL;
! 22594: }
! 22595: }
! 22596: ZEND_VM_NEXT_OPCODE();
! 22597: }
! 22598:
! 22599: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22600: {
! 22601: zend_op *opline = EX(opline);
! 22602: zval tmp, *varname;
! 22603: HashTable *target_symbol_table;
! 22604:
! 22605:
! 22606: if (IS_CV == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 22607: if (EG(active_symbol_table)) {
! 22608: zend_execute_data *ex = EX(prev_execute_data);
! 22609: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 22610:
! 22611: if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
! 22612: while (ex && ex->symbol_table == EG(active_symbol_table)) {
! 22613: int i;
! 22614:
! 22615: if (ex->op_array) {
! 22616: for (i = 0; i < ex->op_array->last_var; i++) {
! 22617: if (ex->op_array->vars[i].hash_value == cv->hash_value &&
! 22618: ex->op_array->vars[i].name_len == cv->name_len &&
! 22619: !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
! 22620: ex->CVs[i] = NULL;
! 22621: break;
! 22622: }
! 22623: }
! 22624: }
! 22625: ex = ex->prev_execute_data;
! 22626: }
! 22627: }
! 22628: EX(CVs)[opline->op1.u.var] = NULL;
! 22629: } else if (EX(CVs)[opline->op1.u.var]) {
! 22630: zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
! 22631: EX(CVs)[opline->op1.u.var] = NULL;
! 22632: }
! 22633: ZEND_VM_NEXT_OPCODE();
! 22634: }
! 22635:
! 22636: varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22637:
! 22638: if (Z_TYPE_P(varname) != IS_STRING) {
! 22639: tmp = *varname;
! 22640: zval_copy_ctor(&tmp);
! 22641: convert_to_string(&tmp);
! 22642: varname = &tmp;
! 22643: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
! 22644: Z_ADDREF_P(varname);
! 22645: }
! 22646:
! 22647: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 22648: zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
! 22649: } else {
! 22650: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
! 22651:
! 22652: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 22653: if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
! 22654: zend_execute_data *ex = execute_data;
! 22655:
! 22656: do {
! 22657: int i;
! 22658:
! 22659: if (ex->op_array) {
! 22660: for (i = 0; i < ex->op_array->last_var; i++) {
! 22661: if (ex->op_array->vars[i].hash_value == hash_value &&
! 22662: ex->op_array->vars[i].name_len == varname->value.str.len &&
! 22663: !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) {
! 22664: ex->CVs[i] = NULL;
! 22665: break;
! 22666: }
! 22667: }
! 22668: }
! 22669: ex = ex->prev_execute_data;
! 22670: } while (ex && ex->symbol_table == target_symbol_table);
! 22671: }
! 22672: }
! 22673:
! 22674: if (varname == &tmp) {
! 22675: zval_dtor(&tmp);
! 22676: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
! 22677: zval_ptr_dtor(&varname);
! 22678: }
! 22679:
! 22680: ZEND_VM_NEXT_OPCODE();
! 22681: }
! 22682:
! 22683: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22684: {
! 22685: zend_op *opline = EX(opline);
! 22686:
! 22687: zval *array_ptr, **array_ptr_ptr;
! 22688: HashTable *fe_ht;
! 22689: zend_object_iterator *iter = NULL;
! 22690: zend_class_entry *ce = NULL;
! 22691: zend_bool is_empty = 0;
! 22692:
! 22693: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 22694: array_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22695: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
! 22696: ALLOC_INIT_ZVAL(array_ptr);
! 22697: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
! 22698: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
! 22699: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
! 22700: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 22701: }
! 22702:
! 22703: ce = Z_OBJCE_PP(array_ptr_ptr);
! 22704: if (!ce || ce->get_iterator == NULL) {
! 22705: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 22706: Z_ADDREF_PP(array_ptr_ptr);
! 22707: }
! 22708: array_ptr = *array_ptr_ptr;
! 22709: } else {
! 22710: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
! 22711: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
! 22712: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
! 22713: Z_SET_ISREF_PP(array_ptr_ptr);
! 22714: }
! 22715: }
! 22716: array_ptr = *array_ptr_ptr;
! 22717: Z_ADDREF_P(array_ptr);
! 22718: }
! 22719: } else {
! 22720: array_ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22721: if (0) { /* IS_TMP_VAR */
! 22722: zval *tmp;
! 22723:
! 22724: ALLOC_ZVAL(tmp);
! 22725: INIT_PZVAL_COPY(tmp, array_ptr);
! 22726: array_ptr = tmp;
! 22727: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 22728: ce = Z_OBJCE_P(array_ptr);
! 22729: if (ce && ce->get_iterator) {
! 22730: Z_DELREF_P(array_ptr);
! 22731: }
! 22732: }
! 22733: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
! 22734: ce = Z_OBJCE_P(array_ptr);
! 22735: if (!ce || !ce->get_iterator) {
! 22736: Z_ADDREF_P(array_ptr);
! 22737: }
! 22738: } else if (IS_CV == IS_CONST ||
! 22739: ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
! 22740: !Z_ISREF_P(array_ptr) &&
! 22741: Z_REFCOUNT_P(array_ptr) > 1)) {
! 22742: zval *tmp;
! 22743:
! 22744: ALLOC_ZVAL(tmp);
! 22745: INIT_PZVAL_COPY(tmp, array_ptr);
! 22746: zval_copy_ctor(tmp);
! 22747: array_ptr = tmp;
! 22748: } else {
! 22749: Z_ADDREF_P(array_ptr);
! 22750: }
! 22751: }
! 22752:
! 22753: if (ce && ce->get_iterator) {
! 22754: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
! 22755:
! 22756: if (iter && !EG(exception)) {
! 22757: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
! 22758: } else {
! 22759: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 22760:
! 22761: } else {
! 22762:
! 22763: }
! 22764: if (!EG(exception)) {
! 22765: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
! 22766: }
! 22767: zend_throw_exception_internal(NULL TSRMLS_CC);
! 22768: ZEND_VM_NEXT_OPCODE();
! 22769: }
! 22770: }
! 22771:
! 22772: AI_SET_PTR(EX_T(opline->result.u.var).var, array_ptr);
! 22773: PZVAL_LOCK(array_ptr);
! 22774:
! 22775: if (iter) {
! 22776: iter->index = 0;
! 22777: if (iter->funcs->rewind) {
! 22778: iter->funcs->rewind(iter TSRMLS_CC);
! 22779: if (EG(exception)) {
! 22780: Z_DELREF_P(array_ptr);
! 22781: zval_ptr_dtor(&array_ptr);
! 22782: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 22783:
! 22784: } else {
! 22785:
! 22786: }
! 22787: ZEND_VM_NEXT_OPCODE();
! 22788: }
! 22789: }
! 22790: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
! 22791: if (EG(exception)) {
! 22792: Z_DELREF_P(array_ptr);
! 22793: zval_ptr_dtor(&array_ptr);
! 22794: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 22795:
! 22796: } else {
! 22797:
! 22798: }
! 22799: ZEND_VM_NEXT_OPCODE();
! 22800: }
! 22801: iter->index = -1; /* will be set to 0 before using next handler */
! 22802: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
! 22803: zend_hash_internal_pointer_reset(fe_ht);
! 22804: if (ce) {
! 22805: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
! 22806: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
! 22807: char *str_key;
! 22808: uint str_key_len;
! 22809: ulong int_key;
! 22810: zend_uchar key_type;
! 22811:
! 22812: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
! 22813: if (key_type != HASH_KEY_NON_EXISTANT &&
! 22814: (key_type == HASH_KEY_IS_LONG ||
! 22815: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
! 22816: break;
! 22817: }
! 22818: zend_hash_move_forward(fe_ht);
! 22819: }
! 22820: }
! 22821: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
! 22822: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.u.var).fe.fe_pos);
! 22823: } else {
! 22824: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
! 22825: is_empty = 1;
! 22826: }
! 22827:
! 22828: if (opline->extended_value & ZEND_FE_RESET_VARIABLE) {
! 22829:
! 22830: } else {
! 22831:
! 22832: }
! 22833: if (is_empty) {
! 22834: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
! 22835: } else {
! 22836: ZEND_VM_NEXT_OPCODE();
! 22837: }
! 22838: }
! 22839:
! 22840: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22841: {
! 22842: zend_op *opline = EX(opline);
! 22843: zval **value;
! 22844: zend_bool isset = 1;
! 22845:
! 22846: if (IS_CV == IS_CV && (opline->extended_value & ZEND_QUICK_SET)) {
! 22847: if (EX(CVs)[opline->op1.u.var]) {
! 22848: value = EX(CVs)[opline->op1.u.var];
! 22849: } else if (EG(active_symbol_table)) {
! 22850: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
! 22851:
! 22852: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
! 22853: isset = 0;
! 22854: }
! 22855: } else {
! 22856: isset = 0;
! 22857: }
! 22858: } else {
! 22859: HashTable *target_symbol_table;
! 22860:
! 22861: zval tmp, *varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 22862:
! 22863: if (Z_TYPE_P(varname) != IS_STRING) {
! 22864: tmp = *varname;
! 22865: zval_copy_ctor(&tmp);
! 22866: convert_to_string(&tmp);
! 22867: varname = &tmp;
! 22868: }
! 22869:
! 22870: if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
! 22871: 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);
! 22872: if (!value) {
! 22873: isset = 0;
! 22874: }
! 22875: } else {
! 22876: target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
! 22877: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
! 22878: isset = 0;
! 22879: }
! 22880: }
! 22881:
! 22882: if (varname == &tmp) {
! 22883: zval_dtor(&tmp);
! 22884: }
! 22885:
! 22886: }
! 22887:
! 22888: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 22889:
! 22890: switch (opline->extended_value & ZEND_ISSET_ISEMPTY_MASK) {
! 22891: case ZEND_ISSET:
! 22892: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 22893: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 22894: } else {
! 22895: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = isset;
! 22896: }
! 22897: break;
! 22898: case ZEND_ISEMPTY:
! 22899: if (!isset || !i_zend_is_true(*value)) {
! 22900: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 1;
! 22901: } else {
! 22902: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = 0;
! 22903: }
! 22904: break;
! 22905: }
! 22906:
! 22907: ZEND_VM_NEXT_OPCODE();
! 22908: }
! 22909:
! 22910: static int ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22911: {
! 22912: #if 0 || (IS_CV != IS_UNUSED)
! 22913: zend_op *opline = EX(opline);
! 22914: if (IS_CV != IS_UNUSED) {
! 22915:
! 22916: zval *ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22917:
! 22918: if (Z_TYPE_P(ptr) == IS_LONG) {
! 22919: EG(exit_status) = Z_LVAL_P(ptr);
! 22920: } else {
! 22921: zend_print_variable(ptr);
! 22922: }
! 22923:
! 22924: }
! 22925: #endif
! 22926: zend_bailout();
! 22927: ZEND_VM_NEXT_OPCODE();
! 22928: }
! 22929:
! 22930: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22931: {
! 22932: zend_op *opline = EX(opline);
! 22933:
! 22934: zval *value = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22935:
! 22936: if (i_zend_is_true(value)) {
! 22937: EX_T(opline->result.u.var).tmp_var = *value;
! 22938: zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);
! 22939:
! 22940: #if DEBUG_ZEND>=2
! 22941: printf("Conditional jmp to %d\n", opline->op2.u.opline_num);
! 22942: #endif
! 22943: ZEND_VM_JMP(opline->op2.u.jmp_addr);
! 22944: }
! 22945:
! 22946: ZEND_VM_NEXT_OPCODE();
! 22947: }
! 22948:
! 22949: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22950: {
! 22951: zend_op *opline = EX(opline);
! 22952:
! 22953: zval *value = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22954:
! 22955: EX_T(opline->result.u.var).tmp_var = *value;
! 22956: if (!0) {
! 22957: zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);
! 22958: }
! 22959:
! 22960: ZEND_VM_NEXT_OPCODE();
! 22961: }
! 22962:
! 22963: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22964: {
! 22965: zend_op *opline = EX(opline);
! 22966:
! 22967: zval *expr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 22968: zend_bool result;
! 22969:
! 22970: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
! 22971: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.u.var).class_entry TSRMLS_CC);
! 22972: } else {
! 22973: result = 0;
! 22974: }
! 22975: ZVAL_BOOL(&EX_T(opline->result.u.var).tmp_var, result);
! 22976:
! 22977: ZEND_VM_NEXT_OPCODE();
! 22978: }
! 22979:
! 22980: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22981: {
! 22982: zend_op *opline = EX(opline);
! 22983:
! 22984:
! 22985: add_function(&EX_T(opline->result.u.var).tmp_var,
! 22986: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 22987: &opline->op2.u.constant TSRMLS_CC);
! 22988:
! 22989:
! 22990: ZEND_VM_NEXT_OPCODE();
! 22991: }
! 22992:
! 22993: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 22994: {
! 22995: zend_op *opline = EX(opline);
! 22996:
! 22997:
! 22998: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 22999: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23000: &opline->op2.u.constant TSRMLS_CC);
! 23001:
! 23002:
! 23003: ZEND_VM_NEXT_OPCODE();
! 23004: }
! 23005:
! 23006: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23007: {
! 23008: zend_op *opline = EX(opline);
! 23009:
! 23010:
! 23011: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 23012: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23013: &opline->op2.u.constant TSRMLS_CC);
! 23014:
! 23015:
! 23016: ZEND_VM_NEXT_OPCODE();
! 23017: }
! 23018:
! 23019: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23020: {
! 23021: zend_op *opline = EX(opline);
! 23022:
! 23023:
! 23024: div_function(&EX_T(opline->result.u.var).tmp_var,
! 23025: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23026: &opline->op2.u.constant TSRMLS_CC);
! 23027:
! 23028:
! 23029: ZEND_VM_NEXT_OPCODE();
! 23030: }
! 23031:
! 23032: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23033: {
! 23034: zend_op *opline = EX(opline);
! 23035:
! 23036:
! 23037: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 23038: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23039: &opline->op2.u.constant TSRMLS_CC);
! 23040:
! 23041:
! 23042: ZEND_VM_NEXT_OPCODE();
! 23043: }
! 23044:
! 23045: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23046: {
! 23047: zend_op *opline = EX(opline);
! 23048:
! 23049:
! 23050: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 23051: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23052: &opline->op2.u.constant TSRMLS_CC);
! 23053:
! 23054:
! 23055: ZEND_VM_NEXT_OPCODE();
! 23056: }
! 23057:
! 23058: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23059: {
! 23060: zend_op *opline = EX(opline);
! 23061:
! 23062:
! 23063: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 23064: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23065: &opline->op2.u.constant TSRMLS_CC);
! 23066:
! 23067:
! 23068: ZEND_VM_NEXT_OPCODE();
! 23069: }
! 23070:
! 23071: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23072: {
! 23073: zend_op *opline = EX(opline);
! 23074:
! 23075:
! 23076: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 23077: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23078: &opline->op2.u.constant TSRMLS_CC);
! 23079:
! 23080:
! 23081: ZEND_VM_NEXT_OPCODE();
! 23082: }
! 23083:
! 23084: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23085: {
! 23086: zend_op *opline = EX(opline);
! 23087:
! 23088:
! 23089: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 23090: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23091: &opline->op2.u.constant TSRMLS_CC);
! 23092:
! 23093:
! 23094: ZEND_VM_NEXT_OPCODE();
! 23095: }
! 23096:
! 23097: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23098: {
! 23099: zend_op *opline = EX(opline);
! 23100:
! 23101: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 23102:
! 23103: is_identical_function(result,
! 23104: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23105: &opline->op2.u.constant TSRMLS_CC);
! 23106: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 23107:
! 23108:
! 23109: ZEND_VM_NEXT_OPCODE();
! 23110: }
! 23111:
! 23112: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23113: {
! 23114: zend_op *opline = EX(opline);
! 23115:
! 23116: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 23117:
! 23118: compare_function(result,
! 23119: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23120: &opline->op2.u.constant TSRMLS_CC);
! 23121: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 23122:
! 23123:
! 23124: ZEND_VM_NEXT_OPCODE();
! 23125: }
! 23126:
! 23127: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23128: {
! 23129: zend_op *opline = EX(opline);
! 23130:
! 23131: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 23132:
! 23133: compare_function(result,
! 23134: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23135: &opline->op2.u.constant TSRMLS_CC);
! 23136: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 23137:
! 23138:
! 23139: ZEND_VM_NEXT_OPCODE();
! 23140: }
! 23141:
! 23142: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23143: {
! 23144: zend_op *opline = EX(opline);
! 23145:
! 23146: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 23147:
! 23148: compare_function(result,
! 23149: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23150: &opline->op2.u.constant TSRMLS_CC);
! 23151: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 23152:
! 23153:
! 23154: ZEND_VM_NEXT_OPCODE();
! 23155: }
! 23156:
! 23157: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23158: {
! 23159: zend_op *opline = EX(opline);
! 23160:
! 23161: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 23162:
! 23163: compare_function(result,
! 23164: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23165: &opline->op2.u.constant TSRMLS_CC);
! 23166: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 23167:
! 23168:
! 23169: ZEND_VM_NEXT_OPCODE();
! 23170: }
! 23171:
! 23172: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23173: {
! 23174: zend_op *opline = EX(opline);
! 23175:
! 23176:
! 23177: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 23178: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23179: &opline->op2.u.constant TSRMLS_CC);
! 23180:
! 23181:
! 23182: ZEND_VM_NEXT_OPCODE();
! 23183: }
! 23184:
! 23185: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23186: {
! 23187: zend_op *opline = EX(opline);
! 23188:
! 23189:
! 23190: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 23191: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23192: &opline->op2.u.constant TSRMLS_CC);
! 23193:
! 23194:
! 23195: ZEND_VM_NEXT_OPCODE();
! 23196: }
! 23197:
! 23198: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23199: {
! 23200: zend_op *opline = EX(opline);
! 23201:
! 23202:
! 23203: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 23204: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23205: &opline->op2.u.constant TSRMLS_CC);
! 23206:
! 23207:
! 23208: ZEND_VM_NEXT_OPCODE();
! 23209: }
! 23210:
! 23211: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23212: {
! 23213: zend_op *opline = EX(opline);
! 23214:
! 23215:
! 23216: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 23217: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 23218: &opline->op2.u.constant TSRMLS_CC);
! 23219:
! 23220:
! 23221: ZEND_VM_NEXT_OPCODE();
! 23222: }
! 23223:
! 23224: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 23225: {
! 23226: zend_op *opline = EX(opline);
! 23227: zend_op *op_data = opline+1;
! 23228: zend_free_op free_op_data1;
! 23229: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23230: zval *object;
! 23231: zval *property = &opline->op2.u.constant;
! 23232: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 23233: znode *result = &opline->result;
! 23234: int have_get_ptr = 0;
! 23235:
! 23236: if (IS_CV == IS_VAR && !object_ptr) {
! 23237: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 23238: }
! 23239:
! 23240: EX_T(result->u.var).var.ptr_ptr = NULL;
! 23241: make_real_object(object_ptr TSRMLS_CC);
! 23242: object = *object_ptr;
! 23243:
! 23244: if (Z_TYPE_P(object) != IS_OBJECT) {
! 23245: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 23246:
! 23247: FREE_OP(free_op_data1);
! 23248:
! 23249: if (!RETURN_VALUE_UNUSED(result)) {
! 23250: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 23251: EX_T(result->u.var).var.ptr_ptr = NULL;
! 23252: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 23253: }
! 23254: } else {
! 23255: /* here we are sure we are dealing with an object */
! 23256: if (0) {
! 23257: MAKE_REAL_ZVAL_PTR(property);
! 23258: }
! 23259:
! 23260: /* here property is a string */
! 23261: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 23262: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 23263: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 23264: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 23265: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 23266:
! 23267: have_get_ptr = 1;
! 23268: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 23269: if (!RETURN_VALUE_UNUSED(result)) {
! 23270: EX_T(result->u.var).var.ptr = *zptr;
! 23271: EX_T(result->u.var).var.ptr_ptr = NULL;
! 23272: PZVAL_LOCK(*zptr);
! 23273: }
! 23274: }
! 23275: }
! 23276:
! 23277: if (!have_get_ptr) {
! 23278: zval *z = NULL;
! 23279:
! 23280: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 23281: if (Z_OBJ_HT_P(object)->read_property) {
! 23282: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 23283: }
! 23284: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 23285: if (Z_OBJ_HT_P(object)->read_dimension) {
! 23286: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 23287: }
! 23288: }
! 23289: if (z) {
! 23290: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 23291: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 23292:
! 23293: if (Z_REFCOUNT_P(z) == 0) {
! 23294: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 23295: zval_dtor(z);
! 23296: FREE_ZVAL(z);
! 23297: }
! 23298: z = value;
! 23299: }
! 23300: Z_ADDREF_P(z);
! 23301: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 23302: binary_op(z, z, value TSRMLS_CC);
! 23303: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 23304: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 23305: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 23306: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 23307: }
! 23308: if (!RETURN_VALUE_UNUSED(result)) {
! 23309: EX_T(result->u.var).var.ptr = z;
! 23310: EX_T(result->u.var).var.ptr_ptr = NULL;
! 23311: PZVAL_LOCK(z);
! 23312: }
! 23313: zval_ptr_dtor(&z);
! 23314: } else {
! 23315: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 23316: if (!RETURN_VALUE_UNUSED(result)) {
! 23317: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 23318: EX_T(result->u.var).var.ptr_ptr = NULL;
! 23319: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 23320: }
! 23321: }
! 23322: }
! 23323:
! 23324: if (0) {
! 23325: zval_ptr_dtor(&property);
! 23326: } else {
! 23327:
! 23328: }
! 23329: FREE_OP(free_op_data1);
! 23330: }
! 23331:
! 23332: /* assign_obj has two opcodes! */
! 23333: ZEND_VM_INC_OPCODE();
! 23334: ZEND_VM_NEXT_OPCODE();
! 23335: }
! 23336:
! 23337: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 23338: {
! 23339: zend_op *opline = EX(opline);
! 23340: zend_free_op free_op_data2, free_op_data1;
! 23341: zval **var_ptr;
! 23342: zval *value;
! 23343:
! 23344: switch (opline->extended_value) {
! 23345: case ZEND_ASSIGN_OBJ:
! 23346: return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23347: break;
! 23348: case ZEND_ASSIGN_DIM: {
! 23349: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 23350:
! 23351: if (IS_CV == IS_VAR && !container) {
! 23352: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23353: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 23354: if (IS_CV == IS_VAR && !0) {
! 23355: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 23356: }
! 23357: return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23358: } else {
! 23359: zend_op *op_data = opline+1;
! 23360: zval *dim = &opline->op2.u.constant;
! 23361:
! 23362: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 23363: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 23364: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 23365: ZEND_VM_INC_OPCODE();
! 23366: }
! 23367: }
! 23368: break;
! 23369: default:
! 23370: value = &opline->op2.u.constant;
! 23371: var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 23372: /* do nothing */
! 23373: break;
! 23374: }
! 23375:
! 23376: if (!var_ptr) {
! 23377: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 23378: }
! 23379:
! 23380: if (*var_ptr == EG(error_zval_ptr)) {
! 23381: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23382: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 23383: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 23384: }
! 23385:
! 23386:
! 23387: ZEND_VM_NEXT_OPCODE();
! 23388: }
! 23389:
! 23390: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 23391:
! 23392: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 23393: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 23394: /* proxy object */
! 23395: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 23396: Z_ADDREF_P(objval);
! 23397: binary_op(objval, objval, value TSRMLS_CC);
! 23398: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 23399: zval_ptr_dtor(&objval);
! 23400: } else {
! 23401: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 23402: }
! 23403:
! 23404: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23405: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 23406: PZVAL_LOCK(*var_ptr);
! 23407: }
! 23408:
! 23409: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 23410: FREE_OP(free_op_data1);
! 23411: FREE_OP_VAR_PTR(free_op_data2);
! 23412: }
! 23413:
! 23414: ZEND_VM_NEXT_OPCODE();
! 23415: }
! 23416:
! 23417: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23418: {
! 23419: return zend_binary_assign_op_helper_SPEC_CV_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23420: }
! 23421:
! 23422: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23423: {
! 23424: return zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23425: }
! 23426:
! 23427: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23428: {
! 23429: return zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23430: }
! 23431:
! 23432: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23433: {
! 23434: return zend_binary_assign_op_helper_SPEC_CV_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23435: }
! 23436:
! 23437: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23438: {
! 23439: return zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23440: }
! 23441:
! 23442: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23443: {
! 23444: return zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23445: }
! 23446:
! 23447: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23448: {
! 23449: return zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23450: }
! 23451:
! 23452: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23453: {
! 23454: return zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23455: }
! 23456:
! 23457: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23458: {
! 23459: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23460: }
! 23461:
! 23462: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23463: {
! 23464: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23465: }
! 23466:
! 23467: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23468: {
! 23469: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23470: }
! 23471:
! 23472: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 23473: {
! 23474: zend_op *opline = EX(opline);
! 23475:
! 23476: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23477: zval *object;
! 23478: zval *property = &opline->op2.u.constant;
! 23479: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 23480: int have_get_ptr = 0;
! 23481:
! 23482: if (IS_CV == IS_VAR && !object_ptr) {
! 23483: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 23484: }
! 23485:
! 23486: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 23487: object = *object_ptr;
! 23488:
! 23489: if (Z_TYPE_P(object) != IS_OBJECT) {
! 23490: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 23491:
! 23492: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23493: *retval = EG(uninitialized_zval_ptr);
! 23494: PZVAL_LOCK(*retval);
! 23495: }
! 23496:
! 23497: ZEND_VM_NEXT_OPCODE();
! 23498: }
! 23499:
! 23500: /* here we are sure we are dealing with an object */
! 23501:
! 23502: if (0) {
! 23503: MAKE_REAL_ZVAL_PTR(property);
! 23504: }
! 23505:
! 23506: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 23507: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 23508: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 23509: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 23510:
! 23511: have_get_ptr = 1;
! 23512: incdec_op(*zptr);
! 23513: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23514: *retval = *zptr;
! 23515: PZVAL_LOCK(*retval);
! 23516: }
! 23517: }
! 23518: }
! 23519:
! 23520: if (!have_get_ptr) {
! 23521: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 23522: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 23523:
! 23524: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 23525: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 23526:
! 23527: if (Z_REFCOUNT_P(z) == 0) {
! 23528: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 23529: zval_dtor(z);
! 23530: FREE_ZVAL(z);
! 23531: }
! 23532: z = value;
! 23533: }
! 23534: Z_ADDREF_P(z);
! 23535: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 23536: incdec_op(z);
! 23537: *retval = z;
! 23538: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 23539: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 23540: zval_ptr_dtor(&z);
! 23541: } else {
! 23542: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 23543: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23544: *retval = EG(uninitialized_zval_ptr);
! 23545: PZVAL_LOCK(*retval);
! 23546: }
! 23547: }
! 23548: }
! 23549:
! 23550: if (0) {
! 23551: zval_ptr_dtor(&property);
! 23552: } else {
! 23553:
! 23554: }
! 23555:
! 23556: ZEND_VM_NEXT_OPCODE();
! 23557: }
! 23558:
! 23559: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23560: {
! 23561: return zend_pre_incdec_property_helper_SPEC_CV_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23562: }
! 23563:
! 23564: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23565: {
! 23566: return zend_pre_incdec_property_helper_SPEC_CV_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23567: }
! 23568:
! 23569: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 23570: {
! 23571: zend_op *opline = EX(opline);
! 23572:
! 23573: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23574: zval *object;
! 23575: zval *property = &opline->op2.u.constant;
! 23576: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 23577: int have_get_ptr = 0;
! 23578:
! 23579: if (IS_CV == IS_VAR && !object_ptr) {
! 23580: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 23581: }
! 23582:
! 23583: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 23584: object = *object_ptr;
! 23585:
! 23586: if (Z_TYPE_P(object) != IS_OBJECT) {
! 23587: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 23588:
! 23589: *retval = *EG(uninitialized_zval_ptr);
! 23590:
! 23591: ZEND_VM_NEXT_OPCODE();
! 23592: }
! 23593:
! 23594: /* here we are sure we are dealing with an object */
! 23595:
! 23596: if (0) {
! 23597: MAKE_REAL_ZVAL_PTR(property);
! 23598: }
! 23599:
! 23600: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 23601: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 23602: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 23603: have_get_ptr = 1;
! 23604: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 23605:
! 23606: *retval = **zptr;
! 23607: zendi_zval_copy_ctor(*retval);
! 23608:
! 23609: incdec_op(*zptr);
! 23610:
! 23611: }
! 23612: }
! 23613:
! 23614: if (!have_get_ptr) {
! 23615: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 23616: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 23617: zval *z_copy;
! 23618:
! 23619: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 23620: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 23621:
! 23622: if (Z_REFCOUNT_P(z) == 0) {
! 23623: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 23624: zval_dtor(z);
! 23625: FREE_ZVAL(z);
! 23626: }
! 23627: z = value;
! 23628: }
! 23629: *retval = *z;
! 23630: zendi_zval_copy_ctor(*retval);
! 23631: ALLOC_ZVAL(z_copy);
! 23632: *z_copy = *z;
! 23633: zendi_zval_copy_ctor(*z_copy);
! 23634: INIT_PZVAL(z_copy);
! 23635: incdec_op(z_copy);
! 23636: Z_ADDREF_P(z);
! 23637: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 23638: zval_ptr_dtor(&z_copy);
! 23639: zval_ptr_dtor(&z);
! 23640: } else {
! 23641: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 23642: *retval = *EG(uninitialized_zval_ptr);
! 23643: }
! 23644: }
! 23645:
! 23646: if (0) {
! 23647: zval_ptr_dtor(&property);
! 23648: } else {
! 23649:
! 23650: }
! 23651:
! 23652: ZEND_VM_NEXT_OPCODE();
! 23653: }
! 23654:
! 23655: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23656: {
! 23657: return zend_post_incdec_property_helper_SPEC_CV_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23658: }
! 23659:
! 23660: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23661: {
! 23662: return zend_post_incdec_property_helper_SPEC_CV_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23663: }
! 23664:
! 23665: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23666: {
! 23667: zend_op *opline = EX(opline);
! 23668:
! 23669: zval *dim = &opline->op2.u.constant;
! 23670: zval **container;
! 23671:
! 23672: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 23673: IS_CV != IS_CV &&
! 23674: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 23675: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 23676: }
! 23677: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 23678: if (IS_CV == IS_VAR && !container) {
! 23679: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23680: }
! 23681: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 23682:
! 23683:
! 23684: ZEND_VM_NEXT_OPCODE();
! 23685: }
! 23686:
! 23687: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23688: {
! 23689: zend_op *opline = EX(opline);
! 23690: zend_free_op free_op1;
! 23691: zval *dim = &opline->op2.u.constant;
! 23692: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23693:
! 23694: if (IS_CV == IS_VAR && !container) {
! 23695: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23696: }
! 23697: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 23698:
! 23699: if (IS_CV == IS_VAR && 0 &&
! 23700: READY_TO_DESTROY(free_op1.var)) {
! 23701: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23702: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23703: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23704: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23705: }
! 23706: }
! 23707:
! 23708: /* We are going to assign the result by reference */
! 23709: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 23710: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 23711: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 23712: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 23713: }
! 23714:
! 23715: ZEND_VM_NEXT_OPCODE();
! 23716: }
! 23717:
! 23718: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23719: {
! 23720: zend_op *opline = EX(opline);
! 23721: zend_free_op free_op1;
! 23722: zval *dim = &opline->op2.u.constant;
! 23723: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 23724:
! 23725: if (IS_CV == IS_VAR && !container) {
! 23726: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23727: }
! 23728: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 23729:
! 23730: if (IS_CV == IS_VAR && 0 &&
! 23731: READY_TO_DESTROY(free_op1.var)) {
! 23732: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23733: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23734: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23735: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23736: }
! 23737: }
! 23738:
! 23739: ZEND_VM_NEXT_OPCODE();
! 23740: }
! 23741:
! 23742: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23743: {
! 23744: zend_op *opline = EX(opline);
! 23745:
! 23746: zval *dim = &opline->op2.u.constant;
! 23747: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 23748:
! 23749: if (IS_CV == IS_VAR && !container) {
! 23750: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23751: }
! 23752: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 23753:
! 23754:
! 23755: ZEND_VM_NEXT_OPCODE();
! 23756: }
! 23757:
! 23758: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23759: {
! 23760: zend_op *opline = EX(opline);
! 23761: zend_free_op free_op1;
! 23762: zval *dim = &opline->op2.u.constant;
! 23763: zval **container;
! 23764:
! 23765: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 23766: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23767: if (IS_CV == IS_VAR && !container) {
! 23768: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23769: }
! 23770: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 23771: if (IS_CV == IS_VAR && 0 &&
! 23772: READY_TO_DESTROY(free_op1.var)) {
! 23773: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23774: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23775: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23776: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23777: }
! 23778: }
! 23779: } else {
! 23780: if (IS_CONST == IS_UNUSED) {
! 23781: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 23782: }
! 23783: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 23784: if (IS_CV == IS_VAR && !container) {
! 23785: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23786: }
! 23787: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 23788: }
! 23789:
! 23790:
! 23791: ZEND_VM_NEXT_OPCODE();
! 23792: }
! 23793:
! 23794: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23795: {
! 23796: zend_op *opline = EX(opline);
! 23797: zend_free_op free_op1;
! 23798: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 23799: zval *dim = &opline->op2.u.constant;
! 23800:
! 23801: /* Not needed in DIM_UNSET
! 23802: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 23803: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 23804: }
! 23805: */
! 23806: if (IS_CV == IS_CV) {
! 23807: if (container != &EG(uninitialized_zval_ptr)) {
! 23808: SEPARATE_ZVAL_IF_NOT_REF(container);
! 23809: }
! 23810: }
! 23811: if (IS_CV == IS_VAR && !container) {
! 23812: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 23813: }
! 23814: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 23815:
! 23816: if (IS_CV == IS_VAR && 0 &&
! 23817: READY_TO_DESTROY(free_op1.var)) {
! 23818: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23819: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23820: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23821: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23822: }
! 23823: }
! 23824:
! 23825: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 23826: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 23827: } else {
! 23828: zend_free_op free_res;
! 23829:
! 23830: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 23831: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 23832: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 23833: }
! 23834: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 23835: FREE_OP_VAR_PTR(free_res);
! 23836: }
! 23837: ZEND_VM_NEXT_OPCODE();
! 23838: }
! 23839:
! 23840: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
! 23841: {
! 23842: zend_op *opline = EX(opline);
! 23843:
! 23844: zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
! 23845:
! 23846: zval *offset = &opline->op2.u.constant;
! 23847:
! 23848: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 23849: if (type != BP_VAR_IS) {
! 23850: zend_error(E_NOTICE, "Trying to get property of non-object");
! 23851: }
! 23852: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 23853: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 23854: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 23855: }
! 23856:
! 23857: } else {
! 23858: zval *retval;
! 23859:
! 23860: if (0) {
! 23861: MAKE_REAL_ZVAL_PTR(offset);
! 23862: }
! 23863:
! 23864: /* here we are sure we are dealing with an object */
! 23865: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 23866:
! 23867: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 23868: if (Z_REFCOUNT_P(retval) == 0) {
! 23869: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 23870: zval_dtor(retval);
! 23871: FREE_ZVAL(retval);
! 23872: }
! 23873: } else {
! 23874: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 23875: PZVAL_LOCK(retval);
! 23876: }
! 23877:
! 23878: if (0) {
! 23879: zval_ptr_dtor(&offset);
! 23880: } else {
! 23881:
! 23882: }
! 23883: }
! 23884:
! 23885: ZEND_VM_NEXT_OPCODE();
! 23886: }
! 23887:
! 23888: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23889: {
! 23890: return zend_fetch_property_address_read_helper_SPEC_CV_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23891: }
! 23892:
! 23893: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23894: {
! 23895: zend_op *opline = EX(opline);
! 23896: zend_free_op free_op1;
! 23897: zval *property = &opline->op2.u.constant;
! 23898: zval **container;
! 23899:
! 23900: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 23901: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 23902: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 23903: }
! 23904:
! 23905: if (0) {
! 23906: MAKE_REAL_ZVAL_PTR(property);
! 23907: }
! 23908: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23909: if (IS_CV == IS_VAR && !container) {
! 23910: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 23911: }
! 23912: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 23913: if (0) {
! 23914: zval_ptr_dtor(&property);
! 23915: } else {
! 23916:
! 23917: }
! 23918: if (IS_CV == IS_VAR && 0 &&
! 23919: READY_TO_DESTROY(free_op1.var)) {
! 23920: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23921: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23922: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23923: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23924: }
! 23925: }
! 23926:
! 23927: /* We are going to assign the result by reference */
! 23928: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 23929: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 23930: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 23931: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 23932: }
! 23933:
! 23934: ZEND_VM_NEXT_OPCODE();
! 23935: }
! 23936:
! 23937: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23938: {
! 23939: zend_op *opline = EX(opline);
! 23940: zend_free_op free_op1;
! 23941: zval *property = &opline->op2.u.constant;
! 23942: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 23943:
! 23944: if (0) {
! 23945: MAKE_REAL_ZVAL_PTR(property);
! 23946: }
! 23947: if (IS_CV == IS_VAR && !container) {
! 23948: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 23949: }
! 23950: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 23951: if (0) {
! 23952: zval_ptr_dtor(&property);
! 23953: } else {
! 23954:
! 23955: }
! 23956: if (IS_CV == IS_VAR && 0 &&
! 23957: READY_TO_DESTROY(free_op1.var)) {
! 23958: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23959: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23960: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 23961: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 23962: }
! 23963: }
! 23964:
! 23965: ZEND_VM_NEXT_OPCODE();
! 23966: }
! 23967:
! 23968: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23969: {
! 23970: return zend_fetch_property_address_read_helper_SPEC_CV_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 23971: }
! 23972:
! 23973: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 23974: {
! 23975: zend_op *opline = EX(opline);
! 23976:
! 23977: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 23978: /* Behave like FETCH_OBJ_W */
! 23979: zend_free_op free_op1;
! 23980: zval *property = &opline->op2.u.constant;
! 23981: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 23982:
! 23983: if (0) {
! 23984: MAKE_REAL_ZVAL_PTR(property);
! 23985: }
! 23986: if (IS_CV == IS_VAR && !container) {
! 23987: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 23988: }
! 23989: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 23990: if (0) {
! 23991: zval_ptr_dtor(&property);
! 23992: } else {
! 23993:
! 23994: }
! 23995: if (IS_CV == IS_VAR && 0 &&
! 23996: READY_TO_DESTROY(free_op1.var)) {
! 23997: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 23998: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 23999: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 24000: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 24001: }
! 24002: }
! 24003:
! 24004: ZEND_VM_NEXT_OPCODE();
! 24005: } else {
! 24006: return zend_fetch_property_address_read_helper_SPEC_CV_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24007: }
! 24008: }
! 24009:
! 24010: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24011: {
! 24012: zend_op *opline = EX(opline);
! 24013: zend_free_op free_op1, free_res;
! 24014: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 24015: zval *property = &opline->op2.u.constant;
! 24016:
! 24017: if (IS_CV == IS_CV) {
! 24018: if (container != &EG(uninitialized_zval_ptr)) {
! 24019: SEPARATE_ZVAL_IF_NOT_REF(container);
! 24020: }
! 24021: }
! 24022: if (0) {
! 24023: MAKE_REAL_ZVAL_PTR(property);
! 24024: }
! 24025: if (IS_CV == IS_VAR && !container) {
! 24026: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 24027: }
! 24028: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 24029: if (0) {
! 24030: zval_ptr_dtor(&property);
! 24031: } else {
! 24032:
! 24033: }
! 24034: if (IS_CV == IS_VAR && 0 &&
! 24035: READY_TO_DESTROY(free_op1.var)) {
! 24036: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 24037: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 24038: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 24039: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 24040: }
! 24041: }
! 24042:
! 24043: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 24044: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 24045: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 24046: }
! 24047: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 24048: FREE_OP_VAR_PTR(free_res);
! 24049: ZEND_VM_NEXT_OPCODE();
! 24050: }
! 24051:
! 24052: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24053: {
! 24054: zend_op *opline = EX(opline);
! 24055: zend_op *op_data = opline+1;
! 24056:
! 24057: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 24058: zval *property_name = &opline->op2.u.constant;
! 24059:
! 24060: if (0) {
! 24061: MAKE_REAL_ZVAL_PTR(property_name);
! 24062: }
! 24063: if (IS_CV == IS_VAR && !object_ptr) {
! 24064: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 24065: }
! 24066: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 24067: if (0) {
! 24068: zval_ptr_dtor(&property_name);
! 24069: } else {
! 24070:
! 24071: }
! 24072:
! 24073: /* assign_obj has two opcodes! */
! 24074: ZEND_VM_INC_OPCODE();
! 24075: ZEND_VM_NEXT_OPCODE();
! 24076: }
! 24077:
! 24078: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24079: {
! 24080: zend_op *opline = EX(opline);
! 24081: zend_op *op_data = opline+1;
! 24082:
! 24083: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 24084:
! 24085: if (IS_CV == IS_VAR && !object_ptr) {
! 24086: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 24087: }
! 24088: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 24089:
! 24090: zval *property_name = &opline->op2.u.constant;
! 24091:
! 24092: if (0) {
! 24093: MAKE_REAL_ZVAL_PTR(property_name);
! 24094: }
! 24095: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 24096: if (0) {
! 24097: zval_ptr_dtor(&property_name);
! 24098: } else {
! 24099:
! 24100: }
! 24101: } else {
! 24102: zend_free_op free_op_data1, free_op_data2;
! 24103: zval *value;
! 24104: zval *dim = &opline->op2.u.constant;
! 24105: zval **variable_ptr_ptr;
! 24106:
! 24107: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 24108:
! 24109: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 24110: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 24111: if (!variable_ptr_ptr) {
! 24112: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 24113: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24114: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 24115: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 24116: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 24117: 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);
! 24118: }
! 24119: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24120: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 24121: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 24122: }
! 24123: } else {
! 24124: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 24125: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24126: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 24127: PZVAL_LOCK(value);
! 24128: }
! 24129: }
! 24130: FREE_OP_VAR_PTR(free_op_data2);
! 24131: FREE_OP_IF_VAR(free_op_data1);
! 24132: }
! 24133:
! 24134: /* assign_dim has two opcodes! */
! 24135: ZEND_VM_INC_OPCODE();
! 24136: ZEND_VM_NEXT_OPCODE();
! 24137: }
! 24138:
! 24139: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24140: {
! 24141: zend_op *opline = EX(opline);
! 24142:
! 24143: zval *value = &opline->op2.u.constant;
! 24144: zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 24145:
! 24146: if (IS_CV == IS_VAR && !variable_ptr_ptr) {
! 24147: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
! 24148: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24149: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 24150: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 24151: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 24152: 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);
! 24153: }
! 24154: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24155: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 24156: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 24157: }
! 24158: } else {
! 24159: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 24160: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 24161: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 24162: PZVAL_LOCK(value);
! 24163: }
! 24164: }
! 24165:
! 24166: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 24167:
! 24168: ZEND_VM_NEXT_OPCODE();
! 24169: }
! 24170:
! 24171: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24172: {
! 24173: zend_op *opline = EX(opline);
! 24174: zval *function_name;
! 24175: char *function_name_strval;
! 24176: int function_name_strlen;
! 24177:
! 24178:
! 24179: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 24180:
! 24181: function_name = &opline->op2.u.constant;
! 24182:
! 24183: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 24184: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 24185: }
! 24186:
! 24187: function_name_strval = Z_STRVAL_P(function_name);
! 24188: function_name_strlen = Z_STRLEN_P(function_name);
! 24189:
! 24190: EX(object) = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 24191:
! 24192: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 24193: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 24194: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 24195: }
! 24196:
! 24197: /* First, locate the function. */
! 24198: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 24199: if (!EX(fbc)) {
! 24200: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 24201: }
! 24202:
! 24203: EX(called_scope) = Z_OBJCE_P(EX(object));
! 24204: } else {
! 24205: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 24206: }
! 24207:
! 24208: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 24209: EX(object) = NULL;
! 24210: } else {
! 24211: if (!PZVAL_IS_REF(EX(object))) {
! 24212: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 24213: } else {
! 24214: zval *this_ptr;
! 24215: ALLOC_ZVAL(this_ptr);
! 24216: INIT_PZVAL_COPY(this_ptr, EX(object));
! 24217: zval_copy_ctor(this_ptr);
! 24218: EX(object) = this_ptr;
! 24219: }
! 24220: }
! 24221:
! 24222:
! 24223: ZEND_VM_NEXT_OPCODE();
! 24224: }
! 24225:
! 24226: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24227: {
! 24228: zend_op *opline = EX(opline);
! 24229: int switch_expr_is_overloaded=0;
! 24230:
! 24231:
! 24232: if (IS_CV==IS_VAR) {
! 24233: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 24234: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 24235: } else {
! 24236: switch_expr_is_overloaded = 1;
! 24237: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 24238: }
! 24239: }
! 24240: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 24241: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24242: &opline->op2.u.constant TSRMLS_CC);
! 24243:
! 24244: if (switch_expr_is_overloaded) {
! 24245: /* We only free op1 if this is a string offset,
! 24246: * Since if it is a TMP_VAR, it'll be reused by
! 24247: * other CASE opcodes (whereas string offsets
! 24248: * are allocated at each get_zval_ptr())
! 24249: */
! 24250:
! 24251: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 24252: EX_T(opline->op1.u.var).var.ptr = NULL;
! 24253: }
! 24254: ZEND_VM_NEXT_OPCODE();
! 24255: }
! 24256:
! 24257: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24258: {
! 24259: zend_op *opline = EX(opline);
! 24260:
! 24261: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 24262: zval *expr_ptr;
! 24263: zval *offset=&opline->op2.u.constant;
! 24264:
! 24265: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 24266: zval **expr_ptr_ptr = NULL;
! 24267:
! 24268: if (opline->extended_value) {
! 24269: expr_ptr_ptr=_get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 24270: expr_ptr = *expr_ptr_ptr;
! 24271: } else {
! 24272: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 24273: }
! 24274: #else
! 24275: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 24276: #endif
! 24277:
! 24278: if (0) { /* temporary variable */
! 24279: zval *new_expr;
! 24280:
! 24281: ALLOC_ZVAL(new_expr);
! 24282: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 24283: expr_ptr = new_expr;
! 24284: } else {
! 24285: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 24286: if (opline->extended_value) {
! 24287: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 24288: expr_ptr = *expr_ptr_ptr;
! 24289: Z_ADDREF_P(expr_ptr);
! 24290: } else
! 24291: #endif
! 24292: if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 24293: zval *new_expr;
! 24294:
! 24295: ALLOC_ZVAL(new_expr);
! 24296: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 24297: expr_ptr = new_expr;
! 24298: zendi_zval_copy_ctor(*expr_ptr);
! 24299: } else {
! 24300: Z_ADDREF_P(expr_ptr);
! 24301: }
! 24302: }
! 24303: if (offset) {
! 24304: switch (Z_TYPE_P(offset)) {
! 24305: case IS_DOUBLE:
! 24306: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 24307: break;
! 24308: case IS_LONG:
! 24309: case IS_BOOL:
! 24310: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 24311: break;
! 24312: case IS_STRING:
! 24313: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 24314: break;
! 24315: case IS_NULL:
! 24316: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 24317: break;
! 24318: default:
! 24319: zend_error(E_WARNING, "Illegal offset type");
! 24320: zval_ptr_dtor(&expr_ptr);
! 24321: /* do nothing */
! 24322: break;
! 24323: }
! 24324:
! 24325: } else {
! 24326: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 24327: }
! 24328: if (opline->extended_value) {
! 24329:
! 24330: } else {
! 24331:
! 24332: }
! 24333: ZEND_VM_NEXT_OPCODE();
! 24334: }
! 24335:
! 24336: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24337: {
! 24338: zend_op *opline = EX(opline);
! 24339:
! 24340: array_init(&EX_T(opline->result.u.var).tmp_var);
! 24341: if (IS_CV == IS_UNUSED) {
! 24342: ZEND_VM_NEXT_OPCODE();
! 24343: #if 0 || IS_CV != IS_UNUSED
! 24344: } else {
! 24345: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24346: #endif
! 24347: }
! 24348: }
! 24349:
! 24350: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24351: {
! 24352: zend_op *opline = EX(opline);
! 24353:
! 24354: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 24355: zval *offset;
! 24356:
! 24357: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 24358: SEPARATE_ZVAL_IF_NOT_REF(container);
! 24359: }
! 24360: offset = &opline->op2.u.constant;
! 24361:
! 24362: if (IS_CV != IS_VAR || container) {
! 24363: switch (Z_TYPE_PP(container)) {
! 24364: case IS_ARRAY: {
! 24365: HashTable *ht = Z_ARRVAL_PP(container);
! 24366:
! 24367: switch (Z_TYPE_P(offset)) {
! 24368: case IS_DOUBLE:
! 24369: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 24370: break;
! 24371: case IS_RESOURCE:
! 24372: case IS_BOOL:
! 24373: case IS_LONG:
! 24374: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 24375: break;
! 24376: case IS_STRING:
! 24377: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 24378: Z_ADDREF_P(offset);
! 24379: }
! 24380: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 24381: ht == &EG(symbol_table)) {
! 24382: zend_execute_data *ex;
! 24383: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 24384:
! 24385: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 24386: if (ex->op_array && ex->symbol_table == ht) {
! 24387: int i;
! 24388:
! 24389: for (i = 0; i < ex->op_array->last_var; i++) {
! 24390: if (ex->op_array->vars[i].hash_value == hash_value &&
! 24391: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 24392: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 24393: ex->CVs[i] = NULL;
! 24394: break;
! 24395: }
! 24396: }
! 24397: }
! 24398: }
! 24399: }
! 24400: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
! 24401: zval_ptr_dtor(&offset);
! 24402: }
! 24403: break;
! 24404: case IS_NULL:
! 24405: zend_hash_del(ht, "", sizeof(""));
! 24406: break;
! 24407: default:
! 24408: zend_error(E_WARNING, "Illegal offset type in unset");
! 24409: break;
! 24410: }
! 24411:
! 24412: break;
! 24413: }
! 24414: case IS_OBJECT:
! 24415: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 24416: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 24417: }
! 24418: if (0) {
! 24419: MAKE_REAL_ZVAL_PTR(offset);
! 24420: }
! 24421: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 24422: if (0) {
! 24423: zval_ptr_dtor(&offset);
! 24424: } else {
! 24425:
! 24426: }
! 24427: break;
! 24428: case IS_STRING:
! 24429: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 24430: ZEND_VM_CONTINUE(); /* bailed out before */
! 24431: default:
! 24432:
! 24433: break;
! 24434: }
! 24435: } else {
! 24436:
! 24437: }
! 24438:
! 24439: ZEND_VM_NEXT_OPCODE();
! 24440: }
! 24441:
! 24442: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24443: {
! 24444: zend_op *opline = EX(opline);
! 24445:
! 24446: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 24447: zval *offset = &opline->op2.u.constant;
! 24448:
! 24449: if (IS_CV != IS_VAR || container) {
! 24450: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 24451: SEPARATE_ZVAL_IF_NOT_REF(container);
! 24452: }
! 24453: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 24454: if (0) {
! 24455: MAKE_REAL_ZVAL_PTR(offset);
! 24456: }
! 24457: if (Z_OBJ_HT_P(*container)->unset_property) {
! 24458: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 24459: } else {
! 24460: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 24461: }
! 24462: if (0) {
! 24463: zval_ptr_dtor(&offset);
! 24464: } else {
! 24465:
! 24466: }
! 24467: } else {
! 24468:
! 24469: }
! 24470: } else {
! 24471:
! 24472: }
! 24473:
! 24474: ZEND_VM_NEXT_OPCODE();
! 24475: }
! 24476:
! 24477: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 24478: {
! 24479: zend_op *opline = EX(opline);
! 24480:
! 24481: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 24482: zval **value = NULL;
! 24483: int result = 0;
! 24484:
! 24485: if (IS_CV != IS_VAR || container) {
! 24486:
! 24487: zval *offset = &opline->op2.u.constant;
! 24488:
! 24489: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 24490: HashTable *ht;
! 24491: int isset = 0;
! 24492:
! 24493: ht = Z_ARRVAL_PP(container);
! 24494:
! 24495: switch (Z_TYPE_P(offset)) {
! 24496: case IS_DOUBLE:
! 24497: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 24498: isset = 1;
! 24499: }
! 24500: break;
! 24501: case IS_RESOURCE:
! 24502: case IS_BOOL:
! 24503: case IS_LONG:
! 24504: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 24505: isset = 1;
! 24506: }
! 24507: break;
! 24508: case IS_STRING:
! 24509: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 24510: isset = 1;
! 24511: }
! 24512: break;
! 24513: case IS_NULL:
! 24514: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 24515: isset = 1;
! 24516: }
! 24517: break;
! 24518: default:
! 24519: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 24520:
! 24521: break;
! 24522: }
! 24523:
! 24524: switch (opline->extended_value) {
! 24525: case ZEND_ISSET:
! 24526: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 24527: result = 0;
! 24528: } else {
! 24529: result = isset;
! 24530: }
! 24531: break;
! 24532: case ZEND_ISEMPTY:
! 24533: if (!isset || !i_zend_is_true(*value)) {
! 24534: result = 0;
! 24535: } else {
! 24536: result = 1;
! 24537: }
! 24538: break;
! 24539: }
! 24540:
! 24541: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 24542: if (0) {
! 24543: MAKE_REAL_ZVAL_PTR(offset);
! 24544: }
! 24545: if (prop_dim) {
! 24546: if (Z_OBJ_HT_P(*container)->has_property) {
! 24547: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 24548: } else {
! 24549: zend_error(E_NOTICE, "Trying to check property of non-object");
! 24550: result = 0;
! 24551: }
! 24552: } else {
! 24553: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 24554: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 24555: } else {
! 24556: zend_error(E_NOTICE, "Trying to check element of non-array");
! 24557: result = 0;
! 24558: }
! 24559: }
! 24560: if (0) {
! 24561: zval_ptr_dtor(&offset);
! 24562: } else {
! 24563:
! 24564: }
! 24565: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 24566: zval tmp;
! 24567:
! 24568: if (Z_TYPE_P(offset) != IS_LONG) {
! 24569: tmp = *offset;
! 24570: zval_copy_ctor(&tmp);
! 24571: convert_to_long(&tmp);
! 24572: offset = &tmp;
! 24573: }
! 24574: if (Z_TYPE_P(offset) == IS_LONG) {
! 24575: switch (opline->extended_value) {
! 24576: case ZEND_ISSET:
! 24577: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 24578: result = 1;
! 24579: }
! 24580: break;
! 24581: case ZEND_ISEMPTY:
! 24582: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 24583: result = 1;
! 24584: }
! 24585: break;
! 24586: }
! 24587: }
! 24588:
! 24589: } else {
! 24590:
! 24591: }
! 24592: }
! 24593:
! 24594: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 24595:
! 24596: switch (opline->extended_value) {
! 24597: case ZEND_ISSET:
! 24598: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 24599: break;
! 24600: case ZEND_ISEMPTY:
! 24601: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 24602: break;
! 24603: }
! 24604:
! 24605: ZEND_VM_NEXT_OPCODE();
! 24606: }
! 24607:
! 24608: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24609: {
! 24610: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24611: }
! 24612:
! 24613: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24614: {
! 24615: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24616: }
! 24617:
! 24618: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24619: {
! 24620: zend_op *opline = EX(opline);
! 24621: zend_free_op free_op2;
! 24622:
! 24623: add_function(&EX_T(opline->result.u.var).tmp_var,
! 24624: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24625: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24626:
! 24627: zval_dtor(free_op2.var);
! 24628: ZEND_VM_NEXT_OPCODE();
! 24629: }
! 24630:
! 24631: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24632: {
! 24633: zend_op *opline = EX(opline);
! 24634: zend_free_op free_op2;
! 24635:
! 24636: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 24637: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24638: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24639:
! 24640: zval_dtor(free_op2.var);
! 24641: ZEND_VM_NEXT_OPCODE();
! 24642: }
! 24643:
! 24644: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24645: {
! 24646: zend_op *opline = EX(opline);
! 24647: zend_free_op free_op2;
! 24648:
! 24649: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 24650: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24651: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24652:
! 24653: zval_dtor(free_op2.var);
! 24654: ZEND_VM_NEXT_OPCODE();
! 24655: }
! 24656:
! 24657: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24658: {
! 24659: zend_op *opline = EX(opline);
! 24660: zend_free_op free_op2;
! 24661:
! 24662: div_function(&EX_T(opline->result.u.var).tmp_var,
! 24663: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24664: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24665:
! 24666: zval_dtor(free_op2.var);
! 24667: ZEND_VM_NEXT_OPCODE();
! 24668: }
! 24669:
! 24670: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24671: {
! 24672: zend_op *opline = EX(opline);
! 24673: zend_free_op free_op2;
! 24674:
! 24675: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 24676: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24677: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24678:
! 24679: zval_dtor(free_op2.var);
! 24680: ZEND_VM_NEXT_OPCODE();
! 24681: }
! 24682:
! 24683: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24684: {
! 24685: zend_op *opline = EX(opline);
! 24686: zend_free_op free_op2;
! 24687:
! 24688: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 24689: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24690: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24691:
! 24692: zval_dtor(free_op2.var);
! 24693: ZEND_VM_NEXT_OPCODE();
! 24694: }
! 24695:
! 24696: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24697: {
! 24698: zend_op *opline = EX(opline);
! 24699: zend_free_op free_op2;
! 24700:
! 24701: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 24702: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24703: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24704:
! 24705: zval_dtor(free_op2.var);
! 24706: ZEND_VM_NEXT_OPCODE();
! 24707: }
! 24708:
! 24709: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24710: {
! 24711: zend_op *opline = EX(opline);
! 24712: zend_free_op free_op2;
! 24713:
! 24714: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 24715: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24716: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24717:
! 24718: zval_dtor(free_op2.var);
! 24719: ZEND_VM_NEXT_OPCODE();
! 24720: }
! 24721:
! 24722: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24723: {
! 24724: zend_op *opline = EX(opline);
! 24725: zend_free_op free_op2;
! 24726:
! 24727: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 24728: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24729: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24730:
! 24731: zval_dtor(free_op2.var);
! 24732: ZEND_VM_NEXT_OPCODE();
! 24733: }
! 24734:
! 24735: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24736: {
! 24737: zend_op *opline = EX(opline);
! 24738: zend_free_op free_op2;
! 24739: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 24740:
! 24741: is_identical_function(result,
! 24742: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24743: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24744: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 24745:
! 24746: zval_dtor(free_op2.var);
! 24747: ZEND_VM_NEXT_OPCODE();
! 24748: }
! 24749:
! 24750: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24751: {
! 24752: zend_op *opline = EX(opline);
! 24753: zend_free_op free_op2;
! 24754: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 24755:
! 24756: compare_function(result,
! 24757: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24758: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24759: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 24760:
! 24761: zval_dtor(free_op2.var);
! 24762: ZEND_VM_NEXT_OPCODE();
! 24763: }
! 24764:
! 24765: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24766: {
! 24767: zend_op *opline = EX(opline);
! 24768: zend_free_op free_op2;
! 24769: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 24770:
! 24771: compare_function(result,
! 24772: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24773: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24774: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 24775:
! 24776: zval_dtor(free_op2.var);
! 24777: ZEND_VM_NEXT_OPCODE();
! 24778: }
! 24779:
! 24780: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24781: {
! 24782: zend_op *opline = EX(opline);
! 24783: zend_free_op free_op2;
! 24784: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 24785:
! 24786: compare_function(result,
! 24787: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24788: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24789: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 24790:
! 24791: zval_dtor(free_op2.var);
! 24792: ZEND_VM_NEXT_OPCODE();
! 24793: }
! 24794:
! 24795: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24796: {
! 24797: zend_op *opline = EX(opline);
! 24798: zend_free_op free_op2;
! 24799: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 24800:
! 24801: compare_function(result,
! 24802: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24803: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24804: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 24805:
! 24806: zval_dtor(free_op2.var);
! 24807: ZEND_VM_NEXT_OPCODE();
! 24808: }
! 24809:
! 24810: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24811: {
! 24812: zend_op *opline = EX(opline);
! 24813: zend_free_op free_op2;
! 24814:
! 24815: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 24816: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24817: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24818:
! 24819: zval_dtor(free_op2.var);
! 24820: ZEND_VM_NEXT_OPCODE();
! 24821: }
! 24822:
! 24823: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24824: {
! 24825: zend_op *opline = EX(opline);
! 24826: zend_free_op free_op2;
! 24827:
! 24828: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 24829: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24830: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24831:
! 24832: zval_dtor(free_op2.var);
! 24833: ZEND_VM_NEXT_OPCODE();
! 24834: }
! 24835:
! 24836: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24837: {
! 24838: zend_op *opline = EX(opline);
! 24839: zend_free_op free_op2;
! 24840:
! 24841: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 24842: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24843: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24844:
! 24845: zval_dtor(free_op2.var);
! 24846: ZEND_VM_NEXT_OPCODE();
! 24847: }
! 24848:
! 24849: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 24850: {
! 24851: zend_op *opline = EX(opline);
! 24852: zend_free_op free_op2;
! 24853:
! 24854: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 24855: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 24856: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 24857:
! 24858: zval_dtor(free_op2.var);
! 24859: ZEND_VM_NEXT_OPCODE();
! 24860: }
! 24861:
! 24862: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 24863: {
! 24864: zend_op *opline = EX(opline);
! 24865: zend_op *op_data = opline+1;
! 24866: zend_free_op free_op2, free_op_data1;
! 24867: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 24868: zval *object;
! 24869: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 24870: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 24871: znode *result = &opline->result;
! 24872: int have_get_ptr = 0;
! 24873:
! 24874: if (IS_CV == IS_VAR && !object_ptr) {
! 24875: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 24876: }
! 24877:
! 24878: EX_T(result->u.var).var.ptr_ptr = NULL;
! 24879: make_real_object(object_ptr TSRMLS_CC);
! 24880: object = *object_ptr;
! 24881:
! 24882: if (Z_TYPE_P(object) != IS_OBJECT) {
! 24883: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 24884: zval_dtor(free_op2.var);
! 24885: FREE_OP(free_op_data1);
! 24886:
! 24887: if (!RETURN_VALUE_UNUSED(result)) {
! 24888: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 24889: EX_T(result->u.var).var.ptr_ptr = NULL;
! 24890: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 24891: }
! 24892: } else {
! 24893: /* here we are sure we are dealing with an object */
! 24894: if (1) {
! 24895: MAKE_REAL_ZVAL_PTR(property);
! 24896: }
! 24897:
! 24898: /* here property is a string */
! 24899: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 24900: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 24901: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 24902: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 24903: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 24904:
! 24905: have_get_ptr = 1;
! 24906: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 24907: if (!RETURN_VALUE_UNUSED(result)) {
! 24908: EX_T(result->u.var).var.ptr = *zptr;
! 24909: EX_T(result->u.var).var.ptr_ptr = NULL;
! 24910: PZVAL_LOCK(*zptr);
! 24911: }
! 24912: }
! 24913: }
! 24914:
! 24915: if (!have_get_ptr) {
! 24916: zval *z = NULL;
! 24917:
! 24918: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 24919: if (Z_OBJ_HT_P(object)->read_property) {
! 24920: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 24921: }
! 24922: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 24923: if (Z_OBJ_HT_P(object)->read_dimension) {
! 24924: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 24925: }
! 24926: }
! 24927: if (z) {
! 24928: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 24929: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 24930:
! 24931: if (Z_REFCOUNT_P(z) == 0) {
! 24932: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 24933: zval_dtor(z);
! 24934: FREE_ZVAL(z);
! 24935: }
! 24936: z = value;
! 24937: }
! 24938: Z_ADDREF_P(z);
! 24939: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 24940: binary_op(z, z, value TSRMLS_CC);
! 24941: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 24942: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 24943: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 24944: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 24945: }
! 24946: if (!RETURN_VALUE_UNUSED(result)) {
! 24947: EX_T(result->u.var).var.ptr = z;
! 24948: EX_T(result->u.var).var.ptr_ptr = NULL;
! 24949: PZVAL_LOCK(z);
! 24950: }
! 24951: zval_ptr_dtor(&z);
! 24952: } else {
! 24953: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 24954: if (!RETURN_VALUE_UNUSED(result)) {
! 24955: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 24956: EX_T(result->u.var).var.ptr_ptr = NULL;
! 24957: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 24958: }
! 24959: }
! 24960: }
! 24961:
! 24962: if (1) {
! 24963: zval_ptr_dtor(&property);
! 24964: } else {
! 24965: zval_dtor(free_op2.var);
! 24966: }
! 24967: FREE_OP(free_op_data1);
! 24968: }
! 24969:
! 24970: /* assign_obj has two opcodes! */
! 24971: ZEND_VM_INC_OPCODE();
! 24972: ZEND_VM_NEXT_OPCODE();
! 24973: }
! 24974:
! 24975: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 24976: {
! 24977: zend_op *opline = EX(opline);
! 24978: zend_free_op free_op2, free_op_data2, free_op_data1;
! 24979: zval **var_ptr;
! 24980: zval *value;
! 24981:
! 24982: switch (opline->extended_value) {
! 24983: case ZEND_ASSIGN_OBJ:
! 24984: return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24985: break;
! 24986: case ZEND_ASSIGN_DIM: {
! 24987: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 24988:
! 24989: if (IS_CV == IS_VAR && !container) {
! 24990: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 24991: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 24992: if (IS_CV == IS_VAR && !0) {
! 24993: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 24994: }
! 24995: return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 24996: } else {
! 24997: zend_op *op_data = opline+1;
! 24998: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 24999:
! 25000: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
! 25001: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 25002: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 25003: ZEND_VM_INC_OPCODE();
! 25004: }
! 25005: }
! 25006: break;
! 25007: default:
! 25008: value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25009: var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 25010: /* do nothing */
! 25011: break;
! 25012: }
! 25013:
! 25014: if (!var_ptr) {
! 25015: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 25016: }
! 25017:
! 25018: if (*var_ptr == EG(error_zval_ptr)) {
! 25019: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25020: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 25021: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 25022: }
! 25023: zval_dtor(free_op2.var);
! 25024:
! 25025: ZEND_VM_NEXT_OPCODE();
! 25026: }
! 25027:
! 25028: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 25029:
! 25030: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 25031: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 25032: /* proxy object */
! 25033: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 25034: Z_ADDREF_P(objval);
! 25035: binary_op(objval, objval, value TSRMLS_CC);
! 25036: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 25037: zval_ptr_dtor(&objval);
! 25038: } else {
! 25039: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 25040: }
! 25041:
! 25042: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25043: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 25044: PZVAL_LOCK(*var_ptr);
! 25045: }
! 25046: zval_dtor(free_op2.var);
! 25047:
! 25048: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 25049: FREE_OP(free_op_data1);
! 25050: FREE_OP_VAR_PTR(free_op_data2);
! 25051: }
! 25052:
! 25053: ZEND_VM_NEXT_OPCODE();
! 25054: }
! 25055:
! 25056: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25057: {
! 25058: return zend_binary_assign_op_helper_SPEC_CV_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25059: }
! 25060:
! 25061: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25062: {
! 25063: return zend_binary_assign_op_helper_SPEC_CV_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25064: }
! 25065:
! 25066: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25067: {
! 25068: return zend_binary_assign_op_helper_SPEC_CV_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25069: }
! 25070:
! 25071: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25072: {
! 25073: return zend_binary_assign_op_helper_SPEC_CV_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25074: }
! 25075:
! 25076: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25077: {
! 25078: return zend_binary_assign_op_helper_SPEC_CV_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25079: }
! 25080:
! 25081: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25082: {
! 25083: return zend_binary_assign_op_helper_SPEC_CV_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25084: }
! 25085:
! 25086: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25087: {
! 25088: return zend_binary_assign_op_helper_SPEC_CV_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25089: }
! 25090:
! 25091: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25092: {
! 25093: return zend_binary_assign_op_helper_SPEC_CV_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25094: }
! 25095:
! 25096: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25097: {
! 25098: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25099: }
! 25100:
! 25101: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25102: {
! 25103: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25104: }
! 25105:
! 25106: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25107: {
! 25108: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25109: }
! 25110:
! 25111: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 25112: {
! 25113: zend_op *opline = EX(opline);
! 25114: zend_free_op free_op2;
! 25115: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25116: zval *object;
! 25117: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25118: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 25119: int have_get_ptr = 0;
! 25120:
! 25121: if (IS_CV == IS_VAR && !object_ptr) {
! 25122: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 25123: }
! 25124:
! 25125: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 25126: object = *object_ptr;
! 25127:
! 25128: if (Z_TYPE_P(object) != IS_OBJECT) {
! 25129: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 25130: zval_dtor(free_op2.var);
! 25131: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25132: *retval = EG(uninitialized_zval_ptr);
! 25133: PZVAL_LOCK(*retval);
! 25134: }
! 25135:
! 25136: ZEND_VM_NEXT_OPCODE();
! 25137: }
! 25138:
! 25139: /* here we are sure we are dealing with an object */
! 25140:
! 25141: if (1) {
! 25142: MAKE_REAL_ZVAL_PTR(property);
! 25143: }
! 25144:
! 25145: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 25146: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 25147: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 25148: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 25149:
! 25150: have_get_ptr = 1;
! 25151: incdec_op(*zptr);
! 25152: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25153: *retval = *zptr;
! 25154: PZVAL_LOCK(*retval);
! 25155: }
! 25156: }
! 25157: }
! 25158:
! 25159: if (!have_get_ptr) {
! 25160: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 25161: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 25162:
! 25163: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 25164: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 25165:
! 25166: if (Z_REFCOUNT_P(z) == 0) {
! 25167: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 25168: zval_dtor(z);
! 25169: FREE_ZVAL(z);
! 25170: }
! 25171: z = value;
! 25172: }
! 25173: Z_ADDREF_P(z);
! 25174: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 25175: incdec_op(z);
! 25176: *retval = z;
! 25177: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 25178: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 25179: zval_ptr_dtor(&z);
! 25180: } else {
! 25181: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 25182: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25183: *retval = EG(uninitialized_zval_ptr);
! 25184: PZVAL_LOCK(*retval);
! 25185: }
! 25186: }
! 25187: }
! 25188:
! 25189: if (1) {
! 25190: zval_ptr_dtor(&property);
! 25191: } else {
! 25192: zval_dtor(free_op2.var);
! 25193: }
! 25194:
! 25195: ZEND_VM_NEXT_OPCODE();
! 25196: }
! 25197:
! 25198: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25199: {
! 25200: return zend_pre_incdec_property_helper_SPEC_CV_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25201: }
! 25202:
! 25203: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25204: {
! 25205: return zend_pre_incdec_property_helper_SPEC_CV_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25206: }
! 25207:
! 25208: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 25209: {
! 25210: zend_op *opline = EX(opline);
! 25211: zend_free_op free_op2;
! 25212: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25213: zval *object;
! 25214: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25215: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 25216: int have_get_ptr = 0;
! 25217:
! 25218: if (IS_CV == IS_VAR && !object_ptr) {
! 25219: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 25220: }
! 25221:
! 25222: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 25223: object = *object_ptr;
! 25224:
! 25225: if (Z_TYPE_P(object) != IS_OBJECT) {
! 25226: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 25227: zval_dtor(free_op2.var);
! 25228: *retval = *EG(uninitialized_zval_ptr);
! 25229:
! 25230: ZEND_VM_NEXT_OPCODE();
! 25231: }
! 25232:
! 25233: /* here we are sure we are dealing with an object */
! 25234:
! 25235: if (1) {
! 25236: MAKE_REAL_ZVAL_PTR(property);
! 25237: }
! 25238:
! 25239: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 25240: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 25241: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 25242: have_get_ptr = 1;
! 25243: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 25244:
! 25245: *retval = **zptr;
! 25246: zendi_zval_copy_ctor(*retval);
! 25247:
! 25248: incdec_op(*zptr);
! 25249:
! 25250: }
! 25251: }
! 25252:
! 25253: if (!have_get_ptr) {
! 25254: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 25255: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 25256: zval *z_copy;
! 25257:
! 25258: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 25259: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 25260:
! 25261: if (Z_REFCOUNT_P(z) == 0) {
! 25262: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 25263: zval_dtor(z);
! 25264: FREE_ZVAL(z);
! 25265: }
! 25266: z = value;
! 25267: }
! 25268: *retval = *z;
! 25269: zendi_zval_copy_ctor(*retval);
! 25270: ALLOC_ZVAL(z_copy);
! 25271: *z_copy = *z;
! 25272: zendi_zval_copy_ctor(*z_copy);
! 25273: INIT_PZVAL(z_copy);
! 25274: incdec_op(z_copy);
! 25275: Z_ADDREF_P(z);
! 25276: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 25277: zval_ptr_dtor(&z_copy);
! 25278: zval_ptr_dtor(&z);
! 25279: } else {
! 25280: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 25281: *retval = *EG(uninitialized_zval_ptr);
! 25282: }
! 25283: }
! 25284:
! 25285: if (1) {
! 25286: zval_ptr_dtor(&property);
! 25287: } else {
! 25288: zval_dtor(free_op2.var);
! 25289: }
! 25290:
! 25291: ZEND_VM_NEXT_OPCODE();
! 25292: }
! 25293:
! 25294: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25295: {
! 25296: return zend_post_incdec_property_helper_SPEC_CV_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25297: }
! 25298:
! 25299: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25300: {
! 25301: return zend_post_incdec_property_helper_SPEC_CV_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25302: }
! 25303:
! 25304: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25305: {
! 25306: zend_op *opline = EX(opline);
! 25307: zend_free_op free_op2;
! 25308: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25309: zval **container;
! 25310:
! 25311: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 25312: IS_CV != IS_CV &&
! 25313: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 25314: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 25315: }
! 25316: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25317: if (IS_CV == IS_VAR && !container) {
! 25318: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25319: }
! 25320: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_R TSRMLS_CC);
! 25321: zval_dtor(free_op2.var);
! 25322:
! 25323: ZEND_VM_NEXT_OPCODE();
! 25324: }
! 25325:
! 25326: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25327: {
! 25328: zend_op *opline = EX(opline);
! 25329: zend_free_op free_op1, free_op2;
! 25330: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25331: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25332:
! 25333: if (IS_CV == IS_VAR && !container) {
! 25334: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25335: }
! 25336: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_W TSRMLS_CC);
! 25337: zval_dtor(free_op2.var);
! 25338: if (IS_CV == IS_VAR && 0 &&
! 25339: READY_TO_DESTROY(free_op1.var)) {
! 25340: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25341: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25342: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25343: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25344: }
! 25345: }
! 25346:
! 25347: /* We are going to assign the result by reference */
! 25348: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 25349: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 25350: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 25351: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 25352: }
! 25353:
! 25354: ZEND_VM_NEXT_OPCODE();
! 25355: }
! 25356:
! 25357: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25358: {
! 25359: zend_op *opline = EX(opline);
! 25360: zend_free_op free_op1, free_op2;
! 25361: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25362: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 25363:
! 25364: if (IS_CV == IS_VAR && !container) {
! 25365: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25366: }
! 25367: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
! 25368: zval_dtor(free_op2.var);
! 25369: if (IS_CV == IS_VAR && 0 &&
! 25370: READY_TO_DESTROY(free_op1.var)) {
! 25371: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25372: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25373: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25374: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25375: }
! 25376: }
! 25377:
! 25378: ZEND_VM_NEXT_OPCODE();
! 25379: }
! 25380:
! 25381: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25382: {
! 25383: zend_op *opline = EX(opline);
! 25384: zend_free_op free_op2;
! 25385: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25386: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 25387:
! 25388: if (IS_CV == IS_VAR && !container) {
! 25389: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25390: }
! 25391: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_IS TSRMLS_CC);
! 25392: zval_dtor(free_op2.var);
! 25393:
! 25394: ZEND_VM_NEXT_OPCODE();
! 25395: }
! 25396:
! 25397: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25398: {
! 25399: zend_op *opline = EX(opline);
! 25400: zend_free_op free_op1, free_op2;
! 25401: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25402: zval **container;
! 25403:
! 25404: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 25405: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25406: if (IS_CV == IS_VAR && !container) {
! 25407: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25408: }
! 25409: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_W TSRMLS_CC);
! 25410: if (IS_CV == IS_VAR && 0 &&
! 25411: READY_TO_DESTROY(free_op1.var)) {
! 25412: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25413: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25414: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25415: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25416: }
! 25417: }
! 25418: } else {
! 25419: if (IS_TMP_VAR == IS_UNUSED) {
! 25420: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 25421: }
! 25422: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25423: if (IS_CV == IS_VAR && !container) {
! 25424: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25425: }
! 25426: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_R TSRMLS_CC);
! 25427: }
! 25428: zval_dtor(free_op2.var);
! 25429:
! 25430: ZEND_VM_NEXT_OPCODE();
! 25431: }
! 25432:
! 25433: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25434: {
! 25435: zend_op *opline = EX(opline);
! 25436: zend_free_op free_op1, free_op2;
! 25437: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 25438: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25439:
! 25440: /* Not needed in DIM_UNSET
! 25441: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 25442: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 25443: }
! 25444: */
! 25445: if (IS_CV == IS_CV) {
! 25446: if (container != &EG(uninitialized_zval_ptr)) {
! 25447: SEPARATE_ZVAL_IF_NOT_REF(container);
! 25448: }
! 25449: }
! 25450: if (IS_CV == IS_VAR && !container) {
! 25451: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25452: }
! 25453: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 1, BP_VAR_UNSET TSRMLS_CC);
! 25454: zval_dtor(free_op2.var);
! 25455: if (IS_CV == IS_VAR && 0 &&
! 25456: READY_TO_DESTROY(free_op1.var)) {
! 25457: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25458: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25459: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25460: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25461: }
! 25462: }
! 25463:
! 25464: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 25465: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 25466: } else {
! 25467: zend_free_op free_res;
! 25468:
! 25469: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 25470: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 25471: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 25472: }
! 25473: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 25474: FREE_OP_VAR_PTR(free_res);
! 25475: }
! 25476: ZEND_VM_NEXT_OPCODE();
! 25477: }
! 25478:
! 25479: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_TMP(int type, ZEND_OPCODE_HANDLER_ARGS)
! 25480: {
! 25481: zend_op *opline = EX(opline);
! 25482:
! 25483: zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
! 25484: zend_free_op free_op2;
! 25485: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25486:
! 25487: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 25488: if (type != BP_VAR_IS) {
! 25489: zend_error(E_NOTICE, "Trying to get property of non-object");
! 25490: }
! 25491: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25492: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 25493: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 25494: }
! 25495: zval_dtor(free_op2.var);
! 25496: } else {
! 25497: zval *retval;
! 25498:
! 25499: if (1) {
! 25500: MAKE_REAL_ZVAL_PTR(offset);
! 25501: }
! 25502:
! 25503: /* here we are sure we are dealing with an object */
! 25504: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 25505:
! 25506: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 25507: if (Z_REFCOUNT_P(retval) == 0) {
! 25508: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 25509: zval_dtor(retval);
! 25510: FREE_ZVAL(retval);
! 25511: }
! 25512: } else {
! 25513: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 25514: PZVAL_LOCK(retval);
! 25515: }
! 25516:
! 25517: if (1) {
! 25518: zval_ptr_dtor(&offset);
! 25519: } else {
! 25520: zval_dtor(free_op2.var);
! 25521: }
! 25522: }
! 25523:
! 25524: ZEND_VM_NEXT_OPCODE();
! 25525: }
! 25526:
! 25527: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25528: {
! 25529: return zend_fetch_property_address_read_helper_SPEC_CV_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25530: }
! 25531:
! 25532: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25533: {
! 25534: zend_op *opline = EX(opline);
! 25535: zend_free_op free_op1, free_op2;
! 25536: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25537: zval **container;
! 25538:
! 25539: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 25540: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 25541: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 25542: }
! 25543:
! 25544: if (1) {
! 25545: MAKE_REAL_ZVAL_PTR(property);
! 25546: }
! 25547: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25548: if (IS_CV == IS_VAR && !container) {
! 25549: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 25550: }
! 25551: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 25552: if (1) {
! 25553: zval_ptr_dtor(&property);
! 25554: } else {
! 25555: zval_dtor(free_op2.var);
! 25556: }
! 25557: if (IS_CV == IS_VAR && 0 &&
! 25558: READY_TO_DESTROY(free_op1.var)) {
! 25559: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25560: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25561: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25562: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25563: }
! 25564: }
! 25565:
! 25566: /* We are going to assign the result by reference */
! 25567: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 25568: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 25569: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 25570: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 25571: }
! 25572:
! 25573: ZEND_VM_NEXT_OPCODE();
! 25574: }
! 25575:
! 25576: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25577: {
! 25578: zend_op *opline = EX(opline);
! 25579: zend_free_op free_op1, free_op2;
! 25580: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25581: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 25582:
! 25583: if (1) {
! 25584: MAKE_REAL_ZVAL_PTR(property);
! 25585: }
! 25586: if (IS_CV == IS_VAR && !container) {
! 25587: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 25588: }
! 25589: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 25590: if (1) {
! 25591: zval_ptr_dtor(&property);
! 25592: } else {
! 25593: zval_dtor(free_op2.var);
! 25594: }
! 25595: if (IS_CV == IS_VAR && 0 &&
! 25596: READY_TO_DESTROY(free_op1.var)) {
! 25597: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25598: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25599: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25600: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25601: }
! 25602: }
! 25603:
! 25604: ZEND_VM_NEXT_OPCODE();
! 25605: }
! 25606:
! 25607: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25608: {
! 25609: return zend_fetch_property_address_read_helper_SPEC_CV_TMP(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25610: }
! 25611:
! 25612: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25613: {
! 25614: zend_op *opline = EX(opline);
! 25615:
! 25616: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 25617: /* Behave like FETCH_OBJ_W */
! 25618: zend_free_op free_op1, free_op2;
! 25619: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25620: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25621:
! 25622: if (1) {
! 25623: MAKE_REAL_ZVAL_PTR(property);
! 25624: }
! 25625: if (IS_CV == IS_VAR && !container) {
! 25626: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 25627: }
! 25628: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 25629: if (1) {
! 25630: zval_ptr_dtor(&property);
! 25631: } else {
! 25632: zval_dtor(free_op2.var);
! 25633: }
! 25634: if (IS_CV == IS_VAR && 0 &&
! 25635: READY_TO_DESTROY(free_op1.var)) {
! 25636: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25637: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25638: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25639: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25640: }
! 25641: }
! 25642:
! 25643: ZEND_VM_NEXT_OPCODE();
! 25644: } else {
! 25645: return zend_fetch_property_address_read_helper_SPEC_CV_TMP(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25646: }
! 25647: }
! 25648:
! 25649: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25650: {
! 25651: zend_op *opline = EX(opline);
! 25652: zend_free_op free_op1, free_op2, free_res;
! 25653: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25654: zval *property = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25655:
! 25656: if (IS_CV == IS_CV) {
! 25657: if (container != &EG(uninitialized_zval_ptr)) {
! 25658: SEPARATE_ZVAL_IF_NOT_REF(container);
! 25659: }
! 25660: }
! 25661: if (1) {
! 25662: MAKE_REAL_ZVAL_PTR(property);
! 25663: }
! 25664: if (IS_CV == IS_VAR && !container) {
! 25665: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 25666: }
! 25667: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 25668: if (1) {
! 25669: zval_ptr_dtor(&property);
! 25670: } else {
! 25671: zval_dtor(free_op2.var);
! 25672: }
! 25673: if (IS_CV == IS_VAR && 0 &&
! 25674: READY_TO_DESTROY(free_op1.var)) {
! 25675: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 25676: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 25677: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 25678: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 25679: }
! 25680: }
! 25681:
! 25682: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 25683: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 25684: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 25685: }
! 25686: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 25687: FREE_OP_VAR_PTR(free_res);
! 25688: ZEND_VM_NEXT_OPCODE();
! 25689: }
! 25690:
! 25691: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25692: {
! 25693: zend_op *opline = EX(opline);
! 25694: zend_op *op_data = opline+1;
! 25695: zend_free_op free_op2;
! 25696: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25697: zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25698:
! 25699: if (1) {
! 25700: MAKE_REAL_ZVAL_PTR(property_name);
! 25701: }
! 25702: if (IS_CV == IS_VAR && !object_ptr) {
! 25703: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25704: }
! 25705: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 25706: if (1) {
! 25707: zval_ptr_dtor(&property_name);
! 25708: } else {
! 25709: zval_dtor(free_op2.var);
! 25710: }
! 25711:
! 25712: /* assign_obj has two opcodes! */
! 25713: ZEND_VM_INC_OPCODE();
! 25714: ZEND_VM_NEXT_OPCODE();
! 25715: }
! 25716:
! 25717: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25718: {
! 25719: zend_op *opline = EX(opline);
! 25720: zend_op *op_data = opline+1;
! 25721:
! 25722: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25723:
! 25724: if (IS_CV == IS_VAR && !object_ptr) {
! 25725: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 25726: }
! 25727: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 25728: zend_free_op free_op2;
! 25729: zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25730:
! 25731: if (1) {
! 25732: MAKE_REAL_ZVAL_PTR(property_name);
! 25733: }
! 25734: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 25735: if (1) {
! 25736: zval_ptr_dtor(&property_name);
! 25737: } else {
! 25738: zval_dtor(free_op2.var);
! 25739: }
! 25740: } else {
! 25741: zend_free_op free_op2, free_op_data1, free_op_data2;
! 25742: zval *value;
! 25743: zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25744: zval **variable_ptr_ptr;
! 25745:
! 25746: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
! 25747: zval_dtor(free_op2.var);
! 25748:
! 25749: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 25750: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 25751: if (!variable_ptr_ptr) {
! 25752: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 25753: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25754: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 25755: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 25756: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 25757: 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);
! 25758: }
! 25759: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25760: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 25761: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 25762: }
! 25763: } else {
! 25764: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 25765: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25766: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 25767: PZVAL_LOCK(value);
! 25768: }
! 25769: }
! 25770: FREE_OP_VAR_PTR(free_op_data2);
! 25771: FREE_OP_IF_VAR(free_op_data1);
! 25772: }
! 25773:
! 25774: /* assign_dim has two opcodes! */
! 25775: ZEND_VM_INC_OPCODE();
! 25776: ZEND_VM_NEXT_OPCODE();
! 25777: }
! 25778:
! 25779: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25780: {
! 25781: zend_op *opline = EX(opline);
! 25782: zend_free_op free_op2;
! 25783: zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25784: zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25785:
! 25786: if (IS_CV == IS_VAR && !variable_ptr_ptr) {
! 25787: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
! 25788: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25789: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 25790: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 25791: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 25792: 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);
! 25793: }
! 25794: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25795: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 25796: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 25797: }
! 25798: } else {
! 25799: value = zend_assign_to_variable(variable_ptr_ptr, value, 1 TSRMLS_CC);
! 25800: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 25801: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 25802: PZVAL_LOCK(value);
! 25803: }
! 25804: }
! 25805:
! 25806: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 25807:
! 25808: ZEND_VM_NEXT_OPCODE();
! 25809: }
! 25810:
! 25811: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25812: {
! 25813: zend_op *opline = EX(opline);
! 25814: zval *function_name;
! 25815: char *function_name_strval;
! 25816: int function_name_strlen;
! 25817: zend_free_op free_op2;
! 25818:
! 25819: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 25820:
! 25821: function_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25822:
! 25823: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 25824: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 25825: }
! 25826:
! 25827: function_name_strval = Z_STRVAL_P(function_name);
! 25828: function_name_strlen = Z_STRLEN_P(function_name);
! 25829:
! 25830: EX(object) = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25831:
! 25832: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 25833: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 25834: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 25835: }
! 25836:
! 25837: /* First, locate the function. */
! 25838: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 25839: if (!EX(fbc)) {
! 25840: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 25841: }
! 25842:
! 25843: EX(called_scope) = Z_OBJCE_P(EX(object));
! 25844: } else {
! 25845: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 25846: }
! 25847:
! 25848: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 25849: EX(object) = NULL;
! 25850: } else {
! 25851: if (!PZVAL_IS_REF(EX(object))) {
! 25852: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 25853: } else {
! 25854: zval *this_ptr;
! 25855: ALLOC_ZVAL(this_ptr);
! 25856: INIT_PZVAL_COPY(this_ptr, EX(object));
! 25857: zval_copy_ctor(this_ptr);
! 25858: EX(object) = this_ptr;
! 25859: }
! 25860: }
! 25861:
! 25862: zval_dtor(free_op2.var);
! 25863:
! 25864: ZEND_VM_NEXT_OPCODE();
! 25865: }
! 25866:
! 25867: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25868: {
! 25869: zend_op *opline = EX(opline);
! 25870: int switch_expr_is_overloaded=0;
! 25871: zend_free_op free_op2;
! 25872:
! 25873: if (IS_CV==IS_VAR) {
! 25874: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 25875: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 25876: } else {
! 25877: switch_expr_is_overloaded = 1;
! 25878: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 25879: }
! 25880: }
! 25881: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 25882: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 25883: _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 25884:
! 25885: zval_dtor(free_op2.var);
! 25886: if (switch_expr_is_overloaded) {
! 25887: /* We only free op1 if this is a string offset,
! 25888: * Since if it is a TMP_VAR, it'll be reused by
! 25889: * other CASE opcodes (whereas string offsets
! 25890: * are allocated at each get_zval_ptr())
! 25891: */
! 25892:
! 25893: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 25894: EX_T(opline->op1.u.var).var.ptr = NULL;
! 25895: }
! 25896: ZEND_VM_NEXT_OPCODE();
! 25897: }
! 25898:
! 25899: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25900: {
! 25901: zend_op *opline = EX(opline);
! 25902: zend_free_op free_op2;
! 25903: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 25904: zval *expr_ptr;
! 25905: zval *offset=_get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 25906:
! 25907: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 25908: zval **expr_ptr_ptr = NULL;
! 25909:
! 25910: if (opline->extended_value) {
! 25911: expr_ptr_ptr=_get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 25912: expr_ptr = *expr_ptr_ptr;
! 25913: } else {
! 25914: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25915: }
! 25916: #else
! 25917: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 25918: #endif
! 25919:
! 25920: if (0) { /* temporary variable */
! 25921: zval *new_expr;
! 25922:
! 25923: ALLOC_ZVAL(new_expr);
! 25924: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 25925: expr_ptr = new_expr;
! 25926: } else {
! 25927: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 25928: if (opline->extended_value) {
! 25929: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 25930: expr_ptr = *expr_ptr_ptr;
! 25931: Z_ADDREF_P(expr_ptr);
! 25932: } else
! 25933: #endif
! 25934: if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 25935: zval *new_expr;
! 25936:
! 25937: ALLOC_ZVAL(new_expr);
! 25938: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 25939: expr_ptr = new_expr;
! 25940: zendi_zval_copy_ctor(*expr_ptr);
! 25941: } else {
! 25942: Z_ADDREF_P(expr_ptr);
! 25943: }
! 25944: }
! 25945: if (offset) {
! 25946: switch (Z_TYPE_P(offset)) {
! 25947: case IS_DOUBLE:
! 25948: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 25949: break;
! 25950: case IS_LONG:
! 25951: case IS_BOOL:
! 25952: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 25953: break;
! 25954: case IS_STRING:
! 25955: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 25956: break;
! 25957: case IS_NULL:
! 25958: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 25959: break;
! 25960: default:
! 25961: zend_error(E_WARNING, "Illegal offset type");
! 25962: zval_ptr_dtor(&expr_ptr);
! 25963: /* do nothing */
! 25964: break;
! 25965: }
! 25966: zval_dtor(free_op2.var);
! 25967: } else {
! 25968: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 25969: }
! 25970: if (opline->extended_value) {
! 25971:
! 25972: } else {
! 25973:
! 25974: }
! 25975: ZEND_VM_NEXT_OPCODE();
! 25976: }
! 25977:
! 25978: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25979: {
! 25980: zend_op *opline = EX(opline);
! 25981:
! 25982: array_init(&EX_T(opline->result.u.var).tmp_var);
! 25983: if (IS_CV == IS_UNUSED) {
! 25984: ZEND_VM_NEXT_OPCODE();
! 25985: #if 0 || IS_CV != IS_UNUSED
! 25986: } else {
! 25987: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 25988: #endif
! 25989: }
! 25990: }
! 25991:
! 25992: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 25993: {
! 25994: zend_op *opline = EX(opline);
! 25995: zend_free_op free_op2;
! 25996: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 25997: zval *offset;
! 25998:
! 25999: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 26000: SEPARATE_ZVAL_IF_NOT_REF(container);
! 26001: }
! 26002: offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26003:
! 26004: if (IS_CV != IS_VAR || container) {
! 26005: switch (Z_TYPE_PP(container)) {
! 26006: case IS_ARRAY: {
! 26007: HashTable *ht = Z_ARRVAL_PP(container);
! 26008:
! 26009: switch (Z_TYPE_P(offset)) {
! 26010: case IS_DOUBLE:
! 26011: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 26012: break;
! 26013: case IS_RESOURCE:
! 26014: case IS_BOOL:
! 26015: case IS_LONG:
! 26016: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 26017: break;
! 26018: case IS_STRING:
! 26019: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 26020: Z_ADDREF_P(offset);
! 26021: }
! 26022: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 26023: ht == &EG(symbol_table)) {
! 26024: zend_execute_data *ex;
! 26025: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 26026:
! 26027: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 26028: if (ex->op_array && ex->symbol_table == ht) {
! 26029: int i;
! 26030:
! 26031: for (i = 0; i < ex->op_array->last_var; i++) {
! 26032: if (ex->op_array->vars[i].hash_value == hash_value &&
! 26033: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 26034: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 26035: ex->CVs[i] = NULL;
! 26036: break;
! 26037: }
! 26038: }
! 26039: }
! 26040: }
! 26041: }
! 26042: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
! 26043: zval_ptr_dtor(&offset);
! 26044: }
! 26045: break;
! 26046: case IS_NULL:
! 26047: zend_hash_del(ht, "", sizeof(""));
! 26048: break;
! 26049: default:
! 26050: zend_error(E_WARNING, "Illegal offset type in unset");
! 26051: break;
! 26052: }
! 26053: zval_dtor(free_op2.var);
! 26054: break;
! 26055: }
! 26056: case IS_OBJECT:
! 26057: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 26058: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 26059: }
! 26060: if (1) {
! 26061: MAKE_REAL_ZVAL_PTR(offset);
! 26062: }
! 26063: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 26064: if (1) {
! 26065: zval_ptr_dtor(&offset);
! 26066: } else {
! 26067: zval_dtor(free_op2.var);
! 26068: }
! 26069: break;
! 26070: case IS_STRING:
! 26071: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 26072: ZEND_VM_CONTINUE(); /* bailed out before */
! 26073: default:
! 26074: zval_dtor(free_op2.var);
! 26075: break;
! 26076: }
! 26077: } else {
! 26078: zval_dtor(free_op2.var);
! 26079: }
! 26080:
! 26081: ZEND_VM_NEXT_OPCODE();
! 26082: }
! 26083:
! 26084: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26085: {
! 26086: zend_op *opline = EX(opline);
! 26087: zend_free_op free_op2;
! 26088: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 26089: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26090:
! 26091: if (IS_CV != IS_VAR || container) {
! 26092: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 26093: SEPARATE_ZVAL_IF_NOT_REF(container);
! 26094: }
! 26095: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 26096: if (1) {
! 26097: MAKE_REAL_ZVAL_PTR(offset);
! 26098: }
! 26099: if (Z_OBJ_HT_P(*container)->unset_property) {
! 26100: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 26101: } else {
! 26102: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 26103: }
! 26104: if (1) {
! 26105: zval_ptr_dtor(&offset);
! 26106: } else {
! 26107: zval_dtor(free_op2.var);
! 26108: }
! 26109: } else {
! 26110: zval_dtor(free_op2.var);
! 26111: }
! 26112: } else {
! 26113: zval_dtor(free_op2.var);
! 26114: }
! 26115:
! 26116: ZEND_VM_NEXT_OPCODE();
! 26117: }
! 26118:
! 26119: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 26120: {
! 26121: zend_op *opline = EX(opline);
! 26122:
! 26123: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 26124: zval **value = NULL;
! 26125: int result = 0;
! 26126:
! 26127: if (IS_CV != IS_VAR || container) {
! 26128: zend_free_op free_op2;
! 26129: zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26130:
! 26131: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 26132: HashTable *ht;
! 26133: int isset = 0;
! 26134:
! 26135: ht = Z_ARRVAL_PP(container);
! 26136:
! 26137: switch (Z_TYPE_P(offset)) {
! 26138: case IS_DOUBLE:
! 26139: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 26140: isset = 1;
! 26141: }
! 26142: break;
! 26143: case IS_RESOURCE:
! 26144: case IS_BOOL:
! 26145: case IS_LONG:
! 26146: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 26147: isset = 1;
! 26148: }
! 26149: break;
! 26150: case IS_STRING:
! 26151: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 26152: isset = 1;
! 26153: }
! 26154: break;
! 26155: case IS_NULL:
! 26156: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 26157: isset = 1;
! 26158: }
! 26159: break;
! 26160: default:
! 26161: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 26162:
! 26163: break;
! 26164: }
! 26165:
! 26166: switch (opline->extended_value) {
! 26167: case ZEND_ISSET:
! 26168: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 26169: result = 0;
! 26170: } else {
! 26171: result = isset;
! 26172: }
! 26173: break;
! 26174: case ZEND_ISEMPTY:
! 26175: if (!isset || !i_zend_is_true(*value)) {
! 26176: result = 0;
! 26177: } else {
! 26178: result = 1;
! 26179: }
! 26180: break;
! 26181: }
! 26182: zval_dtor(free_op2.var);
! 26183: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 26184: if (1) {
! 26185: MAKE_REAL_ZVAL_PTR(offset);
! 26186: }
! 26187: if (prop_dim) {
! 26188: if (Z_OBJ_HT_P(*container)->has_property) {
! 26189: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 26190: } else {
! 26191: zend_error(E_NOTICE, "Trying to check property of non-object");
! 26192: result = 0;
! 26193: }
! 26194: } else {
! 26195: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 26196: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 26197: } else {
! 26198: zend_error(E_NOTICE, "Trying to check element of non-array");
! 26199: result = 0;
! 26200: }
! 26201: }
! 26202: if (1) {
! 26203: zval_ptr_dtor(&offset);
! 26204: } else {
! 26205: zval_dtor(free_op2.var);
! 26206: }
! 26207: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 26208: zval tmp;
! 26209:
! 26210: if (Z_TYPE_P(offset) != IS_LONG) {
! 26211: tmp = *offset;
! 26212: zval_copy_ctor(&tmp);
! 26213: convert_to_long(&tmp);
! 26214: offset = &tmp;
! 26215: }
! 26216: if (Z_TYPE_P(offset) == IS_LONG) {
! 26217: switch (opline->extended_value) {
! 26218: case ZEND_ISSET:
! 26219: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 26220: result = 1;
! 26221: }
! 26222: break;
! 26223: case ZEND_ISEMPTY:
! 26224: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 26225: result = 1;
! 26226: }
! 26227: break;
! 26228: }
! 26229: }
! 26230: zval_dtor(free_op2.var);
! 26231: } else {
! 26232: zval_dtor(free_op2.var);
! 26233: }
! 26234: }
! 26235:
! 26236: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 26237:
! 26238: switch (opline->extended_value) {
! 26239: case ZEND_ISSET:
! 26240: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 26241: break;
! 26242: case ZEND_ISEMPTY:
! 26243: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 26244: break;
! 26245: }
! 26246:
! 26247: ZEND_VM_NEXT_OPCODE();
! 26248: }
! 26249:
! 26250: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26251: {
! 26252: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26253: }
! 26254:
! 26255: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26256: {
! 26257: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26258: }
! 26259:
! 26260: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26261: {
! 26262: zend_op *opline = EX(opline);
! 26263: zend_free_op free_op2;
! 26264:
! 26265: add_function(&EX_T(opline->result.u.var).tmp_var,
! 26266: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26267: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26268:
! 26269: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26270: ZEND_VM_NEXT_OPCODE();
! 26271: }
! 26272:
! 26273: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26274: {
! 26275: zend_op *opline = EX(opline);
! 26276: zend_free_op free_op2;
! 26277:
! 26278: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 26279: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26280: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26281:
! 26282: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26283: ZEND_VM_NEXT_OPCODE();
! 26284: }
! 26285:
! 26286: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26287: {
! 26288: zend_op *opline = EX(opline);
! 26289: zend_free_op free_op2;
! 26290:
! 26291: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 26292: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26293: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26294:
! 26295: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26296: ZEND_VM_NEXT_OPCODE();
! 26297: }
! 26298:
! 26299: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26300: {
! 26301: zend_op *opline = EX(opline);
! 26302: zend_free_op free_op2;
! 26303:
! 26304: div_function(&EX_T(opline->result.u.var).tmp_var,
! 26305: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26306: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26307:
! 26308: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26309: ZEND_VM_NEXT_OPCODE();
! 26310: }
! 26311:
! 26312: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26313: {
! 26314: zend_op *opline = EX(opline);
! 26315: zend_free_op free_op2;
! 26316:
! 26317: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 26318: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26319: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26320:
! 26321: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26322: ZEND_VM_NEXT_OPCODE();
! 26323: }
! 26324:
! 26325: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26326: {
! 26327: zend_op *opline = EX(opline);
! 26328: zend_free_op free_op2;
! 26329:
! 26330: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 26331: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26332: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26333:
! 26334: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26335: ZEND_VM_NEXT_OPCODE();
! 26336: }
! 26337:
! 26338: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26339: {
! 26340: zend_op *opline = EX(opline);
! 26341: zend_free_op free_op2;
! 26342:
! 26343: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 26344: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26345: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26346:
! 26347: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26348: ZEND_VM_NEXT_OPCODE();
! 26349: }
! 26350:
! 26351: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26352: {
! 26353: zend_op *opline = EX(opline);
! 26354: zend_free_op free_op2;
! 26355:
! 26356: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 26357: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26358: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26359:
! 26360: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26361: ZEND_VM_NEXT_OPCODE();
! 26362: }
! 26363:
! 26364: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26365: {
! 26366: zend_op *opline = EX(opline);
! 26367: zend_free_op free_op2;
! 26368:
! 26369: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 26370: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26371: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26372:
! 26373: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26374: ZEND_VM_NEXT_OPCODE();
! 26375: }
! 26376:
! 26377: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26378: {
! 26379: zend_op *opline = EX(opline);
! 26380: zend_free_op free_op2;
! 26381: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 26382:
! 26383: is_identical_function(result,
! 26384: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26385: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26386: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 26387:
! 26388: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26389: ZEND_VM_NEXT_OPCODE();
! 26390: }
! 26391:
! 26392: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26393: {
! 26394: zend_op *opline = EX(opline);
! 26395: zend_free_op free_op2;
! 26396: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 26397:
! 26398: compare_function(result,
! 26399: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26400: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26401: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 26402:
! 26403: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26404: ZEND_VM_NEXT_OPCODE();
! 26405: }
! 26406:
! 26407: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26408: {
! 26409: zend_op *opline = EX(opline);
! 26410: zend_free_op free_op2;
! 26411: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 26412:
! 26413: compare_function(result,
! 26414: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26415: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26416: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 26417:
! 26418: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26419: ZEND_VM_NEXT_OPCODE();
! 26420: }
! 26421:
! 26422: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26423: {
! 26424: zend_op *opline = EX(opline);
! 26425: zend_free_op free_op2;
! 26426: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 26427:
! 26428: compare_function(result,
! 26429: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26430: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26431: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 26432:
! 26433: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26434: ZEND_VM_NEXT_OPCODE();
! 26435: }
! 26436:
! 26437: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26438: {
! 26439: zend_op *opline = EX(opline);
! 26440: zend_free_op free_op2;
! 26441: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 26442:
! 26443: compare_function(result,
! 26444: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26445: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26446: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 26447:
! 26448: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26449: ZEND_VM_NEXT_OPCODE();
! 26450: }
! 26451:
! 26452: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26453: {
! 26454: zend_op *opline = EX(opline);
! 26455: zend_free_op free_op2;
! 26456:
! 26457: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 26458: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26459: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26460:
! 26461: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26462: ZEND_VM_NEXT_OPCODE();
! 26463: }
! 26464:
! 26465: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26466: {
! 26467: zend_op *opline = EX(opline);
! 26468: zend_free_op free_op2;
! 26469:
! 26470: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 26471: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26472: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26473:
! 26474: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26475: ZEND_VM_NEXT_OPCODE();
! 26476: }
! 26477:
! 26478: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26479: {
! 26480: zend_op *opline = EX(opline);
! 26481: zend_free_op free_op2;
! 26482:
! 26483: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 26484: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26485: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26486:
! 26487: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26488: ZEND_VM_NEXT_OPCODE();
! 26489: }
! 26490:
! 26491: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26492: {
! 26493: zend_op *opline = EX(opline);
! 26494: zend_free_op free_op2;
! 26495:
! 26496: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 26497: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 26498: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 26499:
! 26500: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26501: ZEND_VM_NEXT_OPCODE();
! 26502: }
! 26503:
! 26504: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 26505: {
! 26506: zend_op *opline = EX(opline);
! 26507: zend_op *op_data = opline+1;
! 26508: zend_free_op free_op2, free_op_data1;
! 26509: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 26510: zval *object;
! 26511: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26512: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 26513: znode *result = &opline->result;
! 26514: int have_get_ptr = 0;
! 26515:
! 26516: if (IS_CV == IS_VAR && !object_ptr) {
! 26517: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 26518: }
! 26519:
! 26520: EX_T(result->u.var).var.ptr_ptr = NULL;
! 26521: make_real_object(object_ptr TSRMLS_CC);
! 26522: object = *object_ptr;
! 26523:
! 26524: if (Z_TYPE_P(object) != IS_OBJECT) {
! 26525: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 26526: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26527: FREE_OP(free_op_data1);
! 26528:
! 26529: if (!RETURN_VALUE_UNUSED(result)) {
! 26530: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 26531: EX_T(result->u.var).var.ptr_ptr = NULL;
! 26532: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 26533: }
! 26534: } else {
! 26535: /* here we are sure we are dealing with an object */
! 26536: if (0) {
! 26537: MAKE_REAL_ZVAL_PTR(property);
! 26538: }
! 26539:
! 26540: /* here property is a string */
! 26541: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 26542: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 26543: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 26544: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 26545: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 26546:
! 26547: have_get_ptr = 1;
! 26548: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 26549: if (!RETURN_VALUE_UNUSED(result)) {
! 26550: EX_T(result->u.var).var.ptr = *zptr;
! 26551: EX_T(result->u.var).var.ptr_ptr = NULL;
! 26552: PZVAL_LOCK(*zptr);
! 26553: }
! 26554: }
! 26555: }
! 26556:
! 26557: if (!have_get_ptr) {
! 26558: zval *z = NULL;
! 26559:
! 26560: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 26561: if (Z_OBJ_HT_P(object)->read_property) {
! 26562: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 26563: }
! 26564: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 26565: if (Z_OBJ_HT_P(object)->read_dimension) {
! 26566: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 26567: }
! 26568: }
! 26569: if (z) {
! 26570: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 26571: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 26572:
! 26573: if (Z_REFCOUNT_P(z) == 0) {
! 26574: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 26575: zval_dtor(z);
! 26576: FREE_ZVAL(z);
! 26577: }
! 26578: z = value;
! 26579: }
! 26580: Z_ADDREF_P(z);
! 26581: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 26582: binary_op(z, z, value TSRMLS_CC);
! 26583: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 26584: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 26585: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 26586: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 26587: }
! 26588: if (!RETURN_VALUE_UNUSED(result)) {
! 26589: EX_T(result->u.var).var.ptr = z;
! 26590: EX_T(result->u.var).var.ptr_ptr = NULL;
! 26591: PZVAL_LOCK(z);
! 26592: }
! 26593: zval_ptr_dtor(&z);
! 26594: } else {
! 26595: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 26596: if (!RETURN_VALUE_UNUSED(result)) {
! 26597: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 26598: EX_T(result->u.var).var.ptr_ptr = NULL;
! 26599: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 26600: }
! 26601: }
! 26602: }
! 26603:
! 26604: if (0) {
! 26605: zval_ptr_dtor(&property);
! 26606: } else {
! 26607: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26608: }
! 26609: FREE_OP(free_op_data1);
! 26610: }
! 26611:
! 26612: /* assign_obj has two opcodes! */
! 26613: ZEND_VM_INC_OPCODE();
! 26614: ZEND_VM_NEXT_OPCODE();
! 26615: }
! 26616:
! 26617: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 26618: {
! 26619: zend_op *opline = EX(opline);
! 26620: zend_free_op free_op2, free_op_data2, free_op_data1;
! 26621: zval **var_ptr;
! 26622: zval *value;
! 26623:
! 26624: switch (opline->extended_value) {
! 26625: case ZEND_ASSIGN_OBJ:
! 26626: return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26627: break;
! 26628: case ZEND_ASSIGN_DIM: {
! 26629: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 26630:
! 26631: if (IS_CV == IS_VAR && !container) {
! 26632: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 26633: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 26634: if (IS_CV == IS_VAR && !0) {
! 26635: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 26636: }
! 26637: return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26638: } else {
! 26639: zend_op *op_data = opline+1;
! 26640: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26641:
! 26642: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 26643: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 26644: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 26645: ZEND_VM_INC_OPCODE();
! 26646: }
! 26647: }
! 26648: break;
! 26649: default:
! 26650: value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26651: var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 26652: /* do nothing */
! 26653: break;
! 26654: }
! 26655:
! 26656: if (!var_ptr) {
! 26657: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 26658: }
! 26659:
! 26660: if (*var_ptr == EG(error_zval_ptr)) {
! 26661: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 26662: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 26663: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 26664: }
! 26665: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26666:
! 26667: ZEND_VM_NEXT_OPCODE();
! 26668: }
! 26669:
! 26670: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 26671:
! 26672: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 26673: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 26674: /* proxy object */
! 26675: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 26676: Z_ADDREF_P(objval);
! 26677: binary_op(objval, objval, value TSRMLS_CC);
! 26678: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 26679: zval_ptr_dtor(&objval);
! 26680: } else {
! 26681: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 26682: }
! 26683:
! 26684: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 26685: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 26686: PZVAL_LOCK(*var_ptr);
! 26687: }
! 26688: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26689:
! 26690: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 26691: FREE_OP(free_op_data1);
! 26692: FREE_OP_VAR_PTR(free_op_data2);
! 26693: }
! 26694:
! 26695: ZEND_VM_NEXT_OPCODE();
! 26696: }
! 26697:
! 26698: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26699: {
! 26700: return zend_binary_assign_op_helper_SPEC_CV_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26701: }
! 26702:
! 26703: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26704: {
! 26705: return zend_binary_assign_op_helper_SPEC_CV_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26706: }
! 26707:
! 26708: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26709: {
! 26710: return zend_binary_assign_op_helper_SPEC_CV_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26711: }
! 26712:
! 26713: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26714: {
! 26715: return zend_binary_assign_op_helper_SPEC_CV_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26716: }
! 26717:
! 26718: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26719: {
! 26720: return zend_binary_assign_op_helper_SPEC_CV_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26721: }
! 26722:
! 26723: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26724: {
! 26725: return zend_binary_assign_op_helper_SPEC_CV_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26726: }
! 26727:
! 26728: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26729: {
! 26730: return zend_binary_assign_op_helper_SPEC_CV_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26731: }
! 26732:
! 26733: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26734: {
! 26735: return zend_binary_assign_op_helper_SPEC_CV_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26736: }
! 26737:
! 26738: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26739: {
! 26740: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26741: }
! 26742:
! 26743: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26744: {
! 26745: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26746: }
! 26747:
! 26748: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26749: {
! 26750: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26751: }
! 26752:
! 26753: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 26754: {
! 26755: zend_op *opline = EX(opline);
! 26756: zend_free_op free_op2;
! 26757: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 26758: zval *object;
! 26759: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26760: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 26761: int have_get_ptr = 0;
! 26762:
! 26763: if (IS_CV == IS_VAR && !object_ptr) {
! 26764: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 26765: }
! 26766:
! 26767: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 26768: object = *object_ptr;
! 26769:
! 26770: if (Z_TYPE_P(object) != IS_OBJECT) {
! 26771: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 26772: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26773: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 26774: *retval = EG(uninitialized_zval_ptr);
! 26775: PZVAL_LOCK(*retval);
! 26776: }
! 26777:
! 26778: ZEND_VM_NEXT_OPCODE();
! 26779: }
! 26780:
! 26781: /* here we are sure we are dealing with an object */
! 26782:
! 26783: if (0) {
! 26784: MAKE_REAL_ZVAL_PTR(property);
! 26785: }
! 26786:
! 26787: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 26788: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 26789: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 26790: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 26791:
! 26792: have_get_ptr = 1;
! 26793: incdec_op(*zptr);
! 26794: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 26795: *retval = *zptr;
! 26796: PZVAL_LOCK(*retval);
! 26797: }
! 26798: }
! 26799: }
! 26800:
! 26801: if (!have_get_ptr) {
! 26802: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 26803: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 26804:
! 26805: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 26806: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 26807:
! 26808: if (Z_REFCOUNT_P(z) == 0) {
! 26809: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 26810: zval_dtor(z);
! 26811: FREE_ZVAL(z);
! 26812: }
! 26813: z = value;
! 26814: }
! 26815: Z_ADDREF_P(z);
! 26816: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 26817: incdec_op(z);
! 26818: *retval = z;
! 26819: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 26820: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 26821: zval_ptr_dtor(&z);
! 26822: } else {
! 26823: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 26824: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 26825: *retval = EG(uninitialized_zval_ptr);
! 26826: PZVAL_LOCK(*retval);
! 26827: }
! 26828: }
! 26829: }
! 26830:
! 26831: if (0) {
! 26832: zval_ptr_dtor(&property);
! 26833: } else {
! 26834: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26835: }
! 26836:
! 26837: ZEND_VM_NEXT_OPCODE();
! 26838: }
! 26839:
! 26840: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26841: {
! 26842: return zend_pre_incdec_property_helper_SPEC_CV_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26843: }
! 26844:
! 26845: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26846: {
! 26847: return zend_pre_incdec_property_helper_SPEC_CV_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26848: }
! 26849:
! 26850: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 26851: {
! 26852: zend_op *opline = EX(opline);
! 26853: zend_free_op free_op2;
! 26854: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 26855: zval *object;
! 26856: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26857: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 26858: int have_get_ptr = 0;
! 26859:
! 26860: if (IS_CV == IS_VAR && !object_ptr) {
! 26861: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 26862: }
! 26863:
! 26864: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 26865: object = *object_ptr;
! 26866:
! 26867: if (Z_TYPE_P(object) != IS_OBJECT) {
! 26868: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 26869: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26870: *retval = *EG(uninitialized_zval_ptr);
! 26871:
! 26872: ZEND_VM_NEXT_OPCODE();
! 26873: }
! 26874:
! 26875: /* here we are sure we are dealing with an object */
! 26876:
! 26877: if (0) {
! 26878: MAKE_REAL_ZVAL_PTR(property);
! 26879: }
! 26880:
! 26881: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 26882: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 26883: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 26884: have_get_ptr = 1;
! 26885: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 26886:
! 26887: *retval = **zptr;
! 26888: zendi_zval_copy_ctor(*retval);
! 26889:
! 26890: incdec_op(*zptr);
! 26891:
! 26892: }
! 26893: }
! 26894:
! 26895: if (!have_get_ptr) {
! 26896: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 26897: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 26898: zval *z_copy;
! 26899:
! 26900: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 26901: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 26902:
! 26903: if (Z_REFCOUNT_P(z) == 0) {
! 26904: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 26905: zval_dtor(z);
! 26906: FREE_ZVAL(z);
! 26907: }
! 26908: z = value;
! 26909: }
! 26910: *retval = *z;
! 26911: zendi_zval_copy_ctor(*retval);
! 26912: ALLOC_ZVAL(z_copy);
! 26913: *z_copy = *z;
! 26914: zendi_zval_copy_ctor(*z_copy);
! 26915: INIT_PZVAL(z_copy);
! 26916: incdec_op(z_copy);
! 26917: Z_ADDREF_P(z);
! 26918: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 26919: zval_ptr_dtor(&z_copy);
! 26920: zval_ptr_dtor(&z);
! 26921: } else {
! 26922: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 26923: *retval = *EG(uninitialized_zval_ptr);
! 26924: }
! 26925: }
! 26926:
! 26927: if (0) {
! 26928: zval_ptr_dtor(&property);
! 26929: } else {
! 26930: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26931: }
! 26932:
! 26933: ZEND_VM_NEXT_OPCODE();
! 26934: }
! 26935:
! 26936: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26937: {
! 26938: return zend_post_incdec_property_helper_SPEC_CV_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26939: }
! 26940:
! 26941: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26942: {
! 26943: return zend_post_incdec_property_helper_SPEC_CV_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 26944: }
! 26945:
! 26946: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26947: {
! 26948: zend_op *opline = EX(opline);
! 26949: zend_free_op free_op2;
! 26950: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26951: zval **container;
! 26952:
! 26953: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 26954: IS_CV != IS_CV &&
! 26955: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 26956: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 26957: }
! 26958: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 26959: if (IS_CV == IS_VAR && !container) {
! 26960: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 26961: }
! 26962: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 26963: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26964:
! 26965: ZEND_VM_NEXT_OPCODE();
! 26966: }
! 26967:
! 26968: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 26969: {
! 26970: zend_op *opline = EX(opline);
! 26971: zend_free_op free_op1, free_op2;
! 26972: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 26973: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 26974:
! 26975: if (IS_CV == IS_VAR && !container) {
! 26976: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 26977: }
! 26978: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 26979: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 26980: if (IS_CV == IS_VAR && 0 &&
! 26981: READY_TO_DESTROY(free_op1.var)) {
! 26982: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 26983: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 26984: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 26985: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 26986: }
! 26987: }
! 26988:
! 26989: /* We are going to assign the result by reference */
! 26990: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 26991: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 26992: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 26993: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 26994: }
! 26995:
! 26996: ZEND_VM_NEXT_OPCODE();
! 26997: }
! 26998:
! 26999: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27000: {
! 27001: zend_op *opline = EX(opline);
! 27002: zend_free_op free_op1, free_op2;
! 27003: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27004: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 27005:
! 27006: if (IS_CV == IS_VAR && !container) {
! 27007: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27008: }
! 27009: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 27010: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27011: if (IS_CV == IS_VAR && 0 &&
! 27012: READY_TO_DESTROY(free_op1.var)) {
! 27013: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27014: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27015: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27016: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27017: }
! 27018: }
! 27019:
! 27020: ZEND_VM_NEXT_OPCODE();
! 27021: }
! 27022:
! 27023: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27024: {
! 27025: zend_op *opline = EX(opline);
! 27026: zend_free_op free_op2;
! 27027: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27028: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 27029:
! 27030: if (IS_CV == IS_VAR && !container) {
! 27031: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27032: }
! 27033: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 27034: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27035:
! 27036: ZEND_VM_NEXT_OPCODE();
! 27037: }
! 27038:
! 27039: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27040: {
! 27041: zend_op *opline = EX(opline);
! 27042: zend_free_op free_op1, free_op2;
! 27043: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27044: zval **container;
! 27045:
! 27046: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 27047: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27048: if (IS_CV == IS_VAR && !container) {
! 27049: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27050: }
! 27051: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 27052: if (IS_CV == IS_VAR && 0 &&
! 27053: READY_TO_DESTROY(free_op1.var)) {
! 27054: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27055: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27056: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27057: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27058: }
! 27059: }
! 27060: } else {
! 27061: if (IS_VAR == IS_UNUSED) {
! 27062: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 27063: }
! 27064: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 27065: if (IS_CV == IS_VAR && !container) {
! 27066: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27067: }
! 27068: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 27069: }
! 27070: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27071:
! 27072: ZEND_VM_NEXT_OPCODE();
! 27073: }
! 27074:
! 27075: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27076: {
! 27077: zend_op *opline = EX(opline);
! 27078: zend_free_op free_op1, free_op2;
! 27079: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 27080: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27081:
! 27082: /* Not needed in DIM_UNSET
! 27083: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 27084: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 27085: }
! 27086: */
! 27087: if (IS_CV == IS_CV) {
! 27088: if (container != &EG(uninitialized_zval_ptr)) {
! 27089: SEPARATE_ZVAL_IF_NOT_REF(container);
! 27090: }
! 27091: }
! 27092: if (IS_CV == IS_VAR && !container) {
! 27093: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27094: }
! 27095: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 27096: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27097: if (IS_CV == IS_VAR && 0 &&
! 27098: READY_TO_DESTROY(free_op1.var)) {
! 27099: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27100: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27101: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27102: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27103: }
! 27104: }
! 27105:
! 27106: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 27107: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 27108: } else {
! 27109: zend_free_op free_res;
! 27110:
! 27111: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 27112: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 27113: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 27114: }
! 27115: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 27116: FREE_OP_VAR_PTR(free_res);
! 27117: }
! 27118: ZEND_VM_NEXT_OPCODE();
! 27119: }
! 27120:
! 27121: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
! 27122: {
! 27123: zend_op *opline = EX(opline);
! 27124:
! 27125: zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
! 27126: zend_free_op free_op2;
! 27127: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27128:
! 27129: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 27130: if (type != BP_VAR_IS) {
! 27131: zend_error(E_NOTICE, "Trying to get property of non-object");
! 27132: }
! 27133: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27134: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 27135: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 27136: }
! 27137: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27138: } else {
! 27139: zval *retval;
! 27140:
! 27141: if (0) {
! 27142: MAKE_REAL_ZVAL_PTR(offset);
! 27143: }
! 27144:
! 27145: /* here we are sure we are dealing with an object */
! 27146: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 27147:
! 27148: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 27149: if (Z_REFCOUNT_P(retval) == 0) {
! 27150: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 27151: zval_dtor(retval);
! 27152: FREE_ZVAL(retval);
! 27153: }
! 27154: } else {
! 27155: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 27156: PZVAL_LOCK(retval);
! 27157: }
! 27158:
! 27159: if (0) {
! 27160: zval_ptr_dtor(&offset);
! 27161: } else {
! 27162: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27163: }
! 27164: }
! 27165:
! 27166: ZEND_VM_NEXT_OPCODE();
! 27167: }
! 27168:
! 27169: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27170: {
! 27171: return zend_fetch_property_address_read_helper_SPEC_CV_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27172: }
! 27173:
! 27174: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27175: {
! 27176: zend_op *opline = EX(opline);
! 27177: zend_free_op free_op1, free_op2;
! 27178: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27179: zval **container;
! 27180:
! 27181: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 27182: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 27183: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 27184: }
! 27185:
! 27186: if (0) {
! 27187: MAKE_REAL_ZVAL_PTR(property);
! 27188: }
! 27189: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27190: if (IS_CV == IS_VAR && !container) {
! 27191: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 27192: }
! 27193: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 27194: if (0) {
! 27195: zval_ptr_dtor(&property);
! 27196: } else {
! 27197: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27198: }
! 27199: if (IS_CV == IS_VAR && 0 &&
! 27200: READY_TO_DESTROY(free_op1.var)) {
! 27201: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27202: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27203: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27204: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27205: }
! 27206: }
! 27207:
! 27208: /* We are going to assign the result by reference */
! 27209: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 27210: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 27211: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 27212: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 27213: }
! 27214:
! 27215: ZEND_VM_NEXT_OPCODE();
! 27216: }
! 27217:
! 27218: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27219: {
! 27220: zend_op *opline = EX(opline);
! 27221: zend_free_op free_op1, free_op2;
! 27222: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27223: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 27224:
! 27225: if (0) {
! 27226: MAKE_REAL_ZVAL_PTR(property);
! 27227: }
! 27228: if (IS_CV == IS_VAR && !container) {
! 27229: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 27230: }
! 27231: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 27232: if (0) {
! 27233: zval_ptr_dtor(&property);
! 27234: } else {
! 27235: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27236: }
! 27237: if (IS_CV == IS_VAR && 0 &&
! 27238: READY_TO_DESTROY(free_op1.var)) {
! 27239: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27240: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27241: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27242: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27243: }
! 27244: }
! 27245:
! 27246: ZEND_VM_NEXT_OPCODE();
! 27247: }
! 27248:
! 27249: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27250: {
! 27251: return zend_fetch_property_address_read_helper_SPEC_CV_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27252: }
! 27253:
! 27254: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27255: {
! 27256: zend_op *opline = EX(opline);
! 27257:
! 27258: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 27259: /* Behave like FETCH_OBJ_W */
! 27260: zend_free_op free_op1, free_op2;
! 27261: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27262: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27263:
! 27264: if (0) {
! 27265: MAKE_REAL_ZVAL_PTR(property);
! 27266: }
! 27267: if (IS_CV == IS_VAR && !container) {
! 27268: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 27269: }
! 27270: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 27271: if (0) {
! 27272: zval_ptr_dtor(&property);
! 27273: } else {
! 27274: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27275: }
! 27276: if (IS_CV == IS_VAR && 0 &&
! 27277: READY_TO_DESTROY(free_op1.var)) {
! 27278: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27279: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27280: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27281: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27282: }
! 27283: }
! 27284:
! 27285: ZEND_VM_NEXT_OPCODE();
! 27286: } else {
! 27287: return zend_fetch_property_address_read_helper_SPEC_CV_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27288: }
! 27289: }
! 27290:
! 27291: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27292: {
! 27293: zend_op *opline = EX(opline);
! 27294: zend_free_op free_op1, free_op2, free_res;
! 27295: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 27296: zval *property = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27297:
! 27298: if (IS_CV == IS_CV) {
! 27299: if (container != &EG(uninitialized_zval_ptr)) {
! 27300: SEPARATE_ZVAL_IF_NOT_REF(container);
! 27301: }
! 27302: }
! 27303: if (0) {
! 27304: MAKE_REAL_ZVAL_PTR(property);
! 27305: }
! 27306: if (IS_CV == IS_VAR && !container) {
! 27307: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 27308: }
! 27309: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 27310: if (0) {
! 27311: zval_ptr_dtor(&property);
! 27312: } else {
! 27313: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27314: }
! 27315: if (IS_CV == IS_VAR && 0 &&
! 27316: READY_TO_DESTROY(free_op1.var)) {
! 27317: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 27318: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 27319: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 27320: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 27321: }
! 27322: }
! 27323:
! 27324: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 27325: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 27326: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 27327: }
! 27328: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 27329: FREE_OP_VAR_PTR(free_res);
! 27330: ZEND_VM_NEXT_OPCODE();
! 27331: }
! 27332:
! 27333: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27334: {
! 27335: zend_op *opline = EX(opline);
! 27336: zend_op *op_data = opline+1;
! 27337: zend_free_op free_op2;
! 27338: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27339: zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27340:
! 27341: if (0) {
! 27342: MAKE_REAL_ZVAL_PTR(property_name);
! 27343: }
! 27344: if (IS_CV == IS_VAR && !object_ptr) {
! 27345: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27346: }
! 27347: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 27348: if (0) {
! 27349: zval_ptr_dtor(&property_name);
! 27350: } else {
! 27351: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27352: }
! 27353:
! 27354: /* assign_obj has two opcodes! */
! 27355: ZEND_VM_INC_OPCODE();
! 27356: ZEND_VM_NEXT_OPCODE();
! 27357: }
! 27358:
! 27359: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27360: {
! 27361: zend_op *opline = EX(opline);
! 27362: zend_op *op_data = opline+1;
! 27363:
! 27364: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27365:
! 27366: if (IS_CV == IS_VAR && !object_ptr) {
! 27367: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 27368: }
! 27369: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 27370: zend_free_op free_op2;
! 27371: zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27372:
! 27373: if (0) {
! 27374: MAKE_REAL_ZVAL_PTR(property_name);
! 27375: }
! 27376: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 27377: if (0) {
! 27378: zval_ptr_dtor(&property_name);
! 27379: } else {
! 27380: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27381: }
! 27382: } else {
! 27383: zend_free_op free_op2, free_op_data1, free_op_data2;
! 27384: zval *value;
! 27385: zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27386: zval **variable_ptr_ptr;
! 27387:
! 27388: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 27389: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27390:
! 27391: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 27392: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 27393: if (!variable_ptr_ptr) {
! 27394: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 27395: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27396: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 27397: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 27398: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 27399: 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);
! 27400: }
! 27401: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27402: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 27403: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 27404: }
! 27405: } else {
! 27406: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 27407: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27408: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 27409: PZVAL_LOCK(value);
! 27410: }
! 27411: }
! 27412: FREE_OP_VAR_PTR(free_op_data2);
! 27413: FREE_OP_IF_VAR(free_op_data1);
! 27414: }
! 27415:
! 27416: /* assign_dim has two opcodes! */
! 27417: ZEND_VM_INC_OPCODE();
! 27418: ZEND_VM_NEXT_OPCODE();
! 27419: }
! 27420:
! 27421: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27422: {
! 27423: zend_op *opline = EX(opline);
! 27424: zend_free_op free_op2;
! 27425: zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27426: zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27427:
! 27428: if (IS_CV == IS_VAR && !variable_ptr_ptr) {
! 27429: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
! 27430: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27431: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 27432: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 27433: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 27434: 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);
! 27435: }
! 27436: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27437: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 27438: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 27439: }
! 27440: } else {
! 27441: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 27442: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27443: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 27444: PZVAL_LOCK(value);
! 27445: }
! 27446: }
! 27447:
! 27448: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 27449: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27450:
! 27451: ZEND_VM_NEXT_OPCODE();
! 27452: }
! 27453:
! 27454: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27455: {
! 27456: zend_op *opline = EX(opline);
! 27457: zend_free_op free_op2;
! 27458: zval **variable_ptr_ptr;
! 27459: zval **value_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27460:
! 27461: if (IS_VAR == IS_VAR &&
! 27462: value_ptr_ptr &&
! 27463: !Z_ISREF_PP(value_ptr_ptr) &&
! 27464: opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 27465: !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
! 27466: if (free_op2.var == NULL) {
! 27467: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 27468: }
! 27469: zend_error(E_STRICT, "Only variables should be assigned by reference");
! 27470: if (UNEXPECTED(EG(exception) != NULL)) {
! 27471: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27472: ZEND_VM_NEXT_OPCODE();
! 27473: }
! 27474: return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27475: } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 27476: PZVAL_LOCK(*value_ptr_ptr);
! 27477: }
! 27478: if (IS_CV == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 27479: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
! 27480: }
! 27481:
! 27482: variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27483: if ((IS_VAR == IS_VAR && !value_ptr_ptr) ||
! 27484: (IS_CV == IS_VAR && !variable_ptr_ptr)) {
! 27485: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
! 27486: }
! 27487: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
! 27488:
! 27489: if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 27490: Z_DELREF_PP(variable_ptr_ptr);
! 27491: }
! 27492:
! 27493: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 27494: AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
! 27495: PZVAL_LOCK(*variable_ptr_ptr);
! 27496: }
! 27497:
! 27498: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27499:
! 27500: ZEND_VM_NEXT_OPCODE();
! 27501: }
! 27502:
! 27503: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27504: {
! 27505: zend_op *opline = EX(opline);
! 27506: zval *function_name;
! 27507: char *function_name_strval;
! 27508: int function_name_strlen;
! 27509: zend_free_op free_op2;
! 27510:
! 27511: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 27512:
! 27513: function_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27514:
! 27515: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 27516: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 27517: }
! 27518:
! 27519: function_name_strval = Z_STRVAL_P(function_name);
! 27520: function_name_strlen = Z_STRLEN_P(function_name);
! 27521:
! 27522: EX(object) = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 27523:
! 27524: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 27525: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 27526: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 27527: }
! 27528:
! 27529: /* First, locate the function. */
! 27530: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 27531: if (!EX(fbc)) {
! 27532: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 27533: }
! 27534:
! 27535: EX(called_scope) = Z_OBJCE_P(EX(object));
! 27536: } else {
! 27537: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 27538: }
! 27539:
! 27540: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 27541: EX(object) = NULL;
! 27542: } else {
! 27543: if (!PZVAL_IS_REF(EX(object))) {
! 27544: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 27545: } else {
! 27546: zval *this_ptr;
! 27547: ALLOC_ZVAL(this_ptr);
! 27548: INIT_PZVAL_COPY(this_ptr, EX(object));
! 27549: zval_copy_ctor(this_ptr);
! 27550: EX(object) = this_ptr;
! 27551: }
! 27552: }
! 27553:
! 27554: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27555:
! 27556: ZEND_VM_NEXT_OPCODE();
! 27557: }
! 27558:
! 27559: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27560: {
! 27561: zend_op *opline = EX(opline);
! 27562: int switch_expr_is_overloaded=0;
! 27563: zend_free_op free_op2;
! 27564:
! 27565: if (IS_CV==IS_VAR) {
! 27566: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 27567: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 27568: } else {
! 27569: switch_expr_is_overloaded = 1;
! 27570: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 27571: }
! 27572: }
! 27573: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 27574: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 27575: _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC) TSRMLS_CC);
! 27576:
! 27577: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27578: if (switch_expr_is_overloaded) {
! 27579: /* We only free op1 if this is a string offset,
! 27580: * Since if it is a TMP_VAR, it'll be reused by
! 27581: * other CASE opcodes (whereas string offsets
! 27582: * are allocated at each get_zval_ptr())
! 27583: */
! 27584:
! 27585: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 27586: EX_T(opline->op1.u.var).var.ptr = NULL;
! 27587: }
! 27588: ZEND_VM_NEXT_OPCODE();
! 27589: }
! 27590:
! 27591: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27592: {
! 27593: zend_op *opline = EX(opline);
! 27594: zend_free_op free_op2;
! 27595: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 27596: zval *expr_ptr;
! 27597: zval *offset=_get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27598:
! 27599: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 27600: zval **expr_ptr_ptr = NULL;
! 27601:
! 27602: if (opline->extended_value) {
! 27603: expr_ptr_ptr=_get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27604: expr_ptr = *expr_ptr_ptr;
! 27605: } else {
! 27606: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 27607: }
! 27608: #else
! 27609: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 27610: #endif
! 27611:
! 27612: if (0) { /* temporary variable */
! 27613: zval *new_expr;
! 27614:
! 27615: ALLOC_ZVAL(new_expr);
! 27616: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 27617: expr_ptr = new_expr;
! 27618: } else {
! 27619: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 27620: if (opline->extended_value) {
! 27621: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 27622: expr_ptr = *expr_ptr_ptr;
! 27623: Z_ADDREF_P(expr_ptr);
! 27624: } else
! 27625: #endif
! 27626: if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 27627: zval *new_expr;
! 27628:
! 27629: ALLOC_ZVAL(new_expr);
! 27630: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 27631: expr_ptr = new_expr;
! 27632: zendi_zval_copy_ctor(*expr_ptr);
! 27633: } else {
! 27634: Z_ADDREF_P(expr_ptr);
! 27635: }
! 27636: }
! 27637: if (offset) {
! 27638: switch (Z_TYPE_P(offset)) {
! 27639: case IS_DOUBLE:
! 27640: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 27641: break;
! 27642: case IS_LONG:
! 27643: case IS_BOOL:
! 27644: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 27645: break;
! 27646: case IS_STRING:
! 27647: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 27648: break;
! 27649: case IS_NULL:
! 27650: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 27651: break;
! 27652: default:
! 27653: zend_error(E_WARNING, "Illegal offset type");
! 27654: zval_ptr_dtor(&expr_ptr);
! 27655: /* do nothing */
! 27656: break;
! 27657: }
! 27658: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27659: } else {
! 27660: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 27661: }
! 27662: if (opline->extended_value) {
! 27663:
! 27664: } else {
! 27665:
! 27666: }
! 27667: ZEND_VM_NEXT_OPCODE();
! 27668: }
! 27669:
! 27670: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27671: {
! 27672: zend_op *opline = EX(opline);
! 27673:
! 27674: array_init(&EX_T(opline->result.u.var).tmp_var);
! 27675: if (IS_CV == IS_UNUSED) {
! 27676: ZEND_VM_NEXT_OPCODE();
! 27677: #if 0 || IS_CV != IS_UNUSED
! 27678: } else {
! 27679: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27680: #endif
! 27681: }
! 27682: }
! 27683:
! 27684: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27685: {
! 27686: zend_op *opline = EX(opline);
! 27687: zend_free_op free_op2;
! 27688: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 27689: zval *offset;
! 27690:
! 27691: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 27692: SEPARATE_ZVAL_IF_NOT_REF(container);
! 27693: }
! 27694: offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27695:
! 27696: if (IS_CV != IS_VAR || container) {
! 27697: switch (Z_TYPE_PP(container)) {
! 27698: case IS_ARRAY: {
! 27699: HashTable *ht = Z_ARRVAL_PP(container);
! 27700:
! 27701: switch (Z_TYPE_P(offset)) {
! 27702: case IS_DOUBLE:
! 27703: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 27704: break;
! 27705: case IS_RESOURCE:
! 27706: case IS_BOOL:
! 27707: case IS_LONG:
! 27708: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 27709: break;
! 27710: case IS_STRING:
! 27711: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 27712: Z_ADDREF_P(offset);
! 27713: }
! 27714: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 27715: ht == &EG(symbol_table)) {
! 27716: zend_execute_data *ex;
! 27717: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 27718:
! 27719: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 27720: if (ex->op_array && ex->symbol_table == ht) {
! 27721: int i;
! 27722:
! 27723: for (i = 0; i < ex->op_array->last_var; i++) {
! 27724: if (ex->op_array->vars[i].hash_value == hash_value &&
! 27725: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 27726: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 27727: ex->CVs[i] = NULL;
! 27728: break;
! 27729: }
! 27730: }
! 27731: }
! 27732: }
! 27733: }
! 27734: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
! 27735: zval_ptr_dtor(&offset);
! 27736: }
! 27737: break;
! 27738: case IS_NULL:
! 27739: zend_hash_del(ht, "", sizeof(""));
! 27740: break;
! 27741: default:
! 27742: zend_error(E_WARNING, "Illegal offset type in unset");
! 27743: break;
! 27744: }
! 27745: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27746: break;
! 27747: }
! 27748: case IS_OBJECT:
! 27749: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 27750: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 27751: }
! 27752: if (0) {
! 27753: MAKE_REAL_ZVAL_PTR(offset);
! 27754: }
! 27755: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 27756: if (0) {
! 27757: zval_ptr_dtor(&offset);
! 27758: } else {
! 27759: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27760: }
! 27761: break;
! 27762: case IS_STRING:
! 27763: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 27764: ZEND_VM_CONTINUE(); /* bailed out before */
! 27765: default:
! 27766: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27767: break;
! 27768: }
! 27769: } else {
! 27770: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27771: }
! 27772:
! 27773: ZEND_VM_NEXT_OPCODE();
! 27774: }
! 27775:
! 27776: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27777: {
! 27778: zend_op *opline = EX(opline);
! 27779: zend_free_op free_op2;
! 27780: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 27781: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27782:
! 27783: if (IS_CV != IS_VAR || container) {
! 27784: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 27785: SEPARATE_ZVAL_IF_NOT_REF(container);
! 27786: }
! 27787: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 27788: if (0) {
! 27789: MAKE_REAL_ZVAL_PTR(offset);
! 27790: }
! 27791: if (Z_OBJ_HT_P(*container)->unset_property) {
! 27792: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 27793: } else {
! 27794: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 27795: }
! 27796: if (0) {
! 27797: zval_ptr_dtor(&offset);
! 27798: } else {
! 27799: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27800: }
! 27801: } else {
! 27802: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27803: }
! 27804: } else {
! 27805: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27806: }
! 27807:
! 27808: ZEND_VM_NEXT_OPCODE();
! 27809: }
! 27810:
! 27811: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 27812: {
! 27813: zend_op *opline = EX(opline);
! 27814:
! 27815: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 27816: zval **value = NULL;
! 27817: int result = 0;
! 27818:
! 27819: if (IS_CV != IS_VAR || container) {
! 27820: zend_free_op free_op2;
! 27821: zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
! 27822:
! 27823: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 27824: HashTable *ht;
! 27825: int isset = 0;
! 27826:
! 27827: ht = Z_ARRVAL_PP(container);
! 27828:
! 27829: switch (Z_TYPE_P(offset)) {
! 27830: case IS_DOUBLE:
! 27831: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 27832: isset = 1;
! 27833: }
! 27834: break;
! 27835: case IS_RESOURCE:
! 27836: case IS_BOOL:
! 27837: case IS_LONG:
! 27838: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 27839: isset = 1;
! 27840: }
! 27841: break;
! 27842: case IS_STRING:
! 27843: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 27844: isset = 1;
! 27845: }
! 27846: break;
! 27847: case IS_NULL:
! 27848: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 27849: isset = 1;
! 27850: }
! 27851: break;
! 27852: default:
! 27853: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 27854:
! 27855: break;
! 27856: }
! 27857:
! 27858: switch (opline->extended_value) {
! 27859: case ZEND_ISSET:
! 27860: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 27861: result = 0;
! 27862: } else {
! 27863: result = isset;
! 27864: }
! 27865: break;
! 27866: case ZEND_ISEMPTY:
! 27867: if (!isset || !i_zend_is_true(*value)) {
! 27868: result = 0;
! 27869: } else {
! 27870: result = 1;
! 27871: }
! 27872: break;
! 27873: }
! 27874: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27875: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 27876: if (0) {
! 27877: MAKE_REAL_ZVAL_PTR(offset);
! 27878: }
! 27879: if (prop_dim) {
! 27880: if (Z_OBJ_HT_P(*container)->has_property) {
! 27881: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 27882: } else {
! 27883: zend_error(E_NOTICE, "Trying to check property of non-object");
! 27884: result = 0;
! 27885: }
! 27886: } else {
! 27887: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 27888: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 27889: } else {
! 27890: zend_error(E_NOTICE, "Trying to check element of non-array");
! 27891: result = 0;
! 27892: }
! 27893: }
! 27894: if (0) {
! 27895: zval_ptr_dtor(&offset);
! 27896: } else {
! 27897: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27898: }
! 27899: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 27900: zval tmp;
! 27901:
! 27902: if (Z_TYPE_P(offset) != IS_LONG) {
! 27903: tmp = *offset;
! 27904: zval_copy_ctor(&tmp);
! 27905: convert_to_long(&tmp);
! 27906: offset = &tmp;
! 27907: }
! 27908: if (Z_TYPE_P(offset) == IS_LONG) {
! 27909: switch (opline->extended_value) {
! 27910: case ZEND_ISSET:
! 27911: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 27912: result = 1;
! 27913: }
! 27914: break;
! 27915: case ZEND_ISEMPTY:
! 27916: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 27917: result = 1;
! 27918: }
! 27919: break;
! 27920: }
! 27921: }
! 27922: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27923: } else {
! 27924: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 27925: }
! 27926: }
! 27927:
! 27928: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 27929:
! 27930: switch (opline->extended_value) {
! 27931: case ZEND_ISSET:
! 27932: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 27933: break;
! 27934: case ZEND_ISEMPTY:
! 27935: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 27936: break;
! 27937: }
! 27938:
! 27939: ZEND_VM_NEXT_OPCODE();
! 27940: }
! 27941:
! 27942: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27943: {
! 27944: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27945: }
! 27946:
! 27947: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 27948: {
! 27949: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 27950: }
! 27951:
! 27952: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 27953: {
! 27954: zend_op *opline = EX(opline);
! 27955: zend_op *op_data = opline+1;
! 27956: zend_free_op free_op_data1;
! 27957: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 27958: zval *object;
! 27959: zval *property = NULL;
! 27960: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 27961: znode *result = &opline->result;
! 27962: int have_get_ptr = 0;
! 27963:
! 27964: if (IS_CV == IS_VAR && !object_ptr) {
! 27965: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 27966: }
! 27967:
! 27968: EX_T(result->u.var).var.ptr_ptr = NULL;
! 27969: make_real_object(object_ptr TSRMLS_CC);
! 27970: object = *object_ptr;
! 27971:
! 27972: if (Z_TYPE_P(object) != IS_OBJECT) {
! 27973: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 27974:
! 27975: FREE_OP(free_op_data1);
! 27976:
! 27977: if (!RETURN_VALUE_UNUSED(result)) {
! 27978: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 27979: EX_T(result->u.var).var.ptr_ptr = NULL;
! 27980: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 27981: }
! 27982: } else {
! 27983: /* here we are sure we are dealing with an object */
! 27984: if (0) {
! 27985: MAKE_REAL_ZVAL_PTR(property);
! 27986: }
! 27987:
! 27988: /* here property is a string */
! 27989: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 27990: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 27991: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 27992: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 27993: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 27994:
! 27995: have_get_ptr = 1;
! 27996: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 27997: if (!RETURN_VALUE_UNUSED(result)) {
! 27998: EX_T(result->u.var).var.ptr = *zptr;
! 27999: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28000: PZVAL_LOCK(*zptr);
! 28001: }
! 28002: }
! 28003: }
! 28004:
! 28005: if (!have_get_ptr) {
! 28006: zval *z = NULL;
! 28007:
! 28008: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 28009: if (Z_OBJ_HT_P(object)->read_property) {
! 28010: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 28011: }
! 28012: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 28013: if (Z_OBJ_HT_P(object)->read_dimension) {
! 28014: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 28015: }
! 28016: }
! 28017: if (z) {
! 28018: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 28019: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 28020:
! 28021: if (Z_REFCOUNT_P(z) == 0) {
! 28022: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 28023: zval_dtor(z);
! 28024: FREE_ZVAL(z);
! 28025: }
! 28026: z = value;
! 28027: }
! 28028: Z_ADDREF_P(z);
! 28029: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 28030: binary_op(z, z, value TSRMLS_CC);
! 28031: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 28032: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 28033: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 28034: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 28035: }
! 28036: if (!RETURN_VALUE_UNUSED(result)) {
! 28037: EX_T(result->u.var).var.ptr = z;
! 28038: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28039: PZVAL_LOCK(z);
! 28040: }
! 28041: zval_ptr_dtor(&z);
! 28042: } else {
! 28043: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 28044: if (!RETURN_VALUE_UNUSED(result)) {
! 28045: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 28046: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28047: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28048: }
! 28049: }
! 28050: }
! 28051:
! 28052: if (0) {
! 28053: zval_ptr_dtor(&property);
! 28054: } else {
! 28055:
! 28056: }
! 28057: FREE_OP(free_op_data1);
! 28058: }
! 28059:
! 28060: /* assign_obj has two opcodes! */
! 28061: ZEND_VM_INC_OPCODE();
! 28062: ZEND_VM_NEXT_OPCODE();
! 28063: }
! 28064:
! 28065: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 28066: {
! 28067: zend_op *opline = EX(opline);
! 28068: zend_free_op free_op_data2, free_op_data1;
! 28069: zval **var_ptr;
! 28070: zval *value;
! 28071:
! 28072: switch (opline->extended_value) {
! 28073: case ZEND_ASSIGN_OBJ:
! 28074: return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28075: break;
! 28076: case ZEND_ASSIGN_DIM: {
! 28077: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 28078:
! 28079: if (IS_CV == IS_VAR && !container) {
! 28080: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28081: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 28082: if (IS_CV == IS_VAR && !0) {
! 28083: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 28084: }
! 28085: return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28086: } else {
! 28087: zend_op *op_data = opline+1;
! 28088: zval *dim = NULL;
! 28089:
! 28090: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 28091: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 28092: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 28093: ZEND_VM_INC_OPCODE();
! 28094: }
! 28095: }
! 28096: break;
! 28097: default:
! 28098: value = NULL;
! 28099: var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 28100: /* do nothing */
! 28101: break;
! 28102: }
! 28103:
! 28104: if (!var_ptr) {
! 28105: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 28106: }
! 28107:
! 28108: if (*var_ptr == EG(error_zval_ptr)) {
! 28109: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28110: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 28111: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28112: }
! 28113:
! 28114:
! 28115: ZEND_VM_NEXT_OPCODE();
! 28116: }
! 28117:
! 28118: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 28119:
! 28120: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 28121: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 28122: /* proxy object */
! 28123: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 28124: Z_ADDREF_P(objval);
! 28125: binary_op(objval, objval, value TSRMLS_CC);
! 28126: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 28127: zval_ptr_dtor(&objval);
! 28128: } else {
! 28129: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 28130: }
! 28131:
! 28132: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28133: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 28134: PZVAL_LOCK(*var_ptr);
! 28135: }
! 28136:
! 28137: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 28138: FREE_OP(free_op_data1);
! 28139: FREE_OP_VAR_PTR(free_op_data2);
! 28140: }
! 28141:
! 28142: ZEND_VM_NEXT_OPCODE();
! 28143: }
! 28144:
! 28145: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28146: {
! 28147: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28148: }
! 28149:
! 28150: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28151: {
! 28152: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28153: }
! 28154:
! 28155: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28156: {
! 28157: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28158: }
! 28159:
! 28160: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28161: {
! 28162: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28163: }
! 28164:
! 28165: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28166: {
! 28167: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28168: }
! 28169:
! 28170: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28171: {
! 28172: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28173: }
! 28174:
! 28175: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28176: {
! 28177: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28178: }
! 28179:
! 28180: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28181: {
! 28182: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28183: }
! 28184:
! 28185: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28186: {
! 28187: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28188: }
! 28189:
! 28190: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28191: {
! 28192: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28193: }
! 28194:
! 28195: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28196: {
! 28197: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28198: }
! 28199:
! 28200: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28201: {
! 28202: zend_op *opline = EX(opline);
! 28203: zend_free_op free_op1;
! 28204: zval *dim = NULL;
! 28205: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28206:
! 28207: if (IS_CV == IS_VAR && !container) {
! 28208: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28209: }
! 28210: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 28211:
! 28212: if (IS_CV == IS_VAR && 0 &&
! 28213: READY_TO_DESTROY(free_op1.var)) {
! 28214: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 28215: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 28216: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 28217: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 28218: }
! 28219: }
! 28220:
! 28221: /* We are going to assign the result by reference */
! 28222: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 28223: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 28224: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 28225: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 28226: }
! 28227:
! 28228: ZEND_VM_NEXT_OPCODE();
! 28229: }
! 28230:
! 28231: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28232: {
! 28233: zend_op *opline = EX(opline);
! 28234: zend_free_op free_op1;
! 28235: zval *dim = NULL;
! 28236: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 28237:
! 28238: if (IS_CV == IS_VAR && !container) {
! 28239: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28240: }
! 28241: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 28242:
! 28243: if (IS_CV == IS_VAR && 0 &&
! 28244: READY_TO_DESTROY(free_op1.var)) {
! 28245: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 28246: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 28247: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 28248: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 28249: }
! 28250: }
! 28251:
! 28252: ZEND_VM_NEXT_OPCODE();
! 28253: }
! 28254:
! 28255: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28256: {
! 28257: zend_op *opline = EX(opline);
! 28258: zend_free_op free_op1;
! 28259: zval *dim = NULL;
! 28260: zval **container;
! 28261:
! 28262: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 28263: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28264: if (IS_CV == IS_VAR && !container) {
! 28265: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28266: }
! 28267: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 28268: if (IS_CV == IS_VAR && 0 &&
! 28269: READY_TO_DESTROY(free_op1.var)) {
! 28270: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 28271: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 28272: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 28273: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 28274: }
! 28275: }
! 28276: } else {
! 28277: if (IS_UNUSED == IS_UNUSED) {
! 28278: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 28279: }
! 28280: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28281: if (IS_CV == IS_VAR && !container) {
! 28282: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28283: }
! 28284: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 28285: }
! 28286:
! 28287:
! 28288: ZEND_VM_NEXT_OPCODE();
! 28289: }
! 28290:
! 28291: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28292: {
! 28293: zend_op *opline = EX(opline);
! 28294: zend_op *op_data = opline+1;
! 28295:
! 28296: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28297:
! 28298: if (IS_CV == IS_VAR && !object_ptr) {
! 28299: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28300: }
! 28301: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 28302:
! 28303: zval *property_name = NULL;
! 28304:
! 28305: if (0) {
! 28306: MAKE_REAL_ZVAL_PTR(property_name);
! 28307: }
! 28308: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 28309: if (0) {
! 28310: zval_ptr_dtor(&property_name);
! 28311: } else {
! 28312:
! 28313: }
! 28314: } else {
! 28315: zend_free_op free_op_data1, free_op_data2;
! 28316: zval *value;
! 28317: zval *dim = NULL;
! 28318: zval **variable_ptr_ptr;
! 28319:
! 28320: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 28321:
! 28322: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 28323: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 28324: if (!variable_ptr_ptr) {
! 28325: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 28326: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28327: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 28328: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 28329: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 28330: 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);
! 28331: }
! 28332: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28333: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 28334: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28335: }
! 28336: } else {
! 28337: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 28338: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28339: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 28340: PZVAL_LOCK(value);
! 28341: }
! 28342: }
! 28343: FREE_OP_VAR_PTR(free_op_data2);
! 28344: FREE_OP_IF_VAR(free_op_data1);
! 28345: }
! 28346:
! 28347: /* assign_dim has two opcodes! */
! 28348: ZEND_VM_INC_OPCODE();
! 28349: ZEND_VM_NEXT_OPCODE();
! 28350: }
! 28351:
! 28352: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28353: {
! 28354: zend_op *opline = EX(opline);
! 28355:
! 28356: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 28357: zval *expr_ptr;
! 28358: zval *offset=NULL;
! 28359:
! 28360: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 28361: zval **expr_ptr_ptr = NULL;
! 28362:
! 28363: if (opline->extended_value) {
! 28364: expr_ptr_ptr=_get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28365: expr_ptr = *expr_ptr_ptr;
! 28366: } else {
! 28367: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28368: }
! 28369: #else
! 28370: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28371: #endif
! 28372:
! 28373: if (0) { /* temporary variable */
! 28374: zval *new_expr;
! 28375:
! 28376: ALLOC_ZVAL(new_expr);
! 28377: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 28378: expr_ptr = new_expr;
! 28379: } else {
! 28380: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 28381: if (opline->extended_value) {
! 28382: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 28383: expr_ptr = *expr_ptr_ptr;
! 28384: Z_ADDREF_P(expr_ptr);
! 28385: } else
! 28386: #endif
! 28387: if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 28388: zval *new_expr;
! 28389:
! 28390: ALLOC_ZVAL(new_expr);
! 28391: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 28392: expr_ptr = new_expr;
! 28393: zendi_zval_copy_ctor(*expr_ptr);
! 28394: } else {
! 28395: Z_ADDREF_P(expr_ptr);
! 28396: }
! 28397: }
! 28398: if (offset) {
! 28399: switch (Z_TYPE_P(offset)) {
! 28400: case IS_DOUBLE:
! 28401: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 28402: break;
! 28403: case IS_LONG:
! 28404: case IS_BOOL:
! 28405: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 28406: break;
! 28407: case IS_STRING:
! 28408: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 28409: break;
! 28410: case IS_NULL:
! 28411: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 28412: break;
! 28413: default:
! 28414: zend_error(E_WARNING, "Illegal offset type");
! 28415: zval_ptr_dtor(&expr_ptr);
! 28416: /* do nothing */
! 28417: break;
! 28418: }
! 28419:
! 28420: } else {
! 28421: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 28422: }
! 28423: if (opline->extended_value) {
! 28424:
! 28425: } else {
! 28426:
! 28427: }
! 28428: ZEND_VM_NEXT_OPCODE();
! 28429: }
! 28430:
! 28431: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28432: {
! 28433: zend_op *opline = EX(opline);
! 28434:
! 28435: array_init(&EX_T(opline->result.u.var).tmp_var);
! 28436: if (IS_CV == IS_UNUSED) {
! 28437: ZEND_VM_NEXT_OPCODE();
! 28438: #if 0 || IS_CV != IS_UNUSED
! 28439: } else {
! 28440: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28441: #endif
! 28442: }
! 28443: }
! 28444:
! 28445: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28446: {
! 28447: zend_op *opline = EX(opline);
! 28448:
! 28449:
! 28450: add_function(&EX_T(opline->result.u.var).tmp_var,
! 28451: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28452: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28453:
! 28454:
! 28455: ZEND_VM_NEXT_OPCODE();
! 28456: }
! 28457:
! 28458: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28459: {
! 28460: zend_op *opline = EX(opline);
! 28461:
! 28462:
! 28463: sub_function(&EX_T(opline->result.u.var).tmp_var,
! 28464: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28465: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28466:
! 28467:
! 28468: ZEND_VM_NEXT_OPCODE();
! 28469: }
! 28470:
! 28471: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28472: {
! 28473: zend_op *opline = EX(opline);
! 28474:
! 28475:
! 28476: mul_function(&EX_T(opline->result.u.var).tmp_var,
! 28477: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28478: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28479:
! 28480:
! 28481: ZEND_VM_NEXT_OPCODE();
! 28482: }
! 28483:
! 28484: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28485: {
! 28486: zend_op *opline = EX(opline);
! 28487:
! 28488:
! 28489: div_function(&EX_T(opline->result.u.var).tmp_var,
! 28490: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28491: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28492:
! 28493:
! 28494: ZEND_VM_NEXT_OPCODE();
! 28495: }
! 28496:
! 28497: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28498: {
! 28499: zend_op *opline = EX(opline);
! 28500:
! 28501:
! 28502: mod_function(&EX_T(opline->result.u.var).tmp_var,
! 28503: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28504: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28505:
! 28506:
! 28507: ZEND_VM_NEXT_OPCODE();
! 28508: }
! 28509:
! 28510: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28511: {
! 28512: zend_op *opline = EX(opline);
! 28513:
! 28514:
! 28515: shift_left_function(&EX_T(opline->result.u.var).tmp_var,
! 28516: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28517: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28518:
! 28519:
! 28520: ZEND_VM_NEXT_OPCODE();
! 28521: }
! 28522:
! 28523: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28524: {
! 28525: zend_op *opline = EX(opline);
! 28526:
! 28527:
! 28528: shift_right_function(&EX_T(opline->result.u.var).tmp_var,
! 28529: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28530: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28531:
! 28532:
! 28533: ZEND_VM_NEXT_OPCODE();
! 28534: }
! 28535:
! 28536: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28537: {
! 28538: zend_op *opline = EX(opline);
! 28539:
! 28540:
! 28541: concat_function(&EX_T(opline->result.u.var).tmp_var,
! 28542: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28543: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28544:
! 28545:
! 28546: ZEND_VM_NEXT_OPCODE();
! 28547: }
! 28548:
! 28549: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28550: {
! 28551: zend_op *opline = EX(opline);
! 28552:
! 28553:
! 28554: is_identical_function(&EX_T(opline->result.u.var).tmp_var,
! 28555: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28556: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28557:
! 28558:
! 28559: ZEND_VM_NEXT_OPCODE();
! 28560: }
! 28561:
! 28562: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28563: {
! 28564: zend_op *opline = EX(opline);
! 28565:
! 28566: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 28567:
! 28568: is_identical_function(result,
! 28569: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28570: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28571: Z_LVAL_P(result) = !Z_LVAL_P(result);
! 28572:
! 28573:
! 28574: ZEND_VM_NEXT_OPCODE();
! 28575: }
! 28576:
! 28577: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28578: {
! 28579: zend_op *opline = EX(opline);
! 28580:
! 28581: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 28582:
! 28583: compare_function(result,
! 28584: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28585: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28586: ZVAL_BOOL(result, (Z_LVAL_P(result) == 0));
! 28587:
! 28588:
! 28589: ZEND_VM_NEXT_OPCODE();
! 28590: }
! 28591:
! 28592: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28593: {
! 28594: zend_op *opline = EX(opline);
! 28595:
! 28596: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 28597:
! 28598: compare_function(result,
! 28599: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28600: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28601: ZVAL_BOOL(result, (Z_LVAL_P(result) != 0));
! 28602:
! 28603:
! 28604: ZEND_VM_NEXT_OPCODE();
! 28605: }
! 28606:
! 28607: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28608: {
! 28609: zend_op *opline = EX(opline);
! 28610:
! 28611: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 28612:
! 28613: compare_function(result,
! 28614: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28615: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28616: ZVAL_BOOL(result, (Z_LVAL_P(result) < 0));
! 28617:
! 28618:
! 28619: ZEND_VM_NEXT_OPCODE();
! 28620: }
! 28621:
! 28622: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28623: {
! 28624: zend_op *opline = EX(opline);
! 28625:
! 28626: zval *result = &EX_T(opline->result.u.var).tmp_var;
! 28627:
! 28628: compare_function(result,
! 28629: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28630: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28631: ZVAL_BOOL(result, (Z_LVAL_P(result) <= 0));
! 28632:
! 28633:
! 28634: ZEND_VM_NEXT_OPCODE();
! 28635: }
! 28636:
! 28637: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28638: {
! 28639: zend_op *opline = EX(opline);
! 28640:
! 28641:
! 28642: bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,
! 28643: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28644: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28645:
! 28646:
! 28647: ZEND_VM_NEXT_OPCODE();
! 28648: }
! 28649:
! 28650: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28651: {
! 28652: zend_op *opline = EX(opline);
! 28653:
! 28654:
! 28655: bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,
! 28656: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28657: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28658:
! 28659:
! 28660: ZEND_VM_NEXT_OPCODE();
! 28661: }
! 28662:
! 28663: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28664: {
! 28665: zend_op *opline = EX(opline);
! 28666:
! 28667:
! 28668: bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 28669: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28670: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28671:
! 28672:
! 28673: ZEND_VM_NEXT_OPCODE();
! 28674: }
! 28675:
! 28676: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28677: {
! 28678: zend_op *opline = EX(opline);
! 28679:
! 28680:
! 28681: boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,
! 28682: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 28683: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 28684:
! 28685:
! 28686: ZEND_VM_NEXT_OPCODE();
! 28687: }
! 28688:
! 28689: static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 28690: {
! 28691: zend_op *opline = EX(opline);
! 28692: zend_op *op_data = opline+1;
! 28693: zend_free_op free_op_data1;
! 28694: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28695: zval *object;
! 28696: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28697: zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 28698: znode *result = &opline->result;
! 28699: int have_get_ptr = 0;
! 28700:
! 28701: if (IS_CV == IS_VAR && !object_ptr) {
! 28702: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 28703: }
! 28704:
! 28705: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28706: make_real_object(object_ptr TSRMLS_CC);
! 28707: object = *object_ptr;
! 28708:
! 28709: if (Z_TYPE_P(object) != IS_OBJECT) {
! 28710: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 28711:
! 28712: FREE_OP(free_op_data1);
! 28713:
! 28714: if (!RETURN_VALUE_UNUSED(result)) {
! 28715: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 28716: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28717: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28718: }
! 28719: } else {
! 28720: /* here we are sure we are dealing with an object */
! 28721: if (0) {
! 28722: MAKE_REAL_ZVAL_PTR(property);
! 28723: }
! 28724:
! 28725: /* here property is a string */
! 28726: if (opline->extended_value == ZEND_ASSIGN_OBJ
! 28727: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 28728: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 28729: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 28730: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 28731:
! 28732: have_get_ptr = 1;
! 28733: binary_op(*zptr, *zptr, value TSRMLS_CC);
! 28734: if (!RETURN_VALUE_UNUSED(result)) {
! 28735: EX_T(result->u.var).var.ptr = *zptr;
! 28736: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28737: PZVAL_LOCK(*zptr);
! 28738: }
! 28739: }
! 28740: }
! 28741:
! 28742: if (!have_get_ptr) {
! 28743: zval *z = NULL;
! 28744:
! 28745: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 28746: if (Z_OBJ_HT_P(object)->read_property) {
! 28747: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 28748: }
! 28749: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 28750: if (Z_OBJ_HT_P(object)->read_dimension) {
! 28751: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
! 28752: }
! 28753: }
! 28754: if (z) {
! 28755: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 28756: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 28757:
! 28758: if (Z_REFCOUNT_P(z) == 0) {
! 28759: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 28760: zval_dtor(z);
! 28761: FREE_ZVAL(z);
! 28762: }
! 28763: z = value;
! 28764: }
! 28765: Z_ADDREF_P(z);
! 28766: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 28767: binary_op(z, z, value TSRMLS_CC);
! 28768: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
! 28769: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 28770: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
! 28771: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
! 28772: }
! 28773: if (!RETURN_VALUE_UNUSED(result)) {
! 28774: EX_T(result->u.var).var.ptr = z;
! 28775: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28776: PZVAL_LOCK(z);
! 28777: }
! 28778: zval_ptr_dtor(&z);
! 28779: } else {
! 28780: zend_error(E_WARNING, "Attempt to assign property of non-object");
! 28781: if (!RETURN_VALUE_UNUSED(result)) {
! 28782: EX_T(result->u.var).var.ptr = EG(uninitialized_zval_ptr);
! 28783: EX_T(result->u.var).var.ptr_ptr = NULL;
! 28784: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28785: }
! 28786: }
! 28787: }
! 28788:
! 28789: if (0) {
! 28790: zval_ptr_dtor(&property);
! 28791: } else {
! 28792:
! 28793: }
! 28794: FREE_OP(free_op_data1);
! 28795: }
! 28796:
! 28797: /* assign_obj has two opcodes! */
! 28798: ZEND_VM_INC_OPCODE();
! 28799: ZEND_VM_NEXT_OPCODE();
! 28800: }
! 28801:
! 28802: static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)
! 28803: {
! 28804: zend_op *opline = EX(opline);
! 28805: zend_free_op free_op_data2, free_op_data1;
! 28806: zval **var_ptr;
! 28807: zval *value;
! 28808:
! 28809: switch (opline->extended_value) {
! 28810: case ZEND_ASSIGN_OBJ:
! 28811: return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28812: break;
! 28813: case ZEND_ASSIGN_DIM: {
! 28814: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 28815:
! 28816: if (IS_CV == IS_VAR && !container) {
! 28817: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 28818: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 28819: if (IS_CV == IS_VAR && !0) {
! 28820: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
! 28821: }
! 28822: return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28823: } else {
! 28824: zend_op *op_data = opline+1;
! 28825: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28826:
! 28827: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 28828: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 28829: var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 28830: ZEND_VM_INC_OPCODE();
! 28831: }
! 28832: }
! 28833: break;
! 28834: default:
! 28835: value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28836: var_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 28837: /* do nothing */
! 28838: break;
! 28839: }
! 28840:
! 28841: if (!var_ptr) {
! 28842: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
! 28843: }
! 28844:
! 28845: if (*var_ptr == EG(error_zval_ptr)) {
! 28846: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28847: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 28848: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 28849: }
! 28850:
! 28851:
! 28852: ZEND_VM_NEXT_OPCODE();
! 28853: }
! 28854:
! 28855: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
! 28856:
! 28857: if(Z_TYPE_PP(var_ptr) == IS_OBJECT && Z_OBJ_HANDLER_PP(var_ptr, get)
! 28858: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
! 28859: /* proxy object */
! 28860: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
! 28861: Z_ADDREF_P(objval);
! 28862: binary_op(objval, objval, value TSRMLS_CC);
! 28863: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
! 28864: zval_ptr_dtor(&objval);
! 28865: } else {
! 28866: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
! 28867: }
! 28868:
! 28869: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28870: AI_SET_PTR(EX_T(opline->result.u.var).var, *var_ptr);
! 28871: PZVAL_LOCK(*var_ptr);
! 28872: }
! 28873:
! 28874: if (opline->extended_value == ZEND_ASSIGN_DIM) {
! 28875: FREE_OP(free_op_data1);
! 28876: FREE_OP_VAR_PTR(free_op_data2);
! 28877: }
! 28878:
! 28879: ZEND_VM_NEXT_OPCODE();
! 28880: }
! 28881:
! 28882: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28883: {
! 28884: return zend_binary_assign_op_helper_SPEC_CV_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28885: }
! 28886:
! 28887: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28888: {
! 28889: return zend_binary_assign_op_helper_SPEC_CV_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28890: }
! 28891:
! 28892: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28893: {
! 28894: return zend_binary_assign_op_helper_SPEC_CV_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28895: }
! 28896:
! 28897: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28898: {
! 28899: return zend_binary_assign_op_helper_SPEC_CV_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28900: }
! 28901:
! 28902: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28903: {
! 28904: return zend_binary_assign_op_helper_SPEC_CV_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28905: }
! 28906:
! 28907: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28908: {
! 28909: return zend_binary_assign_op_helper_SPEC_CV_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28910: }
! 28911:
! 28912: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28913: {
! 28914: return zend_binary_assign_op_helper_SPEC_CV_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28915: }
! 28916:
! 28917: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28918: {
! 28919: return zend_binary_assign_op_helper_SPEC_CV_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28920: }
! 28921:
! 28922: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28923: {
! 28924: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28925: }
! 28926:
! 28927: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28928: {
! 28929: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28930: }
! 28931:
! 28932: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 28933: {
! 28934: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 28935: }
! 28936:
! 28937: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 28938: {
! 28939: zend_op *opline = EX(opline);
! 28940:
! 28941: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 28942: zval *object;
! 28943: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 28944: zval **retval = &EX_T(opline->result.u.var).var.ptr;
! 28945: int have_get_ptr = 0;
! 28946:
! 28947: if (IS_CV == IS_VAR && !object_ptr) {
! 28948: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 28949: }
! 28950:
! 28951: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 28952: object = *object_ptr;
! 28953:
! 28954: if (Z_TYPE_P(object) != IS_OBJECT) {
! 28955: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 28956:
! 28957: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28958: *retval = EG(uninitialized_zval_ptr);
! 28959: PZVAL_LOCK(*retval);
! 28960: }
! 28961:
! 28962: ZEND_VM_NEXT_OPCODE();
! 28963: }
! 28964:
! 28965: /* here we are sure we are dealing with an object */
! 28966:
! 28967: if (0) {
! 28968: MAKE_REAL_ZVAL_PTR(property);
! 28969: }
! 28970:
! 28971: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 28972: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 28973: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 28974: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 28975:
! 28976: have_get_ptr = 1;
! 28977: incdec_op(*zptr);
! 28978: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 28979: *retval = *zptr;
! 28980: PZVAL_LOCK(*retval);
! 28981: }
! 28982: }
! 28983: }
! 28984:
! 28985: if (!have_get_ptr) {
! 28986: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 28987: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 28988:
! 28989: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 28990: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 28991:
! 28992: if (Z_REFCOUNT_P(z) == 0) {
! 28993: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 28994: zval_dtor(z);
! 28995: FREE_ZVAL(z);
! 28996: }
! 28997: z = value;
! 28998: }
! 28999: Z_ADDREF_P(z);
! 29000: SEPARATE_ZVAL_IF_NOT_REF(&z);
! 29001: incdec_op(z);
! 29002: *retval = z;
! 29003: Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
! 29004: SELECTIVE_PZVAL_LOCK(*retval, &opline->result);
! 29005: zval_ptr_dtor(&z);
! 29006: } else {
! 29007: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 29008: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29009: *retval = EG(uninitialized_zval_ptr);
! 29010: PZVAL_LOCK(*retval);
! 29011: }
! 29012: }
! 29013: }
! 29014:
! 29015: if (0) {
! 29016: zval_ptr_dtor(&property);
! 29017: } else {
! 29018:
! 29019: }
! 29020:
! 29021: ZEND_VM_NEXT_OPCODE();
! 29022: }
! 29023:
! 29024: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29025: {
! 29026: return zend_pre_incdec_property_helper_SPEC_CV_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29027: }
! 29028:
! 29029: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29030: {
! 29031: return zend_pre_incdec_property_helper_SPEC_CV_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29032: }
! 29033:
! 29034: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
! 29035: {
! 29036: zend_op *opline = EX(opline);
! 29037:
! 29038: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29039: zval *object;
! 29040: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29041: zval *retval = &EX_T(opline->result.u.var).tmp_var;
! 29042: int have_get_ptr = 0;
! 29043:
! 29044: if (IS_CV == IS_VAR && !object_ptr) {
! 29045: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
! 29046: }
! 29047:
! 29048: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
! 29049: object = *object_ptr;
! 29050:
! 29051: if (Z_TYPE_P(object) != IS_OBJECT) {
! 29052: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 29053:
! 29054: *retval = *EG(uninitialized_zval_ptr);
! 29055:
! 29056: ZEND_VM_NEXT_OPCODE();
! 29057: }
! 29058:
! 29059: /* here we are sure we are dealing with an object */
! 29060:
! 29061: if (0) {
! 29062: MAKE_REAL_ZVAL_PTR(property);
! 29063: }
! 29064:
! 29065: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
! 29066: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);
! 29067: if (zptr != NULL) { /* NULL means no success in getting PTR */
! 29068: have_get_ptr = 1;
! 29069: SEPARATE_ZVAL_IF_NOT_REF(zptr);
! 29070:
! 29071: *retval = **zptr;
! 29072: zendi_zval_copy_ctor(*retval);
! 29073:
! 29074: incdec_op(*zptr);
! 29075:
! 29076: }
! 29077: }
! 29078:
! 29079: if (!have_get_ptr) {
! 29080: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
! 29081: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
! 29082: zval *z_copy;
! 29083:
! 29084: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
! 29085: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
! 29086:
! 29087: if (Z_REFCOUNT_P(z) == 0) {
! 29088: GC_REMOVE_ZVAL_FROM_BUFFER(z);
! 29089: zval_dtor(z);
! 29090: FREE_ZVAL(z);
! 29091: }
! 29092: z = value;
! 29093: }
! 29094: *retval = *z;
! 29095: zendi_zval_copy_ctor(*retval);
! 29096: ALLOC_ZVAL(z_copy);
! 29097: *z_copy = *z;
! 29098: zendi_zval_copy_ctor(*z_copy);
! 29099: INIT_PZVAL(z_copy);
! 29100: incdec_op(z_copy);
! 29101: Z_ADDREF_P(z);
! 29102: Z_OBJ_HT_P(object)->write_property(object, property, z_copy TSRMLS_CC);
! 29103: zval_ptr_dtor(&z_copy);
! 29104: zval_ptr_dtor(&z);
! 29105: } else {
! 29106: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
! 29107: *retval = *EG(uninitialized_zval_ptr);
! 29108: }
! 29109: }
! 29110:
! 29111: if (0) {
! 29112: zval_ptr_dtor(&property);
! 29113: } else {
! 29114:
! 29115: }
! 29116:
! 29117: ZEND_VM_NEXT_OPCODE();
! 29118: }
! 29119:
! 29120: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29121: {
! 29122: return zend_post_incdec_property_helper_SPEC_CV_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29123: }
! 29124:
! 29125: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29126: {
! 29127: return zend_post_incdec_property_helper_SPEC_CV_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29128: }
! 29129:
! 29130: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29131: {
! 29132: zend_op *opline = EX(opline);
! 29133:
! 29134: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29135: zval **container;
! 29136:
! 29137: if (opline->extended_value == ZEND_FETCH_ADD_LOCK &&
! 29138: IS_CV != IS_CV &&
! 29139: EX_T(opline->op1.u.var).var.ptr_ptr) {
! 29140: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 29141: }
! 29142: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29143: if (IS_CV == IS_VAR && !container) {
! 29144: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29145: }
! 29146: zend_fetch_dimension_address_read(RETURN_VALUE_UNUSED(&opline->result)?NULL:&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 29147:
! 29148:
! 29149: ZEND_VM_NEXT_OPCODE();
! 29150: }
! 29151:
! 29152: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29153: {
! 29154: zend_op *opline = EX(opline);
! 29155: zend_free_op free_op1;
! 29156: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29157: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29158:
! 29159: if (IS_CV == IS_VAR && !container) {
! 29160: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29161: }
! 29162: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 29163:
! 29164: if (IS_CV == IS_VAR && 0 &&
! 29165: READY_TO_DESTROY(free_op1.var)) {
! 29166: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29167: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29168: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29169: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29170: }
! 29171: }
! 29172:
! 29173: /* We are going to assign the result by reference */
! 29174: if (opline->extended_value && EX_T(opline->result.u.var).var.ptr_ptr) {
! 29175: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 29176: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 29177: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 29178: }
! 29179:
! 29180: ZEND_VM_NEXT_OPCODE();
! 29181: }
! 29182:
! 29183: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29184: {
! 29185: zend_op *opline = EX(opline);
! 29186: zend_free_op free_op1;
! 29187: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29188: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 29189:
! 29190: if (IS_CV == IS_VAR && !container) {
! 29191: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29192: }
! 29193: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
! 29194:
! 29195: if (IS_CV == IS_VAR && 0 &&
! 29196: READY_TO_DESTROY(free_op1.var)) {
! 29197: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29198: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29199: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29200: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29201: }
! 29202: }
! 29203:
! 29204: ZEND_VM_NEXT_OPCODE();
! 29205: }
! 29206:
! 29207: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29208: {
! 29209: zend_op *opline = EX(opline);
! 29210:
! 29211: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29212: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 29213:
! 29214: if (IS_CV == IS_VAR && !container) {
! 29215: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29216: }
! 29217: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_IS TSRMLS_CC);
! 29218:
! 29219:
! 29220: ZEND_VM_NEXT_OPCODE();
! 29221: }
! 29222:
! 29223: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29224: {
! 29225: zend_op *opline = EX(opline);
! 29226: zend_free_op free_op1;
! 29227: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29228: zval **container;
! 29229:
! 29230: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 29231: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29232: if (IS_CV == IS_VAR && !container) {
! 29233: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29234: }
! 29235: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_W TSRMLS_CC);
! 29236: if (IS_CV == IS_VAR && 0 &&
! 29237: READY_TO_DESTROY(free_op1.var)) {
! 29238: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29239: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29240: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29241: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29242: }
! 29243: }
! 29244: } else {
! 29245: if (IS_CV == IS_UNUSED) {
! 29246: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
! 29247: }
! 29248: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29249: if (IS_CV == IS_VAR && !container) {
! 29250: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29251: }
! 29252: zend_fetch_dimension_address_read(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_R TSRMLS_CC);
! 29253: }
! 29254:
! 29255:
! 29256: ZEND_VM_NEXT_OPCODE();
! 29257: }
! 29258:
! 29259: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29260: {
! 29261: zend_op *opline = EX(opline);
! 29262: zend_free_op free_op1;
! 29263: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 29264: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29265:
! 29266: /* Not needed in DIM_UNSET
! 29267: if (opline->extended_value == ZEND_FETCH_ADD_LOCK) {
! 29268: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 29269: }
! 29270: */
! 29271: if (IS_CV == IS_CV) {
! 29272: if (container != &EG(uninitialized_zval_ptr)) {
! 29273: SEPARATE_ZVAL_IF_NOT_REF(container);
! 29274: }
! 29275: }
! 29276: if (IS_CV == IS_VAR && !container) {
! 29277: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29278: }
! 29279: zend_fetch_dimension_address(&EX_T(opline->result.u.var), container, dim, 0, BP_VAR_UNSET TSRMLS_CC);
! 29280:
! 29281: if (IS_CV == IS_VAR && 0 &&
! 29282: READY_TO_DESTROY(free_op1.var)) {
! 29283: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29284: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29285: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29286: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29287: }
! 29288: }
! 29289:
! 29290: if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {
! 29291: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 29292: } else {
! 29293: zend_free_op free_res;
! 29294:
! 29295: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 29296: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 29297: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 29298: }
! 29299: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 29300: FREE_OP_VAR_PTR(free_res);
! 29301: }
! 29302: ZEND_VM_NEXT_OPCODE();
! 29303: }
! 29304:
! 29305: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CV(int type, ZEND_OPCODE_HANDLER_ARGS)
! 29306: {
! 29307: zend_op *opline = EX(opline);
! 29308:
! 29309: zval *container = _get_zval_ptr_cv(&opline->op1, EX(Ts), type TSRMLS_CC);
! 29310:
! 29311: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29312:
! 29313: if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
! 29314: if (type != BP_VAR_IS) {
! 29315: zend_error(E_NOTICE, "Trying to get property of non-object");
! 29316: }
! 29317: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29318: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 29319: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 29320: }
! 29321:
! 29322: } else {
! 29323: zval *retval;
! 29324:
! 29325: if (0) {
! 29326: MAKE_REAL_ZVAL_PTR(offset);
! 29327: }
! 29328:
! 29329: /* here we are sure we are dealing with an object */
! 29330: retval = Z_OBJ_HT_P(container)->read_property(container, offset, type TSRMLS_CC);
! 29331:
! 29332: if (RETURN_VALUE_UNUSED(&opline->result)) {
! 29333: if (Z_REFCOUNT_P(retval) == 0) {
! 29334: GC_REMOVE_ZVAL_FROM_BUFFER(retval);
! 29335: zval_dtor(retval);
! 29336: FREE_ZVAL(retval);
! 29337: }
! 29338: } else {
! 29339: AI_SET_PTR(EX_T(opline->result.u.var).var, retval);
! 29340: PZVAL_LOCK(retval);
! 29341: }
! 29342:
! 29343: if (0) {
! 29344: zval_ptr_dtor(&offset);
! 29345: } else {
! 29346:
! 29347: }
! 29348: }
! 29349:
! 29350: ZEND_VM_NEXT_OPCODE();
! 29351: }
! 29352:
! 29353: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29354: {
! 29355: return zend_fetch_property_address_read_helper_SPEC_CV_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29356: }
! 29357:
! 29358: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29359: {
! 29360: zend_op *opline = EX(opline);
! 29361: zend_free_op free_op1;
! 29362: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29363: zval **container;
! 29364:
! 29365: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 29366: PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);
! 29367: EX_T(opline->op1.u.var).var.ptr = *EX_T(opline->op1.u.var).var.ptr_ptr;
! 29368: }
! 29369:
! 29370: if (0) {
! 29371: MAKE_REAL_ZVAL_PTR(property);
! 29372: }
! 29373: container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29374: if (IS_CV == IS_VAR && !container) {
! 29375: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 29376: }
! 29377: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 29378: if (0) {
! 29379: zval_ptr_dtor(&property);
! 29380: } else {
! 29381:
! 29382: }
! 29383: if (IS_CV == IS_VAR && 0 &&
! 29384: READY_TO_DESTROY(free_op1.var)) {
! 29385: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29386: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29387: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29388: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29389: }
! 29390: }
! 29391:
! 29392: /* We are going to assign the result by reference */
! 29393: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
! 29394: Z_DELREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 29395: SEPARATE_ZVAL_TO_MAKE_IS_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 29396: Z_ADDREF_PP(EX_T(opline->result.u.var).var.ptr_ptr);
! 29397: }
! 29398:
! 29399: ZEND_VM_NEXT_OPCODE();
! 29400: }
! 29401:
! 29402: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29403: {
! 29404: zend_op *opline = EX(opline);
! 29405: zend_free_op free_op1;
! 29406: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29407: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
! 29408:
! 29409: if (0) {
! 29410: MAKE_REAL_ZVAL_PTR(property);
! 29411: }
! 29412: if (IS_CV == IS_VAR && !container) {
! 29413: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 29414: }
! 29415: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_RW TSRMLS_CC);
! 29416: if (0) {
! 29417: zval_ptr_dtor(&property);
! 29418: } else {
! 29419:
! 29420: }
! 29421: if (IS_CV == IS_VAR && 0 &&
! 29422: READY_TO_DESTROY(free_op1.var)) {
! 29423: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29424: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29425: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29426: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29427: }
! 29428: }
! 29429:
! 29430: ZEND_VM_NEXT_OPCODE();
! 29431: }
! 29432:
! 29433: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29434: {
! 29435: return zend_fetch_property_address_read_helper_SPEC_CV_CV(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29436: }
! 29437:
! 29438: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29439: {
! 29440: zend_op *opline = EX(opline);
! 29441:
! 29442: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {
! 29443: /* Behave like FETCH_OBJ_W */
! 29444: zend_free_op free_op1;
! 29445: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29446: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29447:
! 29448: if (0) {
! 29449: MAKE_REAL_ZVAL_PTR(property);
! 29450: }
! 29451: if (IS_CV == IS_VAR && !container) {
! 29452: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 29453: }
! 29454: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_W TSRMLS_CC);
! 29455: if (0) {
! 29456: zval_ptr_dtor(&property);
! 29457: } else {
! 29458:
! 29459: }
! 29460: if (IS_CV == IS_VAR && 0 &&
! 29461: READY_TO_DESTROY(free_op1.var)) {
! 29462: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29463: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29464: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29465: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29466: }
! 29467: }
! 29468:
! 29469: ZEND_VM_NEXT_OPCODE();
! 29470: } else {
! 29471: return zend_fetch_property_address_read_helper_SPEC_CV_CV(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29472: }
! 29473: }
! 29474:
! 29475: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29476: {
! 29477: zend_op *opline = EX(opline);
! 29478: zend_free_op free_op1, free_res;
! 29479: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29480: zval *property = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29481:
! 29482: if (IS_CV == IS_CV) {
! 29483: if (container != &EG(uninitialized_zval_ptr)) {
! 29484: SEPARATE_ZVAL_IF_NOT_REF(container);
! 29485: }
! 29486: }
! 29487: if (0) {
! 29488: MAKE_REAL_ZVAL_PTR(property);
! 29489: }
! 29490: if (IS_CV == IS_VAR && !container) {
! 29491: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
! 29492: }
! 29493: zend_fetch_property_address(&EX_T(opline->result.u.var), container, property, BP_VAR_UNSET TSRMLS_CC);
! 29494: if (0) {
! 29495: zval_ptr_dtor(&property);
! 29496: } else {
! 29497:
! 29498: }
! 29499: if (IS_CV == IS_VAR && 0 &&
! 29500: READY_TO_DESTROY(free_op1.var)) {
! 29501: AI_USE_PTR(EX_T(opline->result.u.var).var);
! 29502: if (!PZVAL_IS_REF(*EX_T(opline->result.u.var).var.ptr_ptr) &&
! 29503: Z_REFCOUNT_PP(EX_T(opline->result.u.var).var.ptr_ptr) > 2) {
! 29504: SEPARATE_ZVAL(EX_T(opline->result.u.var).var.ptr_ptr);
! 29505: }
! 29506: }
! 29507:
! 29508: PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &free_res);
! 29509: if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
! 29510: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);
! 29511: }
! 29512: PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);
! 29513: FREE_OP_VAR_PTR(free_res);
! 29514: ZEND_VM_NEXT_OPCODE();
! 29515: }
! 29516:
! 29517: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29518: {
! 29519: zend_op *opline = EX(opline);
! 29520: zend_op *op_data = opline+1;
! 29521:
! 29522: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29523: zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29524:
! 29525: if (0) {
! 29526: MAKE_REAL_ZVAL_PTR(property_name);
! 29527: }
! 29528: if (IS_CV == IS_VAR && !object_ptr) {
! 29529: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29530: }
! 29531: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);
! 29532: if (0) {
! 29533: zval_ptr_dtor(&property_name);
! 29534: } else {
! 29535:
! 29536: }
! 29537:
! 29538: /* assign_obj has two opcodes! */
! 29539: ZEND_VM_INC_OPCODE();
! 29540: ZEND_VM_NEXT_OPCODE();
! 29541: }
! 29542:
! 29543: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29544: {
! 29545: zend_op *opline = EX(opline);
! 29546: zend_op *op_data = opline+1;
! 29547:
! 29548: zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29549:
! 29550: if (IS_CV == IS_VAR && !object_ptr) {
! 29551: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
! 29552: }
! 29553: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
! 29554:
! 29555: zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29556:
! 29557: if (0) {
! 29558: MAKE_REAL_ZVAL_PTR(property_name);
! 29559: }
! 29560: zend_assign_to_object(&opline->result, object_ptr, property_name, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
! 29561: if (0) {
! 29562: zval_ptr_dtor(&property_name);
! 29563: } else {
! 29564:
! 29565: }
! 29566: } else {
! 29567: zend_free_op free_op_data1, free_op_data2;
! 29568: zval *value;
! 29569: zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29570: zval **variable_ptr_ptr;
! 29571:
! 29572: zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
! 29573:
! 29574: value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
! 29575: variable_ptr_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
! 29576: if (!variable_ptr_ptr) {
! 29577: if (zend_assign_to_string_offset(&EX_T(op_data->op2.u.var), value, op_data->op1.op_type TSRMLS_CC)) {
! 29578: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29579: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 29580: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 29581: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 29582: 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);
! 29583: }
! 29584: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29585: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 29586: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 29587: }
! 29588: } else {
! 29589: value = zend_assign_to_variable(variable_ptr_ptr, value, IS_TMP_FREE(free_op_data1) TSRMLS_CC);
! 29590: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29591: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 29592: PZVAL_LOCK(value);
! 29593: }
! 29594: }
! 29595: FREE_OP_VAR_PTR(free_op_data2);
! 29596: FREE_OP_IF_VAR(free_op_data1);
! 29597: }
! 29598:
! 29599: /* assign_dim has two opcodes! */
! 29600: ZEND_VM_INC_OPCODE();
! 29601: ZEND_VM_NEXT_OPCODE();
! 29602: }
! 29603:
! 29604: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29605: {
! 29606: zend_op *opline = EX(opline);
! 29607:
! 29608: zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29609: zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29610:
! 29611: if (IS_CV == IS_VAR && !variable_ptr_ptr) {
! 29612: if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
! 29613: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29614: EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
! 29615: ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
! 29616: INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
! 29617: 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);
! 29618: }
! 29619: } else if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29620: AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
! 29621: PZVAL_LOCK(EG(uninitialized_zval_ptr));
! 29622: }
! 29623: } else {
! 29624: value = zend_assign_to_variable(variable_ptr_ptr, value, 0 TSRMLS_CC);
! 29625: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29626: AI_SET_PTR(EX_T(opline->result.u.var).var, value);
! 29627: PZVAL_LOCK(value);
! 29628: }
! 29629: }
! 29630:
! 29631: /* zend_assign_to_variable() always takes care of op2, never free it! */
! 29632:
! 29633: ZEND_VM_NEXT_OPCODE();
! 29634: }
! 29635:
! 29636: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29637: {
! 29638: zend_op *opline = EX(opline);
! 29639: zend_free_op free_op2;
! 29640: zval **variable_ptr_ptr;
! 29641: zval **value_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29642:
! 29643: if (IS_CV == IS_VAR &&
! 29644: value_ptr_ptr &&
! 29645: !Z_ISREF_PP(value_ptr_ptr) &&
! 29646: opline->extended_value == ZEND_RETURNS_FUNCTION &&
! 29647: !EX_T(opline->op2.u.var).var.fcall_returned_reference) {
! 29648: if (free_op2.var == NULL) {
! 29649: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
! 29650: }
! 29651: zend_error(E_STRICT, "Only variables should be assigned by reference");
! 29652: if (UNEXPECTED(EG(exception) != NULL)) {
! 29653:
! 29654: ZEND_VM_NEXT_OPCODE();
! 29655: }
! 29656: return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29657: } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 29658: PZVAL_LOCK(*value_ptr_ptr);
! 29659: }
! 29660: if (IS_CV == IS_VAR && EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr) {
! 29661: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
! 29662: }
! 29663:
! 29664: variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29665: if ((IS_CV == IS_VAR && !value_ptr_ptr) ||
! 29666: (IS_CV == IS_VAR && !variable_ptr_ptr)) {
! 29667: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
! 29668: }
! 29669: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
! 29670:
! 29671: if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
! 29672: Z_DELREF_PP(variable_ptr_ptr);
! 29673: }
! 29674:
! 29675: if (!RETURN_VALUE_UNUSED(&opline->result)) {
! 29676: AI_SET_PTR(EX_T(opline->result.u.var).var, *variable_ptr_ptr);
! 29677: PZVAL_LOCK(*variable_ptr_ptr);
! 29678: }
! 29679:
! 29680:
! 29681: ZEND_VM_NEXT_OPCODE();
! 29682: }
! 29683:
! 29684: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29685: {
! 29686: zend_op *opline = EX(opline);
! 29687: zval *function_name;
! 29688: char *function_name_strval;
! 29689: int function_name_strlen;
! 29690:
! 29691:
! 29692: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
! 29693:
! 29694: function_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29695:
! 29696: if (Z_TYPE_P(function_name)!=IS_STRING) {
! 29697: zend_error_noreturn(E_ERROR, "Method name must be a string");
! 29698: }
! 29699:
! 29700: function_name_strval = Z_STRVAL_P(function_name);
! 29701: function_name_strlen = Z_STRLEN_P(function_name);
! 29702:
! 29703: EX(object) = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29704:
! 29705: if (EX(object) && Z_TYPE_P(EX(object)) == IS_OBJECT) {
! 29706: if (Z_OBJ_HT_P(EX(object))->get_method == NULL) {
! 29707: zend_error_noreturn(E_ERROR, "Object does not support method calls");
! 29708: }
! 29709:
! 29710: /* First, locate the function. */
! 29711: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen TSRMLS_CC);
! 29712: if (!EX(fbc)) {
! 29713: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
! 29714: }
! 29715:
! 29716: EX(called_scope) = Z_OBJCE_P(EX(object));
! 29717: } else {
! 29718: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
! 29719: }
! 29720:
! 29721: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
! 29722: EX(object) = NULL;
! 29723: } else {
! 29724: if (!PZVAL_IS_REF(EX(object))) {
! 29725: Z_ADDREF_P(EX(object)); /* For $this pointer */
! 29726: } else {
! 29727: zval *this_ptr;
! 29728: ALLOC_ZVAL(this_ptr);
! 29729: INIT_PZVAL_COPY(this_ptr, EX(object));
! 29730: zval_copy_ctor(this_ptr);
! 29731: EX(object) = this_ptr;
! 29732: }
! 29733: }
! 29734:
! 29735:
! 29736: ZEND_VM_NEXT_OPCODE();
! 29737: }
! 29738:
! 29739: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29740: {
! 29741: zend_op *opline = EX(opline);
! 29742: int switch_expr_is_overloaded=0;
! 29743:
! 29744:
! 29745: if (IS_CV==IS_VAR) {
! 29746: if (EX_T(opline->op1.u.var).var.ptr_ptr) {
! 29747: PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);
! 29748: } else {
! 29749: switch_expr_is_overloaded = 1;
! 29750: Z_ADDREF_P(EX_T(opline->op1.u.var).str_offset.str);
! 29751: }
! 29752: }
! 29753: is_equal_function(&EX_T(opline->result.u.var).tmp_var,
! 29754: _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC),
! 29755: _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC) TSRMLS_CC);
! 29756:
! 29757: if (switch_expr_is_overloaded) {
! 29758: /* We only free op1 if this is a string offset,
! 29759: * Since if it is a TMP_VAR, it'll be reused by
! 29760: * other CASE opcodes (whereas string offsets
! 29761: * are allocated at each get_zval_ptr())
! 29762: */
! 29763:
! 29764: EX_T(opline->op1.u.var).var.ptr_ptr = NULL;
! 29765: EX_T(opline->op1.u.var).var.ptr = NULL;
! 29766: }
! 29767: ZEND_VM_NEXT_OPCODE();
! 29768: }
! 29769:
! 29770: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29771: {
! 29772: zend_op *opline = EX(opline);
! 29773:
! 29774: zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;
! 29775: zval *expr_ptr;
! 29776: zval *offset=_get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29777:
! 29778: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 29779: zval **expr_ptr_ptr = NULL;
! 29780:
! 29781: if (opline->extended_value) {
! 29782: expr_ptr_ptr=_get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
! 29783: expr_ptr = *expr_ptr_ptr;
! 29784: } else {
! 29785: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29786: }
! 29787: #else
! 29788: expr_ptr=_get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29789: #endif
! 29790:
! 29791: if (0) { /* temporary variable */
! 29792: zval *new_expr;
! 29793:
! 29794: ALLOC_ZVAL(new_expr);
! 29795: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 29796: expr_ptr = new_expr;
! 29797: } else {
! 29798: #if 0 || IS_CV == IS_VAR || IS_CV == IS_CV
! 29799: if (opline->extended_value) {
! 29800: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
! 29801: expr_ptr = *expr_ptr_ptr;
! 29802: Z_ADDREF_P(expr_ptr);
! 29803: } else
! 29804: #endif
! 29805: if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
! 29806: zval *new_expr;
! 29807:
! 29808: ALLOC_ZVAL(new_expr);
! 29809: INIT_PZVAL_COPY(new_expr, expr_ptr);
! 29810: expr_ptr = new_expr;
! 29811: zendi_zval_copy_ctor(*expr_ptr);
! 29812: } else {
! 29813: Z_ADDREF_P(expr_ptr);
! 29814: }
! 29815: }
! 29816: if (offset) {
! 29817: switch (Z_TYPE_P(offset)) {
! 29818: case IS_DOUBLE:
! 29819: zend_hash_index_update(Z_ARRVAL_P(array_ptr), zend_dval_to_lval(Z_DVAL_P(offset)), &expr_ptr, sizeof(zval *), NULL);
! 29820: break;
! 29821: case IS_LONG:
! 29822: case IS_BOOL:
! 29823: zend_hash_index_update(Z_ARRVAL_P(array_ptr), Z_LVAL_P(offset), &expr_ptr, sizeof(zval *), NULL);
! 29824: break;
! 29825: case IS_STRING:
! 29826: zend_symtable_update(Z_ARRVAL_P(array_ptr), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, &expr_ptr, sizeof(zval *), NULL);
! 29827: break;
! 29828: case IS_NULL:
! 29829: zend_hash_update(Z_ARRVAL_P(array_ptr), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
! 29830: break;
! 29831: default:
! 29832: zend_error(E_WARNING, "Illegal offset type");
! 29833: zval_ptr_dtor(&expr_ptr);
! 29834: /* do nothing */
! 29835: break;
! 29836: }
! 29837:
! 29838: } else {
! 29839: zend_hash_next_index_insert(Z_ARRVAL_P(array_ptr), &expr_ptr, sizeof(zval *), NULL);
! 29840: }
! 29841: if (opline->extended_value) {
! 29842:
! 29843: } else {
! 29844:
! 29845: }
! 29846: ZEND_VM_NEXT_OPCODE();
! 29847: }
! 29848:
! 29849: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29850: {
! 29851: zend_op *opline = EX(opline);
! 29852:
! 29853: array_init(&EX_T(opline->result.u.var).tmp_var);
! 29854: if (IS_CV == IS_UNUSED) {
! 29855: ZEND_VM_NEXT_OPCODE();
! 29856: #if 0 || IS_CV != IS_UNUSED
! 29857: } else {
! 29858: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 29859: #endif
! 29860: }
! 29861: }
! 29862:
! 29863: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29864: {
! 29865: zend_op *opline = EX(opline);
! 29866:
! 29867: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 29868: zval *offset;
! 29869:
! 29870: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 29871: SEPARATE_ZVAL_IF_NOT_REF(container);
! 29872: }
! 29873: offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29874:
! 29875: if (IS_CV != IS_VAR || container) {
! 29876: switch (Z_TYPE_PP(container)) {
! 29877: case IS_ARRAY: {
! 29878: HashTable *ht = Z_ARRVAL_PP(container);
! 29879:
! 29880: switch (Z_TYPE_P(offset)) {
! 29881: case IS_DOUBLE:
! 29882: zend_hash_index_del(ht, zend_dval_to_lval(Z_DVAL_P(offset)));
! 29883: break;
! 29884: case IS_RESOURCE:
! 29885: case IS_BOOL:
! 29886: case IS_LONG:
! 29887: zend_hash_index_del(ht, Z_LVAL_P(offset));
! 29888: break;
! 29889: case IS_STRING:
! 29890: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 29891: Z_ADDREF_P(offset);
! 29892: }
! 29893: if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS &&
! 29894: ht == &EG(symbol_table)) {
! 29895: zend_execute_data *ex;
! 29896: ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1);
! 29897:
! 29898: for (ex = execute_data; ex; ex = ex->prev_execute_data) {
! 29899: if (ex->op_array && ex->symbol_table == ht) {
! 29900: int i;
! 29901:
! 29902: for (i = 0; i < ex->op_array->last_var; i++) {
! 29903: if (ex->op_array->vars[i].hash_value == hash_value &&
! 29904: ex->op_array->vars[i].name_len == offset->value.str.len &&
! 29905: !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) {
! 29906: ex->CVs[i] = NULL;
! 29907: break;
! 29908: }
! 29909: }
! 29910: }
! 29911: }
! 29912: }
! 29913: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
! 29914: zval_ptr_dtor(&offset);
! 29915: }
! 29916: break;
! 29917: case IS_NULL:
! 29918: zend_hash_del(ht, "", sizeof(""));
! 29919: break;
! 29920: default:
! 29921: zend_error(E_WARNING, "Illegal offset type in unset");
! 29922: break;
! 29923: }
! 29924:
! 29925: break;
! 29926: }
! 29927: case IS_OBJECT:
! 29928: if (!Z_OBJ_HT_P(*container)->unset_dimension) {
! 29929: zend_error_noreturn(E_ERROR, "Cannot use object as array");
! 29930: }
! 29931: if (0) {
! 29932: MAKE_REAL_ZVAL_PTR(offset);
! 29933: }
! 29934: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
! 29935: if (0) {
! 29936: zval_ptr_dtor(&offset);
! 29937: } else {
! 29938:
! 29939: }
! 29940: break;
! 29941: case IS_STRING:
! 29942: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
! 29943: ZEND_VM_CONTINUE(); /* bailed out before */
! 29944: default:
! 29945:
! 29946: break;
! 29947: }
! 29948: } else {
! 29949:
! 29950: }
! 29951:
! 29952: ZEND_VM_NEXT_OPCODE();
! 29953: }
! 29954:
! 29955: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 29956: {
! 29957: zend_op *opline = EX(opline);
! 29958:
! 29959: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
! 29960: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 29961:
! 29962: if (IS_CV != IS_VAR || container) {
! 29963: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
! 29964: SEPARATE_ZVAL_IF_NOT_REF(container);
! 29965: }
! 29966: if (Z_TYPE_PP(container) == IS_OBJECT) {
! 29967: if (0) {
! 29968: MAKE_REAL_ZVAL_PTR(offset);
! 29969: }
! 29970: if (Z_OBJ_HT_P(*container)->unset_property) {
! 29971: Z_OBJ_HT_P(*container)->unset_property(*container, offset TSRMLS_CC);
! 29972: } else {
! 29973: zend_error(E_NOTICE, "Trying to unset property of non-object");
! 29974: }
! 29975: if (0) {
! 29976: zval_ptr_dtor(&offset);
! 29977: } else {
! 29978:
! 29979: }
! 29980: } else {
! 29981:
! 29982: }
! 29983: } else {
! 29984:
! 29985: }
! 29986:
! 29987: ZEND_VM_NEXT_OPCODE();
! 29988: }
! 29989:
! 29990: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
! 29991: {
! 29992: zend_op *opline = EX(opline);
! 29993:
! 29994: zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
! 29995: zval **value = NULL;
! 29996: int result = 0;
! 29997:
! 29998: if (IS_CV != IS_VAR || container) {
! 29999:
! 30000: zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
! 30001:
! 30002: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
! 30003: HashTable *ht;
! 30004: int isset = 0;
! 30005:
! 30006: ht = Z_ARRVAL_PP(container);
! 30007:
! 30008: switch (Z_TYPE_P(offset)) {
! 30009: case IS_DOUBLE:
! 30010: if (zend_hash_index_find(ht, zend_dval_to_lval(Z_DVAL_P(offset)), (void **) &value) == SUCCESS) {
! 30011: isset = 1;
! 30012: }
! 30013: break;
! 30014: case IS_RESOURCE:
! 30015: case IS_BOOL:
! 30016: case IS_LONG:
! 30017: if (zend_hash_index_find(ht, Z_LVAL_P(offset), (void **) &value) == SUCCESS) {
! 30018: isset = 1;
! 30019: }
! 30020: break;
! 30021: case IS_STRING:
! 30022: if (zend_symtable_find(ht, offset->value.str.val, offset->value.str.len+1, (void **) &value) == SUCCESS) {
! 30023: isset = 1;
! 30024: }
! 30025: break;
! 30026: case IS_NULL:
! 30027: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
! 30028: isset = 1;
! 30029: }
! 30030: break;
! 30031: default:
! 30032: zend_error(E_WARNING, "Illegal offset type in isset or empty");
! 30033:
! 30034: break;
! 30035: }
! 30036:
! 30037: switch (opline->extended_value) {
! 30038: case ZEND_ISSET:
! 30039: if (isset && Z_TYPE_PP(value) == IS_NULL) {
! 30040: result = 0;
! 30041: } else {
! 30042: result = isset;
! 30043: }
! 30044: break;
! 30045: case ZEND_ISEMPTY:
! 30046: if (!isset || !i_zend_is_true(*value)) {
! 30047: result = 0;
! 30048: } else {
! 30049: result = 1;
! 30050: }
! 30051: break;
! 30052: }
! 30053:
! 30054: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
! 30055: if (0) {
! 30056: MAKE_REAL_ZVAL_PTR(offset);
! 30057: }
! 30058: if (prop_dim) {
! 30059: if (Z_OBJ_HT_P(*container)->has_property) {
! 30060: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 30061: } else {
! 30062: zend_error(E_NOTICE, "Trying to check property of non-object");
! 30063: result = 0;
! 30064: }
! 30065: } else {
! 30066: if (Z_OBJ_HT_P(*container)->has_dimension) {
! 30067: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);
! 30068: } else {
! 30069: zend_error(E_NOTICE, "Trying to check element of non-array");
! 30070: result = 0;
! 30071: }
! 30072: }
! 30073: if (0) {
! 30074: zval_ptr_dtor(&offset);
! 30075: } else {
! 30076:
! 30077: }
! 30078: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
! 30079: zval tmp;
! 30080:
! 30081: if (Z_TYPE_P(offset) != IS_LONG) {
! 30082: tmp = *offset;
! 30083: zval_copy_ctor(&tmp);
! 30084: convert_to_long(&tmp);
! 30085: offset = &tmp;
! 30086: }
! 30087: if (Z_TYPE_P(offset) == IS_LONG) {
! 30088: switch (opline->extended_value) {
! 30089: case ZEND_ISSET:
! 30090: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
! 30091: result = 1;
! 30092: }
! 30093: break;
! 30094: case ZEND_ISEMPTY:
! 30095: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
! 30096: result = 1;
! 30097: }
! 30098: break;
! 30099: }
! 30100: }
! 30101:
! 30102: } else {
! 30103:
! 30104: }
! 30105: }
! 30106:
! 30107: Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
! 30108:
! 30109: switch (opline->extended_value) {
! 30110: case ZEND_ISSET:
! 30111: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = result;
! 30112: break;
! 30113: case ZEND_ISEMPTY:
! 30114: Z_LVAL(EX_T(opline->result.u.var).tmp_var) = !result;
! 30115: break;
! 30116: }
! 30117:
! 30118: ZEND_VM_NEXT_OPCODE();
! 30119: }
! 30120:
! 30121: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 30122: {
! 30123: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 30124: }
! 30125:
! 30126: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 30127: {
! 30128: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 30129: }
! 30130:
! 30131: static int ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
! 30132: {
! 30133: zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", EX(opline)->opcode, EX(opline)->op1.op_type, EX(opline)->op2.op_type);
! 30134: }
! 30135:
! 30136:
! 30137: void zend_init_opcodes_handlers(void)
! 30138: {
! 30139: static const opcode_handler_t labels[] = {
! 30140: ZEND_NOP_SPEC_HANDLER,
! 30141: ZEND_NOP_SPEC_HANDLER,
! 30142: ZEND_NOP_SPEC_HANDLER,
! 30143: ZEND_NOP_SPEC_HANDLER,
! 30144: ZEND_NOP_SPEC_HANDLER,
! 30145: ZEND_NOP_SPEC_HANDLER,
! 30146: ZEND_NOP_SPEC_HANDLER,
! 30147: ZEND_NOP_SPEC_HANDLER,
! 30148: ZEND_NOP_SPEC_HANDLER,
! 30149: ZEND_NOP_SPEC_HANDLER,
! 30150: ZEND_NOP_SPEC_HANDLER,
! 30151: ZEND_NOP_SPEC_HANDLER,
! 30152: ZEND_NOP_SPEC_HANDLER,
! 30153: ZEND_NOP_SPEC_HANDLER,
! 30154: ZEND_NOP_SPEC_HANDLER,
! 30155: ZEND_NOP_SPEC_HANDLER,
! 30156: ZEND_NOP_SPEC_HANDLER,
! 30157: ZEND_NOP_SPEC_HANDLER,
! 30158: ZEND_NOP_SPEC_HANDLER,
! 30159: ZEND_NOP_SPEC_HANDLER,
! 30160: ZEND_NOP_SPEC_HANDLER,
! 30161: ZEND_NOP_SPEC_HANDLER,
! 30162: ZEND_NOP_SPEC_HANDLER,
! 30163: ZEND_NOP_SPEC_HANDLER,
! 30164: ZEND_NOP_SPEC_HANDLER,
! 30165: ZEND_ADD_SPEC_CONST_CONST_HANDLER,
! 30166: ZEND_ADD_SPEC_CONST_TMP_HANDLER,
! 30167: ZEND_ADD_SPEC_CONST_VAR_HANDLER,
! 30168: ZEND_NULL_HANDLER,
! 30169: ZEND_ADD_SPEC_CONST_CV_HANDLER,
! 30170: ZEND_ADD_SPEC_TMP_CONST_HANDLER,
! 30171: ZEND_ADD_SPEC_TMP_TMP_HANDLER,
! 30172: ZEND_ADD_SPEC_TMP_VAR_HANDLER,
! 30173: ZEND_NULL_HANDLER,
! 30174: ZEND_ADD_SPEC_TMP_CV_HANDLER,
! 30175: ZEND_ADD_SPEC_VAR_CONST_HANDLER,
! 30176: ZEND_ADD_SPEC_VAR_TMP_HANDLER,
! 30177: ZEND_ADD_SPEC_VAR_VAR_HANDLER,
! 30178: ZEND_NULL_HANDLER,
! 30179: ZEND_ADD_SPEC_VAR_CV_HANDLER,
! 30180: ZEND_NULL_HANDLER,
! 30181: ZEND_NULL_HANDLER,
! 30182: ZEND_NULL_HANDLER,
! 30183: ZEND_NULL_HANDLER,
! 30184: ZEND_NULL_HANDLER,
! 30185: ZEND_ADD_SPEC_CV_CONST_HANDLER,
! 30186: ZEND_ADD_SPEC_CV_TMP_HANDLER,
! 30187: ZEND_ADD_SPEC_CV_VAR_HANDLER,
! 30188: ZEND_NULL_HANDLER,
! 30189: ZEND_ADD_SPEC_CV_CV_HANDLER,
! 30190: ZEND_SUB_SPEC_CONST_CONST_HANDLER,
! 30191: ZEND_SUB_SPEC_CONST_TMP_HANDLER,
! 30192: ZEND_SUB_SPEC_CONST_VAR_HANDLER,
! 30193: ZEND_NULL_HANDLER,
! 30194: ZEND_SUB_SPEC_CONST_CV_HANDLER,
! 30195: ZEND_SUB_SPEC_TMP_CONST_HANDLER,
! 30196: ZEND_SUB_SPEC_TMP_TMP_HANDLER,
! 30197: ZEND_SUB_SPEC_TMP_VAR_HANDLER,
! 30198: ZEND_NULL_HANDLER,
! 30199: ZEND_SUB_SPEC_TMP_CV_HANDLER,
! 30200: ZEND_SUB_SPEC_VAR_CONST_HANDLER,
! 30201: ZEND_SUB_SPEC_VAR_TMP_HANDLER,
! 30202: ZEND_SUB_SPEC_VAR_VAR_HANDLER,
! 30203: ZEND_NULL_HANDLER,
! 30204: ZEND_SUB_SPEC_VAR_CV_HANDLER,
! 30205: ZEND_NULL_HANDLER,
! 30206: ZEND_NULL_HANDLER,
! 30207: ZEND_NULL_HANDLER,
! 30208: ZEND_NULL_HANDLER,
! 30209: ZEND_NULL_HANDLER,
! 30210: ZEND_SUB_SPEC_CV_CONST_HANDLER,
! 30211: ZEND_SUB_SPEC_CV_TMP_HANDLER,
! 30212: ZEND_SUB_SPEC_CV_VAR_HANDLER,
! 30213: ZEND_NULL_HANDLER,
! 30214: ZEND_SUB_SPEC_CV_CV_HANDLER,
! 30215: ZEND_MUL_SPEC_CONST_CONST_HANDLER,
! 30216: ZEND_MUL_SPEC_CONST_TMP_HANDLER,
! 30217: ZEND_MUL_SPEC_CONST_VAR_HANDLER,
! 30218: ZEND_NULL_HANDLER,
! 30219: ZEND_MUL_SPEC_CONST_CV_HANDLER,
! 30220: ZEND_MUL_SPEC_TMP_CONST_HANDLER,
! 30221: ZEND_MUL_SPEC_TMP_TMP_HANDLER,
! 30222: ZEND_MUL_SPEC_TMP_VAR_HANDLER,
! 30223: ZEND_NULL_HANDLER,
! 30224: ZEND_MUL_SPEC_TMP_CV_HANDLER,
! 30225: ZEND_MUL_SPEC_VAR_CONST_HANDLER,
! 30226: ZEND_MUL_SPEC_VAR_TMP_HANDLER,
! 30227: ZEND_MUL_SPEC_VAR_VAR_HANDLER,
! 30228: ZEND_NULL_HANDLER,
! 30229: ZEND_MUL_SPEC_VAR_CV_HANDLER,
! 30230: ZEND_NULL_HANDLER,
! 30231: ZEND_NULL_HANDLER,
! 30232: ZEND_NULL_HANDLER,
! 30233: ZEND_NULL_HANDLER,
! 30234: ZEND_NULL_HANDLER,
! 30235: ZEND_MUL_SPEC_CV_CONST_HANDLER,
! 30236: ZEND_MUL_SPEC_CV_TMP_HANDLER,
! 30237: ZEND_MUL_SPEC_CV_VAR_HANDLER,
! 30238: ZEND_NULL_HANDLER,
! 30239: ZEND_MUL_SPEC_CV_CV_HANDLER,
! 30240: ZEND_DIV_SPEC_CONST_CONST_HANDLER,
! 30241: ZEND_DIV_SPEC_CONST_TMP_HANDLER,
! 30242: ZEND_DIV_SPEC_CONST_VAR_HANDLER,
! 30243: ZEND_NULL_HANDLER,
! 30244: ZEND_DIV_SPEC_CONST_CV_HANDLER,
! 30245: ZEND_DIV_SPEC_TMP_CONST_HANDLER,
! 30246: ZEND_DIV_SPEC_TMP_TMP_HANDLER,
! 30247: ZEND_DIV_SPEC_TMP_VAR_HANDLER,
! 30248: ZEND_NULL_HANDLER,
! 30249: ZEND_DIV_SPEC_TMP_CV_HANDLER,
! 30250: ZEND_DIV_SPEC_VAR_CONST_HANDLER,
! 30251: ZEND_DIV_SPEC_VAR_TMP_HANDLER,
! 30252: ZEND_DIV_SPEC_VAR_VAR_HANDLER,
! 30253: ZEND_NULL_HANDLER,
! 30254: ZEND_DIV_SPEC_VAR_CV_HANDLER,
! 30255: ZEND_NULL_HANDLER,
! 30256: ZEND_NULL_HANDLER,
! 30257: ZEND_NULL_HANDLER,
! 30258: ZEND_NULL_HANDLER,
! 30259: ZEND_NULL_HANDLER,
! 30260: ZEND_DIV_SPEC_CV_CONST_HANDLER,
! 30261: ZEND_DIV_SPEC_CV_TMP_HANDLER,
! 30262: ZEND_DIV_SPEC_CV_VAR_HANDLER,
! 30263: ZEND_NULL_HANDLER,
! 30264: ZEND_DIV_SPEC_CV_CV_HANDLER,
! 30265: ZEND_MOD_SPEC_CONST_CONST_HANDLER,
! 30266: ZEND_MOD_SPEC_CONST_TMP_HANDLER,
! 30267: ZEND_MOD_SPEC_CONST_VAR_HANDLER,
! 30268: ZEND_NULL_HANDLER,
! 30269: ZEND_MOD_SPEC_CONST_CV_HANDLER,
! 30270: ZEND_MOD_SPEC_TMP_CONST_HANDLER,
! 30271: ZEND_MOD_SPEC_TMP_TMP_HANDLER,
! 30272: ZEND_MOD_SPEC_TMP_VAR_HANDLER,
! 30273: ZEND_NULL_HANDLER,
! 30274: ZEND_MOD_SPEC_TMP_CV_HANDLER,
! 30275: ZEND_MOD_SPEC_VAR_CONST_HANDLER,
! 30276: ZEND_MOD_SPEC_VAR_TMP_HANDLER,
! 30277: ZEND_MOD_SPEC_VAR_VAR_HANDLER,
! 30278: ZEND_NULL_HANDLER,
! 30279: ZEND_MOD_SPEC_VAR_CV_HANDLER,
! 30280: ZEND_NULL_HANDLER,
! 30281: ZEND_NULL_HANDLER,
! 30282: ZEND_NULL_HANDLER,
! 30283: ZEND_NULL_HANDLER,
! 30284: ZEND_NULL_HANDLER,
! 30285: ZEND_MOD_SPEC_CV_CONST_HANDLER,
! 30286: ZEND_MOD_SPEC_CV_TMP_HANDLER,
! 30287: ZEND_MOD_SPEC_CV_VAR_HANDLER,
! 30288: ZEND_NULL_HANDLER,
! 30289: ZEND_MOD_SPEC_CV_CV_HANDLER,
! 30290: ZEND_SL_SPEC_CONST_CONST_HANDLER,
! 30291: ZEND_SL_SPEC_CONST_TMP_HANDLER,
! 30292: ZEND_SL_SPEC_CONST_VAR_HANDLER,
! 30293: ZEND_NULL_HANDLER,
! 30294: ZEND_SL_SPEC_CONST_CV_HANDLER,
! 30295: ZEND_SL_SPEC_TMP_CONST_HANDLER,
! 30296: ZEND_SL_SPEC_TMP_TMP_HANDLER,
! 30297: ZEND_SL_SPEC_TMP_VAR_HANDLER,
! 30298: ZEND_NULL_HANDLER,
! 30299: ZEND_SL_SPEC_TMP_CV_HANDLER,
! 30300: ZEND_SL_SPEC_VAR_CONST_HANDLER,
! 30301: ZEND_SL_SPEC_VAR_TMP_HANDLER,
! 30302: ZEND_SL_SPEC_VAR_VAR_HANDLER,
! 30303: ZEND_NULL_HANDLER,
! 30304: ZEND_SL_SPEC_VAR_CV_HANDLER,
! 30305: ZEND_NULL_HANDLER,
! 30306: ZEND_NULL_HANDLER,
! 30307: ZEND_NULL_HANDLER,
! 30308: ZEND_NULL_HANDLER,
! 30309: ZEND_NULL_HANDLER,
! 30310: ZEND_SL_SPEC_CV_CONST_HANDLER,
! 30311: ZEND_SL_SPEC_CV_TMP_HANDLER,
! 30312: ZEND_SL_SPEC_CV_VAR_HANDLER,
! 30313: ZEND_NULL_HANDLER,
! 30314: ZEND_SL_SPEC_CV_CV_HANDLER,
! 30315: ZEND_SR_SPEC_CONST_CONST_HANDLER,
! 30316: ZEND_SR_SPEC_CONST_TMP_HANDLER,
! 30317: ZEND_SR_SPEC_CONST_VAR_HANDLER,
! 30318: ZEND_NULL_HANDLER,
! 30319: ZEND_SR_SPEC_CONST_CV_HANDLER,
! 30320: ZEND_SR_SPEC_TMP_CONST_HANDLER,
! 30321: ZEND_SR_SPEC_TMP_TMP_HANDLER,
! 30322: ZEND_SR_SPEC_TMP_VAR_HANDLER,
! 30323: ZEND_NULL_HANDLER,
! 30324: ZEND_SR_SPEC_TMP_CV_HANDLER,
! 30325: ZEND_SR_SPEC_VAR_CONST_HANDLER,
! 30326: ZEND_SR_SPEC_VAR_TMP_HANDLER,
! 30327: ZEND_SR_SPEC_VAR_VAR_HANDLER,
! 30328: ZEND_NULL_HANDLER,
! 30329: ZEND_SR_SPEC_VAR_CV_HANDLER,
! 30330: ZEND_NULL_HANDLER,
! 30331: ZEND_NULL_HANDLER,
! 30332: ZEND_NULL_HANDLER,
! 30333: ZEND_NULL_HANDLER,
! 30334: ZEND_NULL_HANDLER,
! 30335: ZEND_SR_SPEC_CV_CONST_HANDLER,
! 30336: ZEND_SR_SPEC_CV_TMP_HANDLER,
! 30337: ZEND_SR_SPEC_CV_VAR_HANDLER,
! 30338: ZEND_NULL_HANDLER,
! 30339: ZEND_SR_SPEC_CV_CV_HANDLER,
! 30340: ZEND_CONCAT_SPEC_CONST_CONST_HANDLER,
! 30341: ZEND_CONCAT_SPEC_CONST_TMP_HANDLER,
! 30342: ZEND_CONCAT_SPEC_CONST_VAR_HANDLER,
! 30343: ZEND_NULL_HANDLER,
! 30344: ZEND_CONCAT_SPEC_CONST_CV_HANDLER,
! 30345: ZEND_CONCAT_SPEC_TMP_CONST_HANDLER,
! 30346: ZEND_CONCAT_SPEC_TMP_TMP_HANDLER,
! 30347: ZEND_CONCAT_SPEC_TMP_VAR_HANDLER,
! 30348: ZEND_NULL_HANDLER,
! 30349: ZEND_CONCAT_SPEC_TMP_CV_HANDLER,
! 30350: ZEND_CONCAT_SPEC_VAR_CONST_HANDLER,
! 30351: ZEND_CONCAT_SPEC_VAR_TMP_HANDLER,
! 30352: ZEND_CONCAT_SPEC_VAR_VAR_HANDLER,
! 30353: ZEND_NULL_HANDLER,
! 30354: ZEND_CONCAT_SPEC_VAR_CV_HANDLER,
! 30355: ZEND_NULL_HANDLER,
! 30356: ZEND_NULL_HANDLER,
! 30357: ZEND_NULL_HANDLER,
! 30358: ZEND_NULL_HANDLER,
! 30359: ZEND_NULL_HANDLER,
! 30360: ZEND_CONCAT_SPEC_CV_CONST_HANDLER,
! 30361: ZEND_CONCAT_SPEC_CV_TMP_HANDLER,
! 30362: ZEND_CONCAT_SPEC_CV_VAR_HANDLER,
! 30363: ZEND_NULL_HANDLER,
! 30364: ZEND_CONCAT_SPEC_CV_CV_HANDLER,
! 30365: ZEND_BW_OR_SPEC_CONST_CONST_HANDLER,
! 30366: ZEND_BW_OR_SPEC_CONST_TMP_HANDLER,
! 30367: ZEND_BW_OR_SPEC_CONST_VAR_HANDLER,
! 30368: ZEND_NULL_HANDLER,
! 30369: ZEND_BW_OR_SPEC_CONST_CV_HANDLER,
! 30370: ZEND_BW_OR_SPEC_TMP_CONST_HANDLER,
! 30371: ZEND_BW_OR_SPEC_TMP_TMP_HANDLER,
! 30372: ZEND_BW_OR_SPEC_TMP_VAR_HANDLER,
! 30373: ZEND_NULL_HANDLER,
! 30374: ZEND_BW_OR_SPEC_TMP_CV_HANDLER,
! 30375: ZEND_BW_OR_SPEC_VAR_CONST_HANDLER,
! 30376: ZEND_BW_OR_SPEC_VAR_TMP_HANDLER,
! 30377: ZEND_BW_OR_SPEC_VAR_VAR_HANDLER,
! 30378: ZEND_NULL_HANDLER,
! 30379: ZEND_BW_OR_SPEC_VAR_CV_HANDLER,
! 30380: ZEND_NULL_HANDLER,
! 30381: ZEND_NULL_HANDLER,
! 30382: ZEND_NULL_HANDLER,
! 30383: ZEND_NULL_HANDLER,
! 30384: ZEND_NULL_HANDLER,
! 30385: ZEND_BW_OR_SPEC_CV_CONST_HANDLER,
! 30386: ZEND_BW_OR_SPEC_CV_TMP_HANDLER,
! 30387: ZEND_BW_OR_SPEC_CV_VAR_HANDLER,
! 30388: ZEND_NULL_HANDLER,
! 30389: ZEND_BW_OR_SPEC_CV_CV_HANDLER,
! 30390: ZEND_BW_AND_SPEC_CONST_CONST_HANDLER,
! 30391: ZEND_BW_AND_SPEC_CONST_TMP_HANDLER,
! 30392: ZEND_BW_AND_SPEC_CONST_VAR_HANDLER,
! 30393: ZEND_NULL_HANDLER,
! 30394: ZEND_BW_AND_SPEC_CONST_CV_HANDLER,
! 30395: ZEND_BW_AND_SPEC_TMP_CONST_HANDLER,
! 30396: ZEND_BW_AND_SPEC_TMP_TMP_HANDLER,
! 30397: ZEND_BW_AND_SPEC_TMP_VAR_HANDLER,
! 30398: ZEND_NULL_HANDLER,
! 30399: ZEND_BW_AND_SPEC_TMP_CV_HANDLER,
! 30400: ZEND_BW_AND_SPEC_VAR_CONST_HANDLER,
! 30401: ZEND_BW_AND_SPEC_VAR_TMP_HANDLER,
! 30402: ZEND_BW_AND_SPEC_VAR_VAR_HANDLER,
! 30403: ZEND_NULL_HANDLER,
! 30404: ZEND_BW_AND_SPEC_VAR_CV_HANDLER,
! 30405: ZEND_NULL_HANDLER,
! 30406: ZEND_NULL_HANDLER,
! 30407: ZEND_NULL_HANDLER,
! 30408: ZEND_NULL_HANDLER,
! 30409: ZEND_NULL_HANDLER,
! 30410: ZEND_BW_AND_SPEC_CV_CONST_HANDLER,
! 30411: ZEND_BW_AND_SPEC_CV_TMP_HANDLER,
! 30412: ZEND_BW_AND_SPEC_CV_VAR_HANDLER,
! 30413: ZEND_NULL_HANDLER,
! 30414: ZEND_BW_AND_SPEC_CV_CV_HANDLER,
! 30415: ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER,
! 30416: ZEND_BW_XOR_SPEC_CONST_TMP_HANDLER,
! 30417: ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER,
! 30418: ZEND_NULL_HANDLER,
! 30419: ZEND_BW_XOR_SPEC_CONST_CV_HANDLER,
! 30420: ZEND_BW_XOR_SPEC_TMP_CONST_HANDLER,
! 30421: ZEND_BW_XOR_SPEC_TMP_TMP_HANDLER,
! 30422: ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER,
! 30423: ZEND_NULL_HANDLER,
! 30424: ZEND_BW_XOR_SPEC_TMP_CV_HANDLER,
! 30425: ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER,
! 30426: ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER,
! 30427: ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER,
! 30428: ZEND_NULL_HANDLER,
! 30429: ZEND_BW_XOR_SPEC_VAR_CV_HANDLER,
! 30430: ZEND_NULL_HANDLER,
! 30431: ZEND_NULL_HANDLER,
! 30432: ZEND_NULL_HANDLER,
! 30433: ZEND_NULL_HANDLER,
! 30434: ZEND_NULL_HANDLER,
! 30435: ZEND_BW_XOR_SPEC_CV_CONST_HANDLER,
! 30436: ZEND_BW_XOR_SPEC_CV_TMP_HANDLER,
! 30437: ZEND_BW_XOR_SPEC_CV_VAR_HANDLER,
! 30438: ZEND_NULL_HANDLER,
! 30439: ZEND_BW_XOR_SPEC_CV_CV_HANDLER,
! 30440: ZEND_BW_NOT_SPEC_CONST_HANDLER,
! 30441: ZEND_BW_NOT_SPEC_CONST_HANDLER,
! 30442: ZEND_BW_NOT_SPEC_CONST_HANDLER,
! 30443: ZEND_BW_NOT_SPEC_CONST_HANDLER,
! 30444: ZEND_BW_NOT_SPEC_CONST_HANDLER,
! 30445: ZEND_BW_NOT_SPEC_TMP_HANDLER,
! 30446: ZEND_BW_NOT_SPEC_TMP_HANDLER,
! 30447: ZEND_BW_NOT_SPEC_TMP_HANDLER,
! 30448: ZEND_BW_NOT_SPEC_TMP_HANDLER,
! 30449: ZEND_BW_NOT_SPEC_TMP_HANDLER,
! 30450: ZEND_BW_NOT_SPEC_VAR_HANDLER,
! 30451: ZEND_BW_NOT_SPEC_VAR_HANDLER,
! 30452: ZEND_BW_NOT_SPEC_VAR_HANDLER,
! 30453: ZEND_BW_NOT_SPEC_VAR_HANDLER,
! 30454: ZEND_BW_NOT_SPEC_VAR_HANDLER,
! 30455: ZEND_NULL_HANDLER,
! 30456: ZEND_NULL_HANDLER,
! 30457: ZEND_NULL_HANDLER,
! 30458: ZEND_NULL_HANDLER,
! 30459: ZEND_NULL_HANDLER,
! 30460: ZEND_BW_NOT_SPEC_CV_HANDLER,
! 30461: ZEND_BW_NOT_SPEC_CV_HANDLER,
! 30462: ZEND_BW_NOT_SPEC_CV_HANDLER,
! 30463: ZEND_BW_NOT_SPEC_CV_HANDLER,
! 30464: ZEND_BW_NOT_SPEC_CV_HANDLER,
! 30465: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
! 30466: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
! 30467: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
! 30468: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
! 30469: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
! 30470: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
! 30471: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
! 30472: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
! 30473: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
! 30474: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
! 30475: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
! 30476: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
! 30477: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
! 30478: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
! 30479: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
! 30480: ZEND_NULL_HANDLER,
! 30481: ZEND_NULL_HANDLER,
! 30482: ZEND_NULL_HANDLER,
! 30483: ZEND_NULL_HANDLER,
! 30484: ZEND_NULL_HANDLER,
! 30485: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
! 30486: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
! 30487: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
! 30488: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
! 30489: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
! 30490: ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER,
! 30491: ZEND_BOOL_XOR_SPEC_CONST_TMP_HANDLER,
! 30492: ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER,
! 30493: ZEND_NULL_HANDLER,
! 30494: ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER,
! 30495: ZEND_BOOL_XOR_SPEC_TMP_CONST_HANDLER,
! 30496: ZEND_BOOL_XOR_SPEC_TMP_TMP_HANDLER,
! 30497: ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER,
! 30498: ZEND_NULL_HANDLER,
! 30499: ZEND_BOOL_XOR_SPEC_TMP_CV_HANDLER,
! 30500: ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER,
! 30501: ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER,
! 30502: ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER,
! 30503: ZEND_NULL_HANDLER,
! 30504: ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER,
! 30505: ZEND_NULL_HANDLER,
! 30506: ZEND_NULL_HANDLER,
! 30507: ZEND_NULL_HANDLER,
! 30508: ZEND_NULL_HANDLER,
! 30509: ZEND_NULL_HANDLER,
! 30510: ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER,
! 30511: ZEND_BOOL_XOR_SPEC_CV_TMP_HANDLER,
! 30512: ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER,
! 30513: ZEND_NULL_HANDLER,
! 30514: ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER,
! 30515: ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER,
! 30516: ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER,
! 30517: ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER,
! 30518: ZEND_NULL_HANDLER,
! 30519: ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER,
! 30520: ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER,
! 30521: ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER,
! 30522: ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER,
! 30523: ZEND_NULL_HANDLER,
! 30524: ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER,
! 30525: ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER,
! 30526: ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER,
! 30527: ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER,
! 30528: ZEND_NULL_HANDLER,
! 30529: ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER,
! 30530: ZEND_NULL_HANDLER,
! 30531: ZEND_NULL_HANDLER,
! 30532: ZEND_NULL_HANDLER,
! 30533: ZEND_NULL_HANDLER,
! 30534: ZEND_NULL_HANDLER,
! 30535: ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER,
! 30536: ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER,
! 30537: ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER,
! 30538: ZEND_NULL_HANDLER,
! 30539: ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER,
! 30540: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER,
! 30541: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER,
! 30542: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER,
! 30543: ZEND_NULL_HANDLER,
! 30544: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER,
! 30545: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER,
! 30546: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER,
! 30547: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER,
! 30548: ZEND_NULL_HANDLER,
! 30549: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER,
! 30550: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER,
! 30551: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER,
! 30552: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER,
! 30553: ZEND_NULL_HANDLER,
! 30554: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER,
! 30555: ZEND_NULL_HANDLER,
! 30556: ZEND_NULL_HANDLER,
! 30557: ZEND_NULL_HANDLER,
! 30558: ZEND_NULL_HANDLER,
! 30559: ZEND_NULL_HANDLER,
! 30560: ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST_HANDLER,
! 30561: ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER,
! 30562: ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER,
! 30563: ZEND_NULL_HANDLER,
! 30564: ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER,
! 30565: ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
! 30566: ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER,
! 30567: ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER,
! 30568: ZEND_NULL_HANDLER,
! 30569: ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER,
! 30570: ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER,
! 30571: ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER,
! 30572: ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER,
! 30573: ZEND_NULL_HANDLER,
! 30574: ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER,
! 30575: ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER,
! 30576: ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER,
! 30577: ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER,
! 30578: ZEND_NULL_HANDLER,
! 30579: ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER,
! 30580: ZEND_NULL_HANDLER,
! 30581: ZEND_NULL_HANDLER,
! 30582: ZEND_NULL_HANDLER,
! 30583: ZEND_NULL_HANDLER,
! 30584: ZEND_NULL_HANDLER,
! 30585: ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER,
! 30586: ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER,
! 30587: ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER,
! 30588: ZEND_NULL_HANDLER,
! 30589: ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
! 30590: ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
! 30591: ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER,
! 30592: ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER,
! 30593: ZEND_NULL_HANDLER,
! 30594: ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER,
! 30595: ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER,
! 30596: ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER,
! 30597: ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER,
! 30598: ZEND_NULL_HANDLER,
! 30599: ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER,
! 30600: ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER,
! 30601: ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER,
! 30602: ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER,
! 30603: ZEND_NULL_HANDLER,
! 30604: ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER,
! 30605: ZEND_NULL_HANDLER,
! 30606: ZEND_NULL_HANDLER,
! 30607: ZEND_NULL_HANDLER,
! 30608: ZEND_NULL_HANDLER,
! 30609: ZEND_NULL_HANDLER,
! 30610: ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER,
! 30611: ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER,
! 30612: ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER,
! 30613: ZEND_NULL_HANDLER,
! 30614: ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER,
! 30615: ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
! 30616: ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER,
! 30617: ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER,
! 30618: ZEND_NULL_HANDLER,
! 30619: ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER,
! 30620: ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER,
! 30621: ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER,
! 30622: ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER,
! 30623: ZEND_NULL_HANDLER,
! 30624: ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER,
! 30625: ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER,
! 30626: ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER,
! 30627: ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER,
! 30628: ZEND_NULL_HANDLER,
! 30629: ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER,
! 30630: ZEND_NULL_HANDLER,
! 30631: ZEND_NULL_HANDLER,
! 30632: ZEND_NULL_HANDLER,
! 30633: ZEND_NULL_HANDLER,
! 30634: ZEND_NULL_HANDLER,
! 30635: ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER,
! 30636: ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER,
! 30637: ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER,
! 30638: ZEND_NULL_HANDLER,
! 30639: ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER,
! 30640: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
! 30641: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER,
! 30642: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER,
! 30643: ZEND_NULL_HANDLER,
! 30644: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER,
! 30645: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER,
! 30646: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER,
! 30647: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER,
! 30648: ZEND_NULL_HANDLER,
! 30649: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER,
! 30650: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER,
! 30651: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER,
! 30652: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER,
! 30653: ZEND_NULL_HANDLER,
! 30654: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER,
! 30655: ZEND_NULL_HANDLER,
! 30656: ZEND_NULL_HANDLER,
! 30657: ZEND_NULL_HANDLER,
! 30658: ZEND_NULL_HANDLER,
! 30659: ZEND_NULL_HANDLER,
! 30660: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER,
! 30661: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER,
! 30662: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER,
! 30663: ZEND_NULL_HANDLER,
! 30664: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER,
! 30665: ZEND_CAST_SPEC_CONST_HANDLER,
! 30666: ZEND_CAST_SPEC_CONST_HANDLER,
! 30667: ZEND_CAST_SPEC_CONST_HANDLER,
! 30668: ZEND_CAST_SPEC_CONST_HANDLER,
! 30669: ZEND_CAST_SPEC_CONST_HANDLER,
! 30670: ZEND_CAST_SPEC_TMP_HANDLER,
! 30671: ZEND_CAST_SPEC_TMP_HANDLER,
! 30672: ZEND_CAST_SPEC_TMP_HANDLER,
! 30673: ZEND_CAST_SPEC_TMP_HANDLER,
! 30674: ZEND_CAST_SPEC_TMP_HANDLER,
! 30675: ZEND_CAST_SPEC_VAR_HANDLER,
! 30676: ZEND_CAST_SPEC_VAR_HANDLER,
! 30677: ZEND_CAST_SPEC_VAR_HANDLER,
! 30678: ZEND_CAST_SPEC_VAR_HANDLER,
! 30679: ZEND_CAST_SPEC_VAR_HANDLER,
! 30680: ZEND_NULL_HANDLER,
! 30681: ZEND_NULL_HANDLER,
! 30682: ZEND_NULL_HANDLER,
! 30683: ZEND_NULL_HANDLER,
! 30684: ZEND_NULL_HANDLER,
! 30685: ZEND_CAST_SPEC_CV_HANDLER,
! 30686: ZEND_CAST_SPEC_CV_HANDLER,
! 30687: ZEND_CAST_SPEC_CV_HANDLER,
! 30688: ZEND_CAST_SPEC_CV_HANDLER,
! 30689: ZEND_CAST_SPEC_CV_HANDLER,
! 30690: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
! 30691: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
! 30692: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
! 30693: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
! 30694: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
! 30695: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
! 30696: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
! 30697: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
! 30698: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
! 30699: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
! 30700: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
! 30701: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
! 30702: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
! 30703: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
! 30704: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
! 30705: ZEND_NULL_HANDLER,
! 30706: ZEND_NULL_HANDLER,
! 30707: ZEND_NULL_HANDLER,
! 30708: ZEND_NULL_HANDLER,
! 30709: ZEND_NULL_HANDLER,
! 30710: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
! 30711: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
! 30712: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
! 30713: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
! 30714: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
! 30715: ZEND_NULL_HANDLER,
! 30716: ZEND_NULL_HANDLER,
! 30717: ZEND_NULL_HANDLER,
! 30718: ZEND_NULL_HANDLER,
! 30719: ZEND_NULL_HANDLER,
! 30720: ZEND_NULL_HANDLER,
! 30721: ZEND_NULL_HANDLER,
! 30722: ZEND_NULL_HANDLER,
! 30723: ZEND_NULL_HANDLER,
! 30724: ZEND_NULL_HANDLER,
! 30725: ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER,
! 30726: ZEND_ASSIGN_ADD_SPEC_VAR_TMP_HANDLER,
! 30727: ZEND_ASSIGN_ADD_SPEC_VAR_VAR_HANDLER,
! 30728: ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_HANDLER,
! 30729: ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER,
! 30730: ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_HANDLER,
! 30731: ZEND_ASSIGN_ADD_SPEC_UNUSED_TMP_HANDLER,
! 30732: ZEND_ASSIGN_ADD_SPEC_UNUSED_VAR_HANDLER,
! 30733: ZEND_ASSIGN_ADD_SPEC_UNUSED_UNUSED_HANDLER,
! 30734: ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_HANDLER,
! 30735: ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER,
! 30736: ZEND_ASSIGN_ADD_SPEC_CV_TMP_HANDLER,
! 30737: ZEND_ASSIGN_ADD_SPEC_CV_VAR_HANDLER,
! 30738: ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_HANDLER,
! 30739: ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER,
! 30740: ZEND_NULL_HANDLER,
! 30741: ZEND_NULL_HANDLER,
! 30742: ZEND_NULL_HANDLER,
! 30743: ZEND_NULL_HANDLER,
! 30744: ZEND_NULL_HANDLER,
! 30745: ZEND_NULL_HANDLER,
! 30746: ZEND_NULL_HANDLER,
! 30747: ZEND_NULL_HANDLER,
! 30748: ZEND_NULL_HANDLER,
! 30749: ZEND_NULL_HANDLER,
! 30750: ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER,
! 30751: ZEND_ASSIGN_SUB_SPEC_VAR_TMP_HANDLER,
! 30752: ZEND_ASSIGN_SUB_SPEC_VAR_VAR_HANDLER,
! 30753: ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_HANDLER,
! 30754: ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER,
! 30755: ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_HANDLER,
! 30756: ZEND_ASSIGN_SUB_SPEC_UNUSED_TMP_HANDLER,
! 30757: ZEND_ASSIGN_SUB_SPEC_UNUSED_VAR_HANDLER,
! 30758: ZEND_ASSIGN_SUB_SPEC_UNUSED_UNUSED_HANDLER,
! 30759: ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_HANDLER,
! 30760: ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER,
! 30761: ZEND_ASSIGN_SUB_SPEC_CV_TMP_HANDLER,
! 30762: ZEND_ASSIGN_SUB_SPEC_CV_VAR_HANDLER,
! 30763: ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_HANDLER,
! 30764: ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER,
! 30765: ZEND_NULL_HANDLER,
! 30766: ZEND_NULL_HANDLER,
! 30767: ZEND_NULL_HANDLER,
! 30768: ZEND_NULL_HANDLER,
! 30769: ZEND_NULL_HANDLER,
! 30770: ZEND_NULL_HANDLER,
! 30771: ZEND_NULL_HANDLER,
! 30772: ZEND_NULL_HANDLER,
! 30773: ZEND_NULL_HANDLER,
! 30774: ZEND_NULL_HANDLER,
! 30775: ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER,
! 30776: ZEND_ASSIGN_MUL_SPEC_VAR_TMP_HANDLER,
! 30777: ZEND_ASSIGN_MUL_SPEC_VAR_VAR_HANDLER,
! 30778: ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_HANDLER,
! 30779: ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER,
! 30780: ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_HANDLER,
! 30781: ZEND_ASSIGN_MUL_SPEC_UNUSED_TMP_HANDLER,
! 30782: ZEND_ASSIGN_MUL_SPEC_UNUSED_VAR_HANDLER,
! 30783: ZEND_ASSIGN_MUL_SPEC_UNUSED_UNUSED_HANDLER,
! 30784: ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_HANDLER,
! 30785: ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER,
! 30786: ZEND_ASSIGN_MUL_SPEC_CV_TMP_HANDLER,
! 30787: ZEND_ASSIGN_MUL_SPEC_CV_VAR_HANDLER,
! 30788: ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_HANDLER,
! 30789: ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER,
! 30790: ZEND_NULL_HANDLER,
! 30791: ZEND_NULL_HANDLER,
! 30792: ZEND_NULL_HANDLER,
! 30793: ZEND_NULL_HANDLER,
! 30794: ZEND_NULL_HANDLER,
! 30795: ZEND_NULL_HANDLER,
! 30796: ZEND_NULL_HANDLER,
! 30797: ZEND_NULL_HANDLER,
! 30798: ZEND_NULL_HANDLER,
! 30799: ZEND_NULL_HANDLER,
! 30800: ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER,
! 30801: ZEND_ASSIGN_DIV_SPEC_VAR_TMP_HANDLER,
! 30802: ZEND_ASSIGN_DIV_SPEC_VAR_VAR_HANDLER,
! 30803: ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_HANDLER,
! 30804: ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER,
! 30805: ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_HANDLER,
! 30806: ZEND_ASSIGN_DIV_SPEC_UNUSED_TMP_HANDLER,
! 30807: ZEND_ASSIGN_DIV_SPEC_UNUSED_VAR_HANDLER,
! 30808: ZEND_ASSIGN_DIV_SPEC_UNUSED_UNUSED_HANDLER,
! 30809: ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_HANDLER,
! 30810: ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER,
! 30811: ZEND_ASSIGN_DIV_SPEC_CV_TMP_HANDLER,
! 30812: ZEND_ASSIGN_DIV_SPEC_CV_VAR_HANDLER,
! 30813: ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_HANDLER,
! 30814: ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER,
! 30815: ZEND_NULL_HANDLER,
! 30816: ZEND_NULL_HANDLER,
! 30817: ZEND_NULL_HANDLER,
! 30818: ZEND_NULL_HANDLER,
! 30819: ZEND_NULL_HANDLER,
! 30820: ZEND_NULL_HANDLER,
! 30821: ZEND_NULL_HANDLER,
! 30822: ZEND_NULL_HANDLER,
! 30823: ZEND_NULL_HANDLER,
! 30824: ZEND_NULL_HANDLER,
! 30825: ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER,
! 30826: ZEND_ASSIGN_MOD_SPEC_VAR_TMP_HANDLER,
! 30827: ZEND_ASSIGN_MOD_SPEC_VAR_VAR_HANDLER,
! 30828: ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_HANDLER,
! 30829: ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER,
! 30830: ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_HANDLER,
! 30831: ZEND_ASSIGN_MOD_SPEC_UNUSED_TMP_HANDLER,
! 30832: ZEND_ASSIGN_MOD_SPEC_UNUSED_VAR_HANDLER,
! 30833: ZEND_ASSIGN_MOD_SPEC_UNUSED_UNUSED_HANDLER,
! 30834: ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_HANDLER,
! 30835: ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER,
! 30836: ZEND_ASSIGN_MOD_SPEC_CV_TMP_HANDLER,
! 30837: ZEND_ASSIGN_MOD_SPEC_CV_VAR_HANDLER,
! 30838: ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_HANDLER,
! 30839: ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER,
! 30840: ZEND_NULL_HANDLER,
! 30841: ZEND_NULL_HANDLER,
! 30842: ZEND_NULL_HANDLER,
! 30843: ZEND_NULL_HANDLER,
! 30844: ZEND_NULL_HANDLER,
! 30845: ZEND_NULL_HANDLER,
! 30846: ZEND_NULL_HANDLER,
! 30847: ZEND_NULL_HANDLER,
! 30848: ZEND_NULL_HANDLER,
! 30849: ZEND_NULL_HANDLER,
! 30850: ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER,
! 30851: ZEND_ASSIGN_SL_SPEC_VAR_TMP_HANDLER,
! 30852: ZEND_ASSIGN_SL_SPEC_VAR_VAR_HANDLER,
! 30853: ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_HANDLER,
! 30854: ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER,
! 30855: ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_HANDLER,
! 30856: ZEND_ASSIGN_SL_SPEC_UNUSED_TMP_HANDLER,
! 30857: ZEND_ASSIGN_SL_SPEC_UNUSED_VAR_HANDLER,
! 30858: ZEND_ASSIGN_SL_SPEC_UNUSED_UNUSED_HANDLER,
! 30859: ZEND_ASSIGN_SL_SPEC_UNUSED_CV_HANDLER,
! 30860: ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER,
! 30861: ZEND_ASSIGN_SL_SPEC_CV_TMP_HANDLER,
! 30862: ZEND_ASSIGN_SL_SPEC_CV_VAR_HANDLER,
! 30863: ZEND_ASSIGN_SL_SPEC_CV_UNUSED_HANDLER,
! 30864: ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER,
! 30865: ZEND_NULL_HANDLER,
! 30866: ZEND_NULL_HANDLER,
! 30867: ZEND_NULL_HANDLER,
! 30868: ZEND_NULL_HANDLER,
! 30869: ZEND_NULL_HANDLER,
! 30870: ZEND_NULL_HANDLER,
! 30871: ZEND_NULL_HANDLER,
! 30872: ZEND_NULL_HANDLER,
! 30873: ZEND_NULL_HANDLER,
! 30874: ZEND_NULL_HANDLER,
! 30875: ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER,
! 30876: ZEND_ASSIGN_SR_SPEC_VAR_TMP_HANDLER,
! 30877: ZEND_ASSIGN_SR_SPEC_VAR_VAR_HANDLER,
! 30878: ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_HANDLER,
! 30879: ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER,
! 30880: ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_HANDLER,
! 30881: ZEND_ASSIGN_SR_SPEC_UNUSED_TMP_HANDLER,
! 30882: ZEND_ASSIGN_SR_SPEC_UNUSED_VAR_HANDLER,
! 30883: ZEND_ASSIGN_SR_SPEC_UNUSED_UNUSED_HANDLER,
! 30884: ZEND_ASSIGN_SR_SPEC_UNUSED_CV_HANDLER,
! 30885: ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER,
! 30886: ZEND_ASSIGN_SR_SPEC_CV_TMP_HANDLER,
! 30887: ZEND_ASSIGN_SR_SPEC_CV_VAR_HANDLER,
! 30888: ZEND_ASSIGN_SR_SPEC_CV_UNUSED_HANDLER,
! 30889: ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER,
! 30890: ZEND_NULL_HANDLER,
! 30891: ZEND_NULL_HANDLER,
! 30892: ZEND_NULL_HANDLER,
! 30893: ZEND_NULL_HANDLER,
! 30894: ZEND_NULL_HANDLER,
! 30895: ZEND_NULL_HANDLER,
! 30896: ZEND_NULL_HANDLER,
! 30897: ZEND_NULL_HANDLER,
! 30898: ZEND_NULL_HANDLER,
! 30899: ZEND_NULL_HANDLER,
! 30900: ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER,
! 30901: ZEND_ASSIGN_CONCAT_SPEC_VAR_TMP_HANDLER,
! 30902: ZEND_ASSIGN_CONCAT_SPEC_VAR_VAR_HANDLER,
! 30903: ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_HANDLER,
! 30904: ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER,
! 30905: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_HANDLER,
! 30906: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMP_HANDLER,
! 30907: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_VAR_HANDLER,
! 30908: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_UNUSED_HANDLER,
! 30909: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_HANDLER,
! 30910: ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER,
! 30911: ZEND_ASSIGN_CONCAT_SPEC_CV_TMP_HANDLER,
! 30912: ZEND_ASSIGN_CONCAT_SPEC_CV_VAR_HANDLER,
! 30913: ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_HANDLER,
! 30914: ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER,
! 30915: ZEND_NULL_HANDLER,
! 30916: ZEND_NULL_HANDLER,
! 30917: ZEND_NULL_HANDLER,
! 30918: ZEND_NULL_HANDLER,
! 30919: ZEND_NULL_HANDLER,
! 30920: ZEND_NULL_HANDLER,
! 30921: ZEND_NULL_HANDLER,
! 30922: ZEND_NULL_HANDLER,
! 30923: ZEND_NULL_HANDLER,
! 30924: ZEND_NULL_HANDLER,
! 30925: ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER,
! 30926: ZEND_ASSIGN_BW_OR_SPEC_VAR_TMP_HANDLER,
! 30927: ZEND_ASSIGN_BW_OR_SPEC_VAR_VAR_HANDLER,
! 30928: ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_HANDLER,
! 30929: ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER,
! 30930: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_HANDLER,
! 30931: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMP_HANDLER,
! 30932: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_VAR_HANDLER,
! 30933: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_UNUSED_HANDLER,
! 30934: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_HANDLER,
! 30935: ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER,
! 30936: ZEND_ASSIGN_BW_OR_SPEC_CV_TMP_HANDLER,
! 30937: ZEND_ASSIGN_BW_OR_SPEC_CV_VAR_HANDLER,
! 30938: ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_HANDLER,
! 30939: ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER,
! 30940: ZEND_NULL_HANDLER,
! 30941: ZEND_NULL_HANDLER,
! 30942: ZEND_NULL_HANDLER,
! 30943: ZEND_NULL_HANDLER,
! 30944: ZEND_NULL_HANDLER,
! 30945: ZEND_NULL_HANDLER,
! 30946: ZEND_NULL_HANDLER,
! 30947: ZEND_NULL_HANDLER,
! 30948: ZEND_NULL_HANDLER,
! 30949: ZEND_NULL_HANDLER,
! 30950: ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER,
! 30951: ZEND_ASSIGN_BW_AND_SPEC_VAR_TMP_HANDLER,
! 30952: ZEND_ASSIGN_BW_AND_SPEC_VAR_VAR_HANDLER,
! 30953: ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_HANDLER,
! 30954: ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER,
! 30955: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_HANDLER,
! 30956: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMP_HANDLER,
! 30957: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_VAR_HANDLER,
! 30958: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_UNUSED_HANDLER,
! 30959: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_HANDLER,
! 30960: ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER,
! 30961: ZEND_ASSIGN_BW_AND_SPEC_CV_TMP_HANDLER,
! 30962: ZEND_ASSIGN_BW_AND_SPEC_CV_VAR_HANDLER,
! 30963: ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_HANDLER,
! 30964: ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER,
! 30965: ZEND_NULL_HANDLER,
! 30966: ZEND_NULL_HANDLER,
! 30967: ZEND_NULL_HANDLER,
! 30968: ZEND_NULL_HANDLER,
! 30969: ZEND_NULL_HANDLER,
! 30970: ZEND_NULL_HANDLER,
! 30971: ZEND_NULL_HANDLER,
! 30972: ZEND_NULL_HANDLER,
! 30973: ZEND_NULL_HANDLER,
! 30974: ZEND_NULL_HANDLER,
! 30975: ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER,
! 30976: ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMP_HANDLER,
! 30977: ZEND_ASSIGN_BW_XOR_SPEC_VAR_VAR_HANDLER,
! 30978: ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_HANDLER,
! 30979: ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER,
! 30980: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_HANDLER,
! 30981: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMP_HANDLER,
! 30982: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_VAR_HANDLER,
! 30983: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER,
! 30984: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_HANDLER,
! 30985: ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER,
! 30986: ZEND_ASSIGN_BW_XOR_SPEC_CV_TMP_HANDLER,
! 30987: ZEND_ASSIGN_BW_XOR_SPEC_CV_VAR_HANDLER,
! 30988: ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_HANDLER,
! 30989: ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER,
! 30990: ZEND_NULL_HANDLER,
! 30991: ZEND_NULL_HANDLER,
! 30992: ZEND_NULL_HANDLER,
! 30993: ZEND_NULL_HANDLER,
! 30994: ZEND_NULL_HANDLER,
! 30995: ZEND_NULL_HANDLER,
! 30996: ZEND_NULL_HANDLER,
! 30997: ZEND_NULL_HANDLER,
! 30998: ZEND_NULL_HANDLER,
! 30999: ZEND_NULL_HANDLER,
! 31000: ZEND_PRE_INC_SPEC_VAR_HANDLER,
! 31001: ZEND_PRE_INC_SPEC_VAR_HANDLER,
! 31002: ZEND_PRE_INC_SPEC_VAR_HANDLER,
! 31003: ZEND_PRE_INC_SPEC_VAR_HANDLER,
! 31004: ZEND_PRE_INC_SPEC_VAR_HANDLER,
! 31005: ZEND_NULL_HANDLER,
! 31006: ZEND_NULL_HANDLER,
! 31007: ZEND_NULL_HANDLER,
! 31008: ZEND_NULL_HANDLER,
! 31009: ZEND_NULL_HANDLER,
! 31010: ZEND_PRE_INC_SPEC_CV_HANDLER,
! 31011: ZEND_PRE_INC_SPEC_CV_HANDLER,
! 31012: ZEND_PRE_INC_SPEC_CV_HANDLER,
! 31013: ZEND_PRE_INC_SPEC_CV_HANDLER,
! 31014: ZEND_PRE_INC_SPEC_CV_HANDLER,
! 31015: ZEND_NULL_HANDLER,
! 31016: ZEND_NULL_HANDLER,
! 31017: ZEND_NULL_HANDLER,
! 31018: ZEND_NULL_HANDLER,
! 31019: ZEND_NULL_HANDLER,
! 31020: ZEND_NULL_HANDLER,
! 31021: ZEND_NULL_HANDLER,
! 31022: ZEND_NULL_HANDLER,
! 31023: ZEND_NULL_HANDLER,
! 31024: ZEND_NULL_HANDLER,
! 31025: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
! 31026: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
! 31027: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
! 31028: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
! 31029: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
! 31030: ZEND_NULL_HANDLER,
! 31031: ZEND_NULL_HANDLER,
! 31032: ZEND_NULL_HANDLER,
! 31033: ZEND_NULL_HANDLER,
! 31034: ZEND_NULL_HANDLER,
! 31035: ZEND_PRE_DEC_SPEC_CV_HANDLER,
! 31036: ZEND_PRE_DEC_SPEC_CV_HANDLER,
! 31037: ZEND_PRE_DEC_SPEC_CV_HANDLER,
! 31038: ZEND_PRE_DEC_SPEC_CV_HANDLER,
! 31039: ZEND_PRE_DEC_SPEC_CV_HANDLER,
! 31040: ZEND_NULL_HANDLER,
! 31041: ZEND_NULL_HANDLER,
! 31042: ZEND_NULL_HANDLER,
! 31043: ZEND_NULL_HANDLER,
! 31044: ZEND_NULL_HANDLER,
! 31045: ZEND_NULL_HANDLER,
! 31046: ZEND_NULL_HANDLER,
! 31047: ZEND_NULL_HANDLER,
! 31048: ZEND_NULL_HANDLER,
! 31049: ZEND_NULL_HANDLER,
! 31050: ZEND_POST_INC_SPEC_VAR_HANDLER,
! 31051: ZEND_POST_INC_SPEC_VAR_HANDLER,
! 31052: ZEND_POST_INC_SPEC_VAR_HANDLER,
! 31053: ZEND_POST_INC_SPEC_VAR_HANDLER,
! 31054: ZEND_POST_INC_SPEC_VAR_HANDLER,
! 31055: ZEND_NULL_HANDLER,
! 31056: ZEND_NULL_HANDLER,
! 31057: ZEND_NULL_HANDLER,
! 31058: ZEND_NULL_HANDLER,
! 31059: ZEND_NULL_HANDLER,
! 31060: ZEND_POST_INC_SPEC_CV_HANDLER,
! 31061: ZEND_POST_INC_SPEC_CV_HANDLER,
! 31062: ZEND_POST_INC_SPEC_CV_HANDLER,
! 31063: ZEND_POST_INC_SPEC_CV_HANDLER,
! 31064: ZEND_POST_INC_SPEC_CV_HANDLER,
! 31065: ZEND_NULL_HANDLER,
! 31066: ZEND_NULL_HANDLER,
! 31067: ZEND_NULL_HANDLER,
! 31068: ZEND_NULL_HANDLER,
! 31069: ZEND_NULL_HANDLER,
! 31070: ZEND_NULL_HANDLER,
! 31071: ZEND_NULL_HANDLER,
! 31072: ZEND_NULL_HANDLER,
! 31073: ZEND_NULL_HANDLER,
! 31074: ZEND_NULL_HANDLER,
! 31075: ZEND_POST_DEC_SPEC_VAR_HANDLER,
! 31076: ZEND_POST_DEC_SPEC_VAR_HANDLER,
! 31077: ZEND_POST_DEC_SPEC_VAR_HANDLER,
! 31078: ZEND_POST_DEC_SPEC_VAR_HANDLER,
! 31079: ZEND_POST_DEC_SPEC_VAR_HANDLER,
! 31080: ZEND_NULL_HANDLER,
! 31081: ZEND_NULL_HANDLER,
! 31082: ZEND_NULL_HANDLER,
! 31083: ZEND_NULL_HANDLER,
! 31084: ZEND_NULL_HANDLER,
! 31085: ZEND_POST_DEC_SPEC_CV_HANDLER,
! 31086: ZEND_POST_DEC_SPEC_CV_HANDLER,
! 31087: ZEND_POST_DEC_SPEC_CV_HANDLER,
! 31088: ZEND_POST_DEC_SPEC_CV_HANDLER,
! 31089: ZEND_POST_DEC_SPEC_CV_HANDLER,
! 31090: ZEND_NULL_HANDLER,
! 31091: ZEND_NULL_HANDLER,
! 31092: ZEND_NULL_HANDLER,
! 31093: ZEND_NULL_HANDLER,
! 31094: ZEND_NULL_HANDLER,
! 31095: ZEND_NULL_HANDLER,
! 31096: ZEND_NULL_HANDLER,
! 31097: ZEND_NULL_HANDLER,
! 31098: ZEND_NULL_HANDLER,
! 31099: ZEND_NULL_HANDLER,
! 31100: ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER,
! 31101: ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER,
! 31102: ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER,
! 31103: ZEND_NULL_HANDLER,
! 31104: ZEND_ASSIGN_SPEC_VAR_CV_HANDLER,
! 31105: ZEND_NULL_HANDLER,
! 31106: ZEND_NULL_HANDLER,
! 31107: ZEND_NULL_HANDLER,
! 31108: ZEND_NULL_HANDLER,
! 31109: ZEND_NULL_HANDLER,
! 31110: ZEND_ASSIGN_SPEC_CV_CONST_HANDLER,
! 31111: ZEND_ASSIGN_SPEC_CV_TMP_HANDLER,
! 31112: ZEND_ASSIGN_SPEC_CV_VAR_HANDLER,
! 31113: ZEND_NULL_HANDLER,
! 31114: ZEND_ASSIGN_SPEC_CV_CV_HANDLER,
! 31115: ZEND_NULL_HANDLER,
! 31116: ZEND_NULL_HANDLER,
! 31117: ZEND_NULL_HANDLER,
! 31118: ZEND_NULL_HANDLER,
! 31119: ZEND_NULL_HANDLER,
! 31120: ZEND_NULL_HANDLER,
! 31121: ZEND_NULL_HANDLER,
! 31122: ZEND_NULL_HANDLER,
! 31123: ZEND_NULL_HANDLER,
! 31124: ZEND_NULL_HANDLER,
! 31125: ZEND_NULL_HANDLER,
! 31126: ZEND_NULL_HANDLER,
! 31127: ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER,
! 31128: ZEND_NULL_HANDLER,
! 31129: ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER,
! 31130: ZEND_NULL_HANDLER,
! 31131: ZEND_NULL_HANDLER,
! 31132: ZEND_NULL_HANDLER,
! 31133: ZEND_NULL_HANDLER,
! 31134: ZEND_NULL_HANDLER,
! 31135: ZEND_NULL_HANDLER,
! 31136: ZEND_NULL_HANDLER,
! 31137: ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER,
! 31138: ZEND_NULL_HANDLER,
! 31139: ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER,
! 31140: ZEND_ECHO_SPEC_CONST_HANDLER,
! 31141: ZEND_ECHO_SPEC_CONST_HANDLER,
! 31142: ZEND_ECHO_SPEC_CONST_HANDLER,
! 31143: ZEND_ECHO_SPEC_CONST_HANDLER,
! 31144: ZEND_ECHO_SPEC_CONST_HANDLER,
! 31145: ZEND_ECHO_SPEC_TMP_HANDLER,
! 31146: ZEND_ECHO_SPEC_TMP_HANDLER,
! 31147: ZEND_ECHO_SPEC_TMP_HANDLER,
! 31148: ZEND_ECHO_SPEC_TMP_HANDLER,
! 31149: ZEND_ECHO_SPEC_TMP_HANDLER,
! 31150: ZEND_ECHO_SPEC_VAR_HANDLER,
! 31151: ZEND_ECHO_SPEC_VAR_HANDLER,
! 31152: ZEND_ECHO_SPEC_VAR_HANDLER,
! 31153: ZEND_ECHO_SPEC_VAR_HANDLER,
! 31154: ZEND_ECHO_SPEC_VAR_HANDLER,
! 31155: ZEND_NULL_HANDLER,
! 31156: ZEND_NULL_HANDLER,
! 31157: ZEND_NULL_HANDLER,
! 31158: ZEND_NULL_HANDLER,
! 31159: ZEND_NULL_HANDLER,
! 31160: ZEND_ECHO_SPEC_CV_HANDLER,
! 31161: ZEND_ECHO_SPEC_CV_HANDLER,
! 31162: ZEND_ECHO_SPEC_CV_HANDLER,
! 31163: ZEND_ECHO_SPEC_CV_HANDLER,
! 31164: ZEND_ECHO_SPEC_CV_HANDLER,
! 31165: ZEND_PRINT_SPEC_CONST_HANDLER,
! 31166: ZEND_PRINT_SPEC_CONST_HANDLER,
! 31167: ZEND_PRINT_SPEC_CONST_HANDLER,
! 31168: ZEND_PRINT_SPEC_CONST_HANDLER,
! 31169: ZEND_PRINT_SPEC_CONST_HANDLER,
! 31170: ZEND_PRINT_SPEC_TMP_HANDLER,
! 31171: ZEND_PRINT_SPEC_TMP_HANDLER,
! 31172: ZEND_PRINT_SPEC_TMP_HANDLER,
! 31173: ZEND_PRINT_SPEC_TMP_HANDLER,
! 31174: ZEND_PRINT_SPEC_TMP_HANDLER,
! 31175: ZEND_PRINT_SPEC_VAR_HANDLER,
! 31176: ZEND_PRINT_SPEC_VAR_HANDLER,
! 31177: ZEND_PRINT_SPEC_VAR_HANDLER,
! 31178: ZEND_PRINT_SPEC_VAR_HANDLER,
! 31179: ZEND_PRINT_SPEC_VAR_HANDLER,
! 31180: ZEND_NULL_HANDLER,
! 31181: ZEND_NULL_HANDLER,
! 31182: ZEND_NULL_HANDLER,
! 31183: ZEND_NULL_HANDLER,
! 31184: ZEND_NULL_HANDLER,
! 31185: ZEND_PRINT_SPEC_CV_HANDLER,
! 31186: ZEND_PRINT_SPEC_CV_HANDLER,
! 31187: ZEND_PRINT_SPEC_CV_HANDLER,
! 31188: ZEND_PRINT_SPEC_CV_HANDLER,
! 31189: ZEND_PRINT_SPEC_CV_HANDLER,
! 31190: ZEND_JMP_SPEC_HANDLER,
! 31191: ZEND_JMP_SPEC_HANDLER,
! 31192: ZEND_JMP_SPEC_HANDLER,
! 31193: ZEND_JMP_SPEC_HANDLER,
! 31194: ZEND_JMP_SPEC_HANDLER,
! 31195: ZEND_JMP_SPEC_HANDLER,
! 31196: ZEND_JMP_SPEC_HANDLER,
! 31197: ZEND_JMP_SPEC_HANDLER,
! 31198: ZEND_JMP_SPEC_HANDLER,
! 31199: ZEND_JMP_SPEC_HANDLER,
! 31200: ZEND_JMP_SPEC_HANDLER,
! 31201: ZEND_JMP_SPEC_HANDLER,
! 31202: ZEND_JMP_SPEC_HANDLER,
! 31203: ZEND_JMP_SPEC_HANDLER,
! 31204: ZEND_JMP_SPEC_HANDLER,
! 31205: ZEND_JMP_SPEC_HANDLER,
! 31206: ZEND_JMP_SPEC_HANDLER,
! 31207: ZEND_JMP_SPEC_HANDLER,
! 31208: ZEND_JMP_SPEC_HANDLER,
! 31209: ZEND_JMP_SPEC_HANDLER,
! 31210: ZEND_JMP_SPEC_HANDLER,
! 31211: ZEND_JMP_SPEC_HANDLER,
! 31212: ZEND_JMP_SPEC_HANDLER,
! 31213: ZEND_JMP_SPEC_HANDLER,
! 31214: ZEND_JMP_SPEC_HANDLER,
! 31215: ZEND_JMPZ_SPEC_CONST_HANDLER,
! 31216: ZEND_JMPZ_SPEC_CONST_HANDLER,
! 31217: ZEND_JMPZ_SPEC_CONST_HANDLER,
! 31218: ZEND_JMPZ_SPEC_CONST_HANDLER,
! 31219: ZEND_JMPZ_SPEC_CONST_HANDLER,
! 31220: ZEND_JMPZ_SPEC_TMP_HANDLER,
! 31221: ZEND_JMPZ_SPEC_TMP_HANDLER,
! 31222: ZEND_JMPZ_SPEC_TMP_HANDLER,
! 31223: ZEND_JMPZ_SPEC_TMP_HANDLER,
! 31224: ZEND_JMPZ_SPEC_TMP_HANDLER,
! 31225: ZEND_JMPZ_SPEC_VAR_HANDLER,
! 31226: ZEND_JMPZ_SPEC_VAR_HANDLER,
! 31227: ZEND_JMPZ_SPEC_VAR_HANDLER,
! 31228: ZEND_JMPZ_SPEC_VAR_HANDLER,
! 31229: ZEND_JMPZ_SPEC_VAR_HANDLER,
! 31230: ZEND_NULL_HANDLER,
! 31231: ZEND_NULL_HANDLER,
! 31232: ZEND_NULL_HANDLER,
! 31233: ZEND_NULL_HANDLER,
! 31234: ZEND_NULL_HANDLER,
! 31235: ZEND_JMPZ_SPEC_CV_HANDLER,
! 31236: ZEND_JMPZ_SPEC_CV_HANDLER,
! 31237: ZEND_JMPZ_SPEC_CV_HANDLER,
! 31238: ZEND_JMPZ_SPEC_CV_HANDLER,
! 31239: ZEND_JMPZ_SPEC_CV_HANDLER,
! 31240: ZEND_JMPNZ_SPEC_CONST_HANDLER,
! 31241: ZEND_JMPNZ_SPEC_CONST_HANDLER,
! 31242: ZEND_JMPNZ_SPEC_CONST_HANDLER,
! 31243: ZEND_JMPNZ_SPEC_CONST_HANDLER,
! 31244: ZEND_JMPNZ_SPEC_CONST_HANDLER,
! 31245: ZEND_JMPNZ_SPEC_TMP_HANDLER,
! 31246: ZEND_JMPNZ_SPEC_TMP_HANDLER,
! 31247: ZEND_JMPNZ_SPEC_TMP_HANDLER,
! 31248: ZEND_JMPNZ_SPEC_TMP_HANDLER,
! 31249: ZEND_JMPNZ_SPEC_TMP_HANDLER,
! 31250: ZEND_JMPNZ_SPEC_VAR_HANDLER,
! 31251: ZEND_JMPNZ_SPEC_VAR_HANDLER,
! 31252: ZEND_JMPNZ_SPEC_VAR_HANDLER,
! 31253: ZEND_JMPNZ_SPEC_VAR_HANDLER,
! 31254: ZEND_JMPNZ_SPEC_VAR_HANDLER,
! 31255: ZEND_NULL_HANDLER,
! 31256: ZEND_NULL_HANDLER,
! 31257: ZEND_NULL_HANDLER,
! 31258: ZEND_NULL_HANDLER,
! 31259: ZEND_NULL_HANDLER,
! 31260: ZEND_JMPNZ_SPEC_CV_HANDLER,
! 31261: ZEND_JMPNZ_SPEC_CV_HANDLER,
! 31262: ZEND_JMPNZ_SPEC_CV_HANDLER,
! 31263: ZEND_JMPNZ_SPEC_CV_HANDLER,
! 31264: ZEND_JMPNZ_SPEC_CV_HANDLER,
! 31265: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
! 31266: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
! 31267: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
! 31268: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
! 31269: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
! 31270: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
! 31271: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
! 31272: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
! 31273: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
! 31274: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
! 31275: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
! 31276: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
! 31277: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
! 31278: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
! 31279: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
! 31280: ZEND_NULL_HANDLER,
! 31281: ZEND_NULL_HANDLER,
! 31282: ZEND_NULL_HANDLER,
! 31283: ZEND_NULL_HANDLER,
! 31284: ZEND_NULL_HANDLER,
! 31285: ZEND_JMPZNZ_SPEC_CV_HANDLER,
! 31286: ZEND_JMPZNZ_SPEC_CV_HANDLER,
! 31287: ZEND_JMPZNZ_SPEC_CV_HANDLER,
! 31288: ZEND_JMPZNZ_SPEC_CV_HANDLER,
! 31289: ZEND_JMPZNZ_SPEC_CV_HANDLER,
! 31290: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
! 31291: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
! 31292: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
! 31293: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
! 31294: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
! 31295: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
! 31296: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
! 31297: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
! 31298: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
! 31299: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
! 31300: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
! 31301: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
! 31302: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
! 31303: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
! 31304: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
! 31305: ZEND_NULL_HANDLER,
! 31306: ZEND_NULL_HANDLER,
! 31307: ZEND_NULL_HANDLER,
! 31308: ZEND_NULL_HANDLER,
! 31309: ZEND_NULL_HANDLER,
! 31310: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
! 31311: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
! 31312: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
! 31313: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
! 31314: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
! 31315: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
! 31316: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
! 31317: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
! 31318: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
! 31319: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
! 31320: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
! 31321: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
! 31322: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
! 31323: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
! 31324: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
! 31325: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
! 31326: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
! 31327: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
! 31328: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
! 31329: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
! 31330: ZEND_NULL_HANDLER,
! 31331: ZEND_NULL_HANDLER,
! 31332: ZEND_NULL_HANDLER,
! 31333: ZEND_NULL_HANDLER,
! 31334: ZEND_NULL_HANDLER,
! 31335: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
! 31336: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
! 31337: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
! 31338: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
! 31339: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
! 31340: ZEND_CASE_SPEC_CONST_CONST_HANDLER,
! 31341: ZEND_CASE_SPEC_CONST_TMP_HANDLER,
! 31342: ZEND_CASE_SPEC_CONST_VAR_HANDLER,
! 31343: ZEND_NULL_HANDLER,
! 31344: ZEND_CASE_SPEC_CONST_CV_HANDLER,
! 31345: ZEND_CASE_SPEC_TMP_CONST_HANDLER,
! 31346: ZEND_CASE_SPEC_TMP_TMP_HANDLER,
! 31347: ZEND_CASE_SPEC_TMP_VAR_HANDLER,
! 31348: ZEND_NULL_HANDLER,
! 31349: ZEND_CASE_SPEC_TMP_CV_HANDLER,
! 31350: ZEND_CASE_SPEC_VAR_CONST_HANDLER,
! 31351: ZEND_CASE_SPEC_VAR_TMP_HANDLER,
! 31352: ZEND_CASE_SPEC_VAR_VAR_HANDLER,
! 31353: ZEND_NULL_HANDLER,
! 31354: ZEND_CASE_SPEC_VAR_CV_HANDLER,
! 31355: ZEND_NULL_HANDLER,
! 31356: ZEND_NULL_HANDLER,
! 31357: ZEND_NULL_HANDLER,
! 31358: ZEND_NULL_HANDLER,
! 31359: ZEND_NULL_HANDLER,
! 31360: ZEND_CASE_SPEC_CV_CONST_HANDLER,
! 31361: ZEND_CASE_SPEC_CV_TMP_HANDLER,
! 31362: ZEND_CASE_SPEC_CV_VAR_HANDLER,
! 31363: ZEND_NULL_HANDLER,
! 31364: ZEND_CASE_SPEC_CV_CV_HANDLER,
! 31365: ZEND_NULL_HANDLER,
! 31366: ZEND_NULL_HANDLER,
! 31367: ZEND_NULL_HANDLER,
! 31368: ZEND_NULL_HANDLER,
! 31369: ZEND_NULL_HANDLER,
! 31370: ZEND_NULL_HANDLER,
! 31371: ZEND_NULL_HANDLER,
! 31372: ZEND_NULL_HANDLER,
! 31373: ZEND_NULL_HANDLER,
! 31374: ZEND_NULL_HANDLER,
! 31375: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
! 31376: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
! 31377: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
! 31378: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
! 31379: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
! 31380: ZEND_NULL_HANDLER,
! 31381: ZEND_NULL_HANDLER,
! 31382: ZEND_NULL_HANDLER,
! 31383: ZEND_NULL_HANDLER,
! 31384: ZEND_NULL_HANDLER,
! 31385: ZEND_NULL_HANDLER,
! 31386: ZEND_NULL_HANDLER,
! 31387: ZEND_NULL_HANDLER,
! 31388: ZEND_NULL_HANDLER,
! 31389: ZEND_NULL_HANDLER,
! 31390: ZEND_BRK_SPEC_CONST_HANDLER,
! 31391: ZEND_BRK_SPEC_TMP_HANDLER,
! 31392: ZEND_BRK_SPEC_VAR_HANDLER,
! 31393: ZEND_NULL_HANDLER,
! 31394: ZEND_BRK_SPEC_CV_HANDLER,
! 31395: ZEND_BRK_SPEC_CONST_HANDLER,
! 31396: ZEND_BRK_SPEC_TMP_HANDLER,
! 31397: ZEND_BRK_SPEC_VAR_HANDLER,
! 31398: ZEND_NULL_HANDLER,
! 31399: ZEND_BRK_SPEC_CV_HANDLER,
! 31400: ZEND_BRK_SPEC_CONST_HANDLER,
! 31401: ZEND_BRK_SPEC_TMP_HANDLER,
! 31402: ZEND_BRK_SPEC_VAR_HANDLER,
! 31403: ZEND_NULL_HANDLER,
! 31404: ZEND_BRK_SPEC_CV_HANDLER,
! 31405: ZEND_BRK_SPEC_CONST_HANDLER,
! 31406: ZEND_BRK_SPEC_TMP_HANDLER,
! 31407: ZEND_BRK_SPEC_VAR_HANDLER,
! 31408: ZEND_NULL_HANDLER,
! 31409: ZEND_BRK_SPEC_CV_HANDLER,
! 31410: ZEND_BRK_SPEC_CONST_HANDLER,
! 31411: ZEND_BRK_SPEC_TMP_HANDLER,
! 31412: ZEND_BRK_SPEC_VAR_HANDLER,
! 31413: ZEND_NULL_HANDLER,
! 31414: ZEND_BRK_SPEC_CV_HANDLER,
! 31415: ZEND_CONT_SPEC_CONST_HANDLER,
! 31416: ZEND_CONT_SPEC_TMP_HANDLER,
! 31417: ZEND_CONT_SPEC_VAR_HANDLER,
! 31418: ZEND_NULL_HANDLER,
! 31419: ZEND_CONT_SPEC_CV_HANDLER,
! 31420: ZEND_CONT_SPEC_CONST_HANDLER,
! 31421: ZEND_CONT_SPEC_TMP_HANDLER,
! 31422: ZEND_CONT_SPEC_VAR_HANDLER,
! 31423: ZEND_NULL_HANDLER,
! 31424: ZEND_CONT_SPEC_CV_HANDLER,
! 31425: ZEND_CONT_SPEC_CONST_HANDLER,
! 31426: ZEND_CONT_SPEC_TMP_HANDLER,
! 31427: ZEND_CONT_SPEC_VAR_HANDLER,
! 31428: ZEND_NULL_HANDLER,
! 31429: ZEND_CONT_SPEC_CV_HANDLER,
! 31430: ZEND_CONT_SPEC_CONST_HANDLER,
! 31431: ZEND_CONT_SPEC_TMP_HANDLER,
! 31432: ZEND_CONT_SPEC_VAR_HANDLER,
! 31433: ZEND_NULL_HANDLER,
! 31434: ZEND_CONT_SPEC_CV_HANDLER,
! 31435: ZEND_CONT_SPEC_CONST_HANDLER,
! 31436: ZEND_CONT_SPEC_TMP_HANDLER,
! 31437: ZEND_CONT_SPEC_VAR_HANDLER,
! 31438: ZEND_NULL_HANDLER,
! 31439: ZEND_CONT_SPEC_CV_HANDLER,
! 31440: ZEND_BOOL_SPEC_CONST_HANDLER,
! 31441: ZEND_BOOL_SPEC_CONST_HANDLER,
! 31442: ZEND_BOOL_SPEC_CONST_HANDLER,
! 31443: ZEND_BOOL_SPEC_CONST_HANDLER,
! 31444: ZEND_BOOL_SPEC_CONST_HANDLER,
! 31445: ZEND_BOOL_SPEC_TMP_HANDLER,
! 31446: ZEND_BOOL_SPEC_TMP_HANDLER,
! 31447: ZEND_BOOL_SPEC_TMP_HANDLER,
! 31448: ZEND_BOOL_SPEC_TMP_HANDLER,
! 31449: ZEND_BOOL_SPEC_TMP_HANDLER,
! 31450: ZEND_BOOL_SPEC_VAR_HANDLER,
! 31451: ZEND_BOOL_SPEC_VAR_HANDLER,
! 31452: ZEND_BOOL_SPEC_VAR_HANDLER,
! 31453: ZEND_BOOL_SPEC_VAR_HANDLER,
! 31454: ZEND_BOOL_SPEC_VAR_HANDLER,
! 31455: ZEND_NULL_HANDLER,
! 31456: ZEND_NULL_HANDLER,
! 31457: ZEND_NULL_HANDLER,
! 31458: ZEND_NULL_HANDLER,
! 31459: ZEND_NULL_HANDLER,
! 31460: ZEND_BOOL_SPEC_CV_HANDLER,
! 31461: ZEND_BOOL_SPEC_CV_HANDLER,
! 31462: ZEND_BOOL_SPEC_CV_HANDLER,
! 31463: ZEND_BOOL_SPEC_CV_HANDLER,
! 31464: ZEND_BOOL_SPEC_CV_HANDLER,
! 31465: ZEND_INIT_STRING_SPEC_HANDLER,
! 31466: ZEND_INIT_STRING_SPEC_HANDLER,
! 31467: ZEND_INIT_STRING_SPEC_HANDLER,
! 31468: ZEND_INIT_STRING_SPEC_HANDLER,
! 31469: ZEND_INIT_STRING_SPEC_HANDLER,
! 31470: ZEND_INIT_STRING_SPEC_HANDLER,
! 31471: ZEND_INIT_STRING_SPEC_HANDLER,
! 31472: ZEND_INIT_STRING_SPEC_HANDLER,
! 31473: ZEND_INIT_STRING_SPEC_HANDLER,
! 31474: ZEND_INIT_STRING_SPEC_HANDLER,
! 31475: ZEND_INIT_STRING_SPEC_HANDLER,
! 31476: ZEND_INIT_STRING_SPEC_HANDLER,
! 31477: ZEND_INIT_STRING_SPEC_HANDLER,
! 31478: ZEND_INIT_STRING_SPEC_HANDLER,
! 31479: ZEND_INIT_STRING_SPEC_HANDLER,
! 31480: ZEND_INIT_STRING_SPEC_HANDLER,
! 31481: ZEND_INIT_STRING_SPEC_HANDLER,
! 31482: ZEND_INIT_STRING_SPEC_HANDLER,
! 31483: ZEND_INIT_STRING_SPEC_HANDLER,
! 31484: ZEND_INIT_STRING_SPEC_HANDLER,
! 31485: ZEND_INIT_STRING_SPEC_HANDLER,
! 31486: ZEND_INIT_STRING_SPEC_HANDLER,
! 31487: ZEND_INIT_STRING_SPEC_HANDLER,
! 31488: ZEND_INIT_STRING_SPEC_HANDLER,
! 31489: ZEND_INIT_STRING_SPEC_HANDLER,
! 31490: ZEND_NULL_HANDLER,
! 31491: ZEND_NULL_HANDLER,
! 31492: ZEND_NULL_HANDLER,
! 31493: ZEND_NULL_HANDLER,
! 31494: ZEND_NULL_HANDLER,
! 31495: ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER,
! 31496: ZEND_NULL_HANDLER,
! 31497: ZEND_NULL_HANDLER,
! 31498: ZEND_NULL_HANDLER,
! 31499: ZEND_NULL_HANDLER,
! 31500: ZEND_NULL_HANDLER,
! 31501: ZEND_NULL_HANDLER,
! 31502: ZEND_NULL_HANDLER,
! 31503: ZEND_NULL_HANDLER,
! 31504: ZEND_NULL_HANDLER,
! 31505: ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER,
! 31506: ZEND_NULL_HANDLER,
! 31507: ZEND_NULL_HANDLER,
! 31508: ZEND_NULL_HANDLER,
! 31509: ZEND_NULL_HANDLER,
! 31510: ZEND_NULL_HANDLER,
! 31511: ZEND_NULL_HANDLER,
! 31512: ZEND_NULL_HANDLER,
! 31513: ZEND_NULL_HANDLER,
! 31514: ZEND_NULL_HANDLER,
! 31515: ZEND_NULL_HANDLER,
! 31516: ZEND_NULL_HANDLER,
! 31517: ZEND_NULL_HANDLER,
! 31518: ZEND_NULL_HANDLER,
! 31519: ZEND_NULL_HANDLER,
! 31520: ZEND_ADD_STRING_SPEC_TMP_CONST_HANDLER,
! 31521: ZEND_NULL_HANDLER,
! 31522: ZEND_NULL_HANDLER,
! 31523: ZEND_NULL_HANDLER,
! 31524: ZEND_NULL_HANDLER,
! 31525: ZEND_NULL_HANDLER,
! 31526: ZEND_NULL_HANDLER,
! 31527: ZEND_NULL_HANDLER,
! 31528: ZEND_NULL_HANDLER,
! 31529: ZEND_NULL_HANDLER,
! 31530: ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER,
! 31531: ZEND_NULL_HANDLER,
! 31532: ZEND_NULL_HANDLER,
! 31533: ZEND_NULL_HANDLER,
! 31534: ZEND_NULL_HANDLER,
! 31535: ZEND_NULL_HANDLER,
! 31536: ZEND_NULL_HANDLER,
! 31537: ZEND_NULL_HANDLER,
! 31538: ZEND_NULL_HANDLER,
! 31539: ZEND_NULL_HANDLER,
! 31540: ZEND_NULL_HANDLER,
! 31541: ZEND_NULL_HANDLER,
! 31542: ZEND_NULL_HANDLER,
! 31543: ZEND_NULL_HANDLER,
! 31544: ZEND_NULL_HANDLER,
! 31545: ZEND_NULL_HANDLER,
! 31546: ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER,
! 31547: ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER,
! 31548: ZEND_NULL_HANDLER,
! 31549: ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER,
! 31550: ZEND_NULL_HANDLER,
! 31551: ZEND_NULL_HANDLER,
! 31552: ZEND_NULL_HANDLER,
! 31553: ZEND_NULL_HANDLER,
! 31554: ZEND_NULL_HANDLER,
! 31555: ZEND_NULL_HANDLER,
! 31556: ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER,
! 31557: ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER,
! 31558: ZEND_NULL_HANDLER,
! 31559: ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER,
! 31560: ZEND_NULL_HANDLER,
! 31561: ZEND_NULL_HANDLER,
! 31562: ZEND_NULL_HANDLER,
! 31563: ZEND_NULL_HANDLER,
! 31564: ZEND_NULL_HANDLER,
! 31565: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31566: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31567: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31568: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31569: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31570: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31571: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31572: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31573: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31574: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31575: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31576: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31577: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31578: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31579: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31580: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31581: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31582: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31583: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31584: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31585: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31586: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31587: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31588: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31589: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
! 31590: ZEND_NULL_HANDLER,
! 31591: ZEND_NULL_HANDLER,
! 31592: ZEND_NULL_HANDLER,
! 31593: ZEND_NULL_HANDLER,
! 31594: ZEND_NULL_HANDLER,
! 31595: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
! 31596: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
! 31597: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
! 31598: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
! 31599: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
! 31600: ZEND_NULL_HANDLER,
! 31601: ZEND_NULL_HANDLER,
! 31602: ZEND_NULL_HANDLER,
! 31603: ZEND_NULL_HANDLER,
! 31604: ZEND_NULL_HANDLER,
! 31605: ZEND_NULL_HANDLER,
! 31606: ZEND_NULL_HANDLER,
! 31607: ZEND_NULL_HANDLER,
! 31608: ZEND_NULL_HANDLER,
! 31609: ZEND_NULL_HANDLER,
! 31610: ZEND_NULL_HANDLER,
! 31611: ZEND_NULL_HANDLER,
! 31612: ZEND_NULL_HANDLER,
! 31613: ZEND_NULL_HANDLER,
! 31614: ZEND_NULL_HANDLER,
! 31615: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31616: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
! 31617: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
! 31618: ZEND_NULL_HANDLER,
! 31619: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
! 31620: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31621: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
! 31622: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
! 31623: ZEND_NULL_HANDLER,
! 31624: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
! 31625: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31626: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
! 31627: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
! 31628: ZEND_NULL_HANDLER,
! 31629: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
! 31630: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31631: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
! 31632: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
! 31633: ZEND_NULL_HANDLER,
! 31634: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
! 31635: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31636: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
! 31637: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
! 31638: ZEND_NULL_HANDLER,
! 31639: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
! 31640: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
! 31641: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
! 31642: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
! 31643: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
! 31644: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
! 31645: ZEND_NULL_HANDLER,
! 31646: ZEND_NULL_HANDLER,
! 31647: ZEND_NULL_HANDLER,
! 31648: ZEND_NULL_HANDLER,
! 31649: ZEND_NULL_HANDLER,
! 31650: ZEND_NULL_HANDLER,
! 31651: ZEND_NULL_HANDLER,
! 31652: ZEND_NULL_HANDLER,
! 31653: ZEND_NULL_HANDLER,
! 31654: ZEND_NULL_HANDLER,
! 31655: ZEND_NULL_HANDLER,
! 31656: ZEND_NULL_HANDLER,
! 31657: ZEND_NULL_HANDLER,
! 31658: ZEND_NULL_HANDLER,
! 31659: ZEND_NULL_HANDLER,
! 31660: ZEND_NULL_HANDLER,
! 31661: ZEND_NULL_HANDLER,
! 31662: ZEND_NULL_HANDLER,
! 31663: ZEND_NULL_HANDLER,
! 31664: ZEND_NULL_HANDLER,
! 31665: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31666: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31667: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31668: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31669: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31670: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31671: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31672: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31673: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31674: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31675: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31676: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31677: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31678: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31679: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31680: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31681: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31682: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31683: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31684: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31685: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31686: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31687: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31688: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31689: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
! 31690: ZEND_RETURN_SPEC_CONST_HANDLER,
! 31691: ZEND_RETURN_SPEC_CONST_HANDLER,
! 31692: ZEND_RETURN_SPEC_CONST_HANDLER,
! 31693: ZEND_RETURN_SPEC_CONST_HANDLER,
! 31694: ZEND_RETURN_SPEC_CONST_HANDLER,
! 31695: ZEND_RETURN_SPEC_TMP_HANDLER,
! 31696: ZEND_RETURN_SPEC_TMP_HANDLER,
! 31697: ZEND_RETURN_SPEC_TMP_HANDLER,
! 31698: ZEND_RETURN_SPEC_TMP_HANDLER,
! 31699: ZEND_RETURN_SPEC_TMP_HANDLER,
! 31700: ZEND_RETURN_SPEC_VAR_HANDLER,
! 31701: ZEND_RETURN_SPEC_VAR_HANDLER,
! 31702: ZEND_RETURN_SPEC_VAR_HANDLER,
! 31703: ZEND_RETURN_SPEC_VAR_HANDLER,
! 31704: ZEND_RETURN_SPEC_VAR_HANDLER,
! 31705: ZEND_NULL_HANDLER,
! 31706: ZEND_NULL_HANDLER,
! 31707: ZEND_NULL_HANDLER,
! 31708: ZEND_NULL_HANDLER,
! 31709: ZEND_NULL_HANDLER,
! 31710: ZEND_RETURN_SPEC_CV_HANDLER,
! 31711: ZEND_RETURN_SPEC_CV_HANDLER,
! 31712: ZEND_RETURN_SPEC_CV_HANDLER,
! 31713: ZEND_RETURN_SPEC_CV_HANDLER,
! 31714: ZEND_RETURN_SPEC_CV_HANDLER,
! 31715: ZEND_RECV_SPEC_HANDLER,
! 31716: ZEND_RECV_SPEC_HANDLER,
! 31717: ZEND_RECV_SPEC_HANDLER,
! 31718: ZEND_RECV_SPEC_HANDLER,
! 31719: ZEND_RECV_SPEC_HANDLER,
! 31720: ZEND_RECV_SPEC_HANDLER,
! 31721: ZEND_RECV_SPEC_HANDLER,
! 31722: ZEND_RECV_SPEC_HANDLER,
! 31723: ZEND_RECV_SPEC_HANDLER,
! 31724: ZEND_RECV_SPEC_HANDLER,
! 31725: ZEND_RECV_SPEC_HANDLER,
! 31726: ZEND_RECV_SPEC_HANDLER,
! 31727: ZEND_RECV_SPEC_HANDLER,
! 31728: ZEND_RECV_SPEC_HANDLER,
! 31729: ZEND_RECV_SPEC_HANDLER,
! 31730: ZEND_RECV_SPEC_HANDLER,
! 31731: ZEND_RECV_SPEC_HANDLER,
! 31732: ZEND_RECV_SPEC_HANDLER,
! 31733: ZEND_RECV_SPEC_HANDLER,
! 31734: ZEND_RECV_SPEC_HANDLER,
! 31735: ZEND_RECV_SPEC_HANDLER,
! 31736: ZEND_RECV_SPEC_HANDLER,
! 31737: ZEND_RECV_SPEC_HANDLER,
! 31738: ZEND_RECV_SPEC_HANDLER,
! 31739: ZEND_RECV_SPEC_HANDLER,
! 31740: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
! 31741: ZEND_NULL_HANDLER,
! 31742: ZEND_NULL_HANDLER,
! 31743: ZEND_NULL_HANDLER,
! 31744: ZEND_NULL_HANDLER,
! 31745: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
! 31746: ZEND_NULL_HANDLER,
! 31747: ZEND_NULL_HANDLER,
! 31748: ZEND_NULL_HANDLER,
! 31749: ZEND_NULL_HANDLER,
! 31750: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
! 31751: ZEND_NULL_HANDLER,
! 31752: ZEND_NULL_HANDLER,
! 31753: ZEND_NULL_HANDLER,
! 31754: ZEND_NULL_HANDLER,
! 31755: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
! 31756: ZEND_NULL_HANDLER,
! 31757: ZEND_NULL_HANDLER,
! 31758: ZEND_NULL_HANDLER,
! 31759: ZEND_NULL_HANDLER,
! 31760: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
! 31761: ZEND_NULL_HANDLER,
! 31762: ZEND_NULL_HANDLER,
! 31763: ZEND_NULL_HANDLER,
! 31764: ZEND_NULL_HANDLER,
! 31765: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
! 31766: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
! 31767: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
! 31768: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
! 31769: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
! 31770: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
! 31771: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
! 31772: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
! 31773: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
! 31774: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
! 31775: ZEND_SEND_VAL_SPEC_VAR_HANDLER,
! 31776: ZEND_SEND_VAL_SPEC_VAR_HANDLER,
! 31777: ZEND_SEND_VAL_SPEC_VAR_HANDLER,
! 31778: ZEND_SEND_VAL_SPEC_VAR_HANDLER,
! 31779: ZEND_SEND_VAL_SPEC_VAR_HANDLER,
! 31780: ZEND_NULL_HANDLER,
! 31781: ZEND_NULL_HANDLER,
! 31782: ZEND_NULL_HANDLER,
! 31783: ZEND_NULL_HANDLER,
! 31784: ZEND_NULL_HANDLER,
! 31785: ZEND_SEND_VAL_SPEC_CV_HANDLER,
! 31786: ZEND_SEND_VAL_SPEC_CV_HANDLER,
! 31787: ZEND_SEND_VAL_SPEC_CV_HANDLER,
! 31788: ZEND_SEND_VAL_SPEC_CV_HANDLER,
! 31789: ZEND_SEND_VAL_SPEC_CV_HANDLER,
! 31790: ZEND_NULL_HANDLER,
! 31791: ZEND_NULL_HANDLER,
! 31792: ZEND_NULL_HANDLER,
! 31793: ZEND_NULL_HANDLER,
! 31794: ZEND_NULL_HANDLER,
! 31795: ZEND_NULL_HANDLER,
! 31796: ZEND_NULL_HANDLER,
! 31797: ZEND_NULL_HANDLER,
! 31798: ZEND_NULL_HANDLER,
! 31799: ZEND_NULL_HANDLER,
! 31800: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
! 31801: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
! 31802: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
! 31803: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
! 31804: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
! 31805: ZEND_NULL_HANDLER,
! 31806: ZEND_NULL_HANDLER,
! 31807: ZEND_NULL_HANDLER,
! 31808: ZEND_NULL_HANDLER,
! 31809: ZEND_NULL_HANDLER,
! 31810: ZEND_SEND_VAR_SPEC_CV_HANDLER,
! 31811: ZEND_SEND_VAR_SPEC_CV_HANDLER,
! 31812: ZEND_SEND_VAR_SPEC_CV_HANDLER,
! 31813: ZEND_SEND_VAR_SPEC_CV_HANDLER,
! 31814: ZEND_SEND_VAR_SPEC_CV_HANDLER,
! 31815: ZEND_NULL_HANDLER,
! 31816: ZEND_NULL_HANDLER,
! 31817: ZEND_NULL_HANDLER,
! 31818: ZEND_NULL_HANDLER,
! 31819: ZEND_NULL_HANDLER,
! 31820: ZEND_NULL_HANDLER,
! 31821: ZEND_NULL_HANDLER,
! 31822: ZEND_NULL_HANDLER,
! 31823: ZEND_NULL_HANDLER,
! 31824: ZEND_NULL_HANDLER,
! 31825: ZEND_SEND_REF_SPEC_VAR_HANDLER,
! 31826: ZEND_SEND_REF_SPEC_VAR_HANDLER,
! 31827: ZEND_SEND_REF_SPEC_VAR_HANDLER,
! 31828: ZEND_SEND_REF_SPEC_VAR_HANDLER,
! 31829: ZEND_SEND_REF_SPEC_VAR_HANDLER,
! 31830: ZEND_NULL_HANDLER,
! 31831: ZEND_NULL_HANDLER,
! 31832: ZEND_NULL_HANDLER,
! 31833: ZEND_NULL_HANDLER,
! 31834: ZEND_NULL_HANDLER,
! 31835: ZEND_SEND_REF_SPEC_CV_HANDLER,
! 31836: ZEND_SEND_REF_SPEC_CV_HANDLER,
! 31837: ZEND_SEND_REF_SPEC_CV_HANDLER,
! 31838: ZEND_SEND_REF_SPEC_CV_HANDLER,
! 31839: ZEND_SEND_REF_SPEC_CV_HANDLER,
! 31840: ZEND_NEW_SPEC_HANDLER,
! 31841: ZEND_NEW_SPEC_HANDLER,
! 31842: ZEND_NEW_SPEC_HANDLER,
! 31843: ZEND_NEW_SPEC_HANDLER,
! 31844: ZEND_NEW_SPEC_HANDLER,
! 31845: ZEND_NEW_SPEC_HANDLER,
! 31846: ZEND_NEW_SPEC_HANDLER,
! 31847: ZEND_NEW_SPEC_HANDLER,
! 31848: ZEND_NEW_SPEC_HANDLER,
! 31849: ZEND_NEW_SPEC_HANDLER,
! 31850: ZEND_NEW_SPEC_HANDLER,
! 31851: ZEND_NEW_SPEC_HANDLER,
! 31852: ZEND_NEW_SPEC_HANDLER,
! 31853: ZEND_NEW_SPEC_HANDLER,
! 31854: ZEND_NEW_SPEC_HANDLER,
! 31855: ZEND_NEW_SPEC_HANDLER,
! 31856: ZEND_NEW_SPEC_HANDLER,
! 31857: ZEND_NEW_SPEC_HANDLER,
! 31858: ZEND_NEW_SPEC_HANDLER,
! 31859: ZEND_NEW_SPEC_HANDLER,
! 31860: ZEND_NEW_SPEC_HANDLER,
! 31861: ZEND_NEW_SPEC_HANDLER,
! 31862: ZEND_NEW_SPEC_HANDLER,
! 31863: ZEND_NEW_SPEC_HANDLER,
! 31864: ZEND_NEW_SPEC_HANDLER,
! 31865: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31866: ZEND_NULL_HANDLER,
! 31867: ZEND_NULL_HANDLER,
! 31868: ZEND_NULL_HANDLER,
! 31869: ZEND_NULL_HANDLER,
! 31870: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31871: ZEND_NULL_HANDLER,
! 31872: ZEND_NULL_HANDLER,
! 31873: ZEND_NULL_HANDLER,
! 31874: ZEND_NULL_HANDLER,
! 31875: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31876: ZEND_NULL_HANDLER,
! 31877: ZEND_NULL_HANDLER,
! 31878: ZEND_NULL_HANDLER,
! 31879: ZEND_NULL_HANDLER,
! 31880: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31881: ZEND_NULL_HANDLER,
! 31882: ZEND_NULL_HANDLER,
! 31883: ZEND_NULL_HANDLER,
! 31884: ZEND_NULL_HANDLER,
! 31885: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
! 31886: ZEND_NULL_HANDLER,
! 31887: ZEND_NULL_HANDLER,
! 31888: ZEND_NULL_HANDLER,
! 31889: ZEND_NULL_HANDLER,
! 31890: ZEND_NULL_HANDLER,
! 31891: ZEND_NULL_HANDLER,
! 31892: ZEND_NULL_HANDLER,
! 31893: ZEND_NULL_HANDLER,
! 31894: ZEND_NULL_HANDLER,
! 31895: ZEND_FREE_SPEC_TMP_HANDLER,
! 31896: ZEND_FREE_SPEC_TMP_HANDLER,
! 31897: ZEND_FREE_SPEC_TMP_HANDLER,
! 31898: ZEND_FREE_SPEC_TMP_HANDLER,
! 31899: ZEND_FREE_SPEC_TMP_HANDLER,
! 31900: ZEND_NULL_HANDLER,
! 31901: ZEND_NULL_HANDLER,
! 31902: ZEND_NULL_HANDLER,
! 31903: ZEND_NULL_HANDLER,
! 31904: ZEND_NULL_HANDLER,
! 31905: ZEND_NULL_HANDLER,
! 31906: ZEND_NULL_HANDLER,
! 31907: ZEND_NULL_HANDLER,
! 31908: ZEND_NULL_HANDLER,
! 31909: ZEND_NULL_HANDLER,
! 31910: ZEND_NULL_HANDLER,
! 31911: ZEND_NULL_HANDLER,
! 31912: ZEND_NULL_HANDLER,
! 31913: ZEND_NULL_HANDLER,
! 31914: ZEND_NULL_HANDLER,
! 31915: ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER,
! 31916: ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER,
! 31917: ZEND_INIT_ARRAY_SPEC_CONST_VAR_HANDLER,
! 31918: ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER,
! 31919: ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER,
! 31920: ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER,
! 31921: ZEND_INIT_ARRAY_SPEC_TMP_TMP_HANDLER,
! 31922: ZEND_INIT_ARRAY_SPEC_TMP_VAR_HANDLER,
! 31923: ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER,
! 31924: ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER,
! 31925: ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER,
! 31926: ZEND_INIT_ARRAY_SPEC_VAR_TMP_HANDLER,
! 31927: ZEND_INIT_ARRAY_SPEC_VAR_VAR_HANDLER,
! 31928: ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER,
! 31929: ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER,
! 31930: ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER,
! 31931: ZEND_INIT_ARRAY_SPEC_UNUSED_TMP_HANDLER,
! 31932: ZEND_INIT_ARRAY_SPEC_UNUSED_VAR_HANDLER,
! 31933: ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER,
! 31934: ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER,
! 31935: ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER,
! 31936: ZEND_INIT_ARRAY_SPEC_CV_TMP_HANDLER,
! 31937: ZEND_INIT_ARRAY_SPEC_CV_VAR_HANDLER,
! 31938: ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER,
! 31939: ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER,
! 31940: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER,
! 31941: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER,
! 31942: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER,
! 31943: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER,
! 31944: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER,
! 31945: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER,
! 31946: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER,
! 31947: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER,
! 31948: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER,
! 31949: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER,
! 31950: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER,
! 31951: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER,
! 31952: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER,
! 31953: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER,
! 31954: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER,
! 31955: ZEND_NULL_HANDLER,
! 31956: ZEND_NULL_HANDLER,
! 31957: ZEND_NULL_HANDLER,
! 31958: ZEND_NULL_HANDLER,
! 31959: ZEND_NULL_HANDLER,
! 31960: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER,
! 31961: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER,
! 31962: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER,
! 31963: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER,
! 31964: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER,
! 31965: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
! 31966: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
! 31967: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
! 31968: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
! 31969: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
! 31970: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
! 31971: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
! 31972: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
! 31973: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
! 31974: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
! 31975: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
! 31976: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
! 31977: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
! 31978: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
! 31979: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
! 31980: ZEND_NULL_HANDLER,
! 31981: ZEND_NULL_HANDLER,
! 31982: ZEND_NULL_HANDLER,
! 31983: ZEND_NULL_HANDLER,
! 31984: ZEND_NULL_HANDLER,
! 31985: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
! 31986: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
! 31987: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
! 31988: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
! 31989: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
! 31990: ZEND_UNSET_VAR_SPEC_CONST_HANDLER,
! 31991: ZEND_UNSET_VAR_SPEC_CONST_HANDLER,
! 31992: ZEND_UNSET_VAR_SPEC_CONST_HANDLER,
! 31993: ZEND_UNSET_VAR_SPEC_CONST_HANDLER,
! 31994: ZEND_UNSET_VAR_SPEC_CONST_HANDLER,
! 31995: ZEND_UNSET_VAR_SPEC_TMP_HANDLER,
! 31996: ZEND_UNSET_VAR_SPEC_TMP_HANDLER,
! 31997: ZEND_UNSET_VAR_SPEC_TMP_HANDLER,
! 31998: ZEND_UNSET_VAR_SPEC_TMP_HANDLER,
! 31999: ZEND_UNSET_VAR_SPEC_TMP_HANDLER,
! 32000: ZEND_UNSET_VAR_SPEC_VAR_HANDLER,
! 32001: ZEND_UNSET_VAR_SPEC_VAR_HANDLER,
! 32002: ZEND_UNSET_VAR_SPEC_VAR_HANDLER,
! 32003: ZEND_UNSET_VAR_SPEC_VAR_HANDLER,
! 32004: ZEND_UNSET_VAR_SPEC_VAR_HANDLER,
! 32005: ZEND_NULL_HANDLER,
! 32006: ZEND_NULL_HANDLER,
! 32007: ZEND_NULL_HANDLER,
! 32008: ZEND_NULL_HANDLER,
! 32009: ZEND_NULL_HANDLER,
! 32010: ZEND_UNSET_VAR_SPEC_CV_HANDLER,
! 32011: ZEND_UNSET_VAR_SPEC_CV_HANDLER,
! 32012: ZEND_UNSET_VAR_SPEC_CV_HANDLER,
! 32013: ZEND_UNSET_VAR_SPEC_CV_HANDLER,
! 32014: ZEND_UNSET_VAR_SPEC_CV_HANDLER,
! 32015: ZEND_NULL_HANDLER,
! 32016: ZEND_NULL_HANDLER,
! 32017: ZEND_NULL_HANDLER,
! 32018: ZEND_NULL_HANDLER,
! 32019: ZEND_NULL_HANDLER,
! 32020: ZEND_NULL_HANDLER,
! 32021: ZEND_NULL_HANDLER,
! 32022: ZEND_NULL_HANDLER,
! 32023: ZEND_NULL_HANDLER,
! 32024: ZEND_NULL_HANDLER,
! 32025: ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER,
! 32026: ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER,
! 32027: ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER,
! 32028: ZEND_NULL_HANDLER,
! 32029: ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER,
! 32030: ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER,
! 32031: ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER,
! 32032: ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER,
! 32033: ZEND_NULL_HANDLER,
! 32034: ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER,
! 32035: ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER,
! 32036: ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER,
! 32037: ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER,
! 32038: ZEND_NULL_HANDLER,
! 32039: ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER,
! 32040: ZEND_NULL_HANDLER,
! 32041: ZEND_NULL_HANDLER,
! 32042: ZEND_NULL_HANDLER,
! 32043: ZEND_NULL_HANDLER,
! 32044: ZEND_NULL_HANDLER,
! 32045: ZEND_NULL_HANDLER,
! 32046: ZEND_NULL_HANDLER,
! 32047: ZEND_NULL_HANDLER,
! 32048: ZEND_NULL_HANDLER,
! 32049: ZEND_NULL_HANDLER,
! 32050: ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER,
! 32051: ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER,
! 32052: ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER,
! 32053: ZEND_NULL_HANDLER,
! 32054: ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER,
! 32055: ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 32056: ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 32057: ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 32058: ZEND_NULL_HANDLER,
! 32059: ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER,
! 32060: ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER,
! 32061: ZEND_UNSET_OBJ_SPEC_CV_TMP_HANDLER,
! 32062: ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER,
! 32063: ZEND_NULL_HANDLER,
! 32064: ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER,
! 32065: ZEND_FE_RESET_SPEC_CONST_HANDLER,
! 32066: ZEND_FE_RESET_SPEC_CONST_HANDLER,
! 32067: ZEND_FE_RESET_SPEC_CONST_HANDLER,
! 32068: ZEND_FE_RESET_SPEC_CONST_HANDLER,
! 32069: ZEND_FE_RESET_SPEC_CONST_HANDLER,
! 32070: ZEND_FE_RESET_SPEC_TMP_HANDLER,
! 32071: ZEND_FE_RESET_SPEC_TMP_HANDLER,
! 32072: ZEND_FE_RESET_SPEC_TMP_HANDLER,
! 32073: ZEND_FE_RESET_SPEC_TMP_HANDLER,
! 32074: ZEND_FE_RESET_SPEC_TMP_HANDLER,
! 32075: ZEND_FE_RESET_SPEC_VAR_HANDLER,
! 32076: ZEND_FE_RESET_SPEC_VAR_HANDLER,
! 32077: ZEND_FE_RESET_SPEC_VAR_HANDLER,
! 32078: ZEND_FE_RESET_SPEC_VAR_HANDLER,
! 32079: ZEND_FE_RESET_SPEC_VAR_HANDLER,
! 32080: ZEND_NULL_HANDLER,
! 32081: ZEND_NULL_HANDLER,
! 32082: ZEND_NULL_HANDLER,
! 32083: ZEND_NULL_HANDLER,
! 32084: ZEND_NULL_HANDLER,
! 32085: ZEND_FE_RESET_SPEC_CV_HANDLER,
! 32086: ZEND_FE_RESET_SPEC_CV_HANDLER,
! 32087: ZEND_FE_RESET_SPEC_CV_HANDLER,
! 32088: ZEND_FE_RESET_SPEC_CV_HANDLER,
! 32089: ZEND_FE_RESET_SPEC_CV_HANDLER,
! 32090: ZEND_NULL_HANDLER,
! 32091: ZEND_NULL_HANDLER,
! 32092: ZEND_NULL_HANDLER,
! 32093: ZEND_NULL_HANDLER,
! 32094: ZEND_NULL_HANDLER,
! 32095: ZEND_NULL_HANDLER,
! 32096: ZEND_NULL_HANDLER,
! 32097: ZEND_NULL_HANDLER,
! 32098: ZEND_NULL_HANDLER,
! 32099: ZEND_NULL_HANDLER,
! 32100: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
! 32101: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
! 32102: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
! 32103: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
! 32104: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
! 32105: ZEND_NULL_HANDLER,
! 32106: ZEND_NULL_HANDLER,
! 32107: ZEND_NULL_HANDLER,
! 32108: ZEND_NULL_HANDLER,
! 32109: ZEND_NULL_HANDLER,
! 32110: ZEND_NULL_HANDLER,
! 32111: ZEND_NULL_HANDLER,
! 32112: ZEND_NULL_HANDLER,
! 32113: ZEND_NULL_HANDLER,
! 32114: ZEND_NULL_HANDLER,
! 32115: ZEND_EXIT_SPEC_CONST_HANDLER,
! 32116: ZEND_EXIT_SPEC_CONST_HANDLER,
! 32117: ZEND_EXIT_SPEC_CONST_HANDLER,
! 32118: ZEND_EXIT_SPEC_CONST_HANDLER,
! 32119: ZEND_EXIT_SPEC_CONST_HANDLER,
! 32120: ZEND_EXIT_SPEC_TMP_HANDLER,
! 32121: ZEND_EXIT_SPEC_TMP_HANDLER,
! 32122: ZEND_EXIT_SPEC_TMP_HANDLER,
! 32123: ZEND_EXIT_SPEC_TMP_HANDLER,
! 32124: ZEND_EXIT_SPEC_TMP_HANDLER,
! 32125: ZEND_EXIT_SPEC_VAR_HANDLER,
! 32126: ZEND_EXIT_SPEC_VAR_HANDLER,
! 32127: ZEND_EXIT_SPEC_VAR_HANDLER,
! 32128: ZEND_EXIT_SPEC_VAR_HANDLER,
! 32129: ZEND_EXIT_SPEC_VAR_HANDLER,
! 32130: ZEND_EXIT_SPEC_UNUSED_HANDLER,
! 32131: ZEND_EXIT_SPEC_UNUSED_HANDLER,
! 32132: ZEND_EXIT_SPEC_UNUSED_HANDLER,
! 32133: ZEND_EXIT_SPEC_UNUSED_HANDLER,
! 32134: ZEND_EXIT_SPEC_UNUSED_HANDLER,
! 32135: ZEND_EXIT_SPEC_CV_HANDLER,
! 32136: ZEND_EXIT_SPEC_CV_HANDLER,
! 32137: ZEND_EXIT_SPEC_CV_HANDLER,
! 32138: ZEND_EXIT_SPEC_CV_HANDLER,
! 32139: ZEND_EXIT_SPEC_CV_HANDLER,
! 32140: ZEND_FETCH_R_SPEC_CONST_HANDLER,
! 32141: ZEND_FETCH_R_SPEC_CONST_HANDLER,
! 32142: ZEND_FETCH_R_SPEC_CONST_HANDLER,
! 32143: ZEND_FETCH_R_SPEC_CONST_HANDLER,
! 32144: ZEND_FETCH_R_SPEC_CONST_HANDLER,
! 32145: ZEND_FETCH_R_SPEC_TMP_HANDLER,
! 32146: ZEND_FETCH_R_SPEC_TMP_HANDLER,
! 32147: ZEND_FETCH_R_SPEC_TMP_HANDLER,
! 32148: ZEND_FETCH_R_SPEC_TMP_HANDLER,
! 32149: ZEND_FETCH_R_SPEC_TMP_HANDLER,
! 32150: ZEND_FETCH_R_SPEC_VAR_HANDLER,
! 32151: ZEND_FETCH_R_SPEC_VAR_HANDLER,
! 32152: ZEND_FETCH_R_SPEC_VAR_HANDLER,
! 32153: ZEND_FETCH_R_SPEC_VAR_HANDLER,
! 32154: ZEND_FETCH_R_SPEC_VAR_HANDLER,
! 32155: ZEND_NULL_HANDLER,
! 32156: ZEND_NULL_HANDLER,
! 32157: ZEND_NULL_HANDLER,
! 32158: ZEND_NULL_HANDLER,
! 32159: ZEND_NULL_HANDLER,
! 32160: ZEND_FETCH_R_SPEC_CV_HANDLER,
! 32161: ZEND_FETCH_R_SPEC_CV_HANDLER,
! 32162: ZEND_FETCH_R_SPEC_CV_HANDLER,
! 32163: ZEND_FETCH_R_SPEC_CV_HANDLER,
! 32164: ZEND_FETCH_R_SPEC_CV_HANDLER,
! 32165: ZEND_NULL_HANDLER,
! 32166: ZEND_NULL_HANDLER,
! 32167: ZEND_NULL_HANDLER,
! 32168: ZEND_NULL_HANDLER,
! 32169: ZEND_NULL_HANDLER,
! 32170: ZEND_NULL_HANDLER,
! 32171: ZEND_NULL_HANDLER,
! 32172: ZEND_NULL_HANDLER,
! 32173: ZEND_NULL_HANDLER,
! 32174: ZEND_NULL_HANDLER,
! 32175: ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER,
! 32176: ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER,
! 32177: ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER,
! 32178: ZEND_NULL_HANDLER,
! 32179: ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER,
! 32180: ZEND_NULL_HANDLER,
! 32181: ZEND_NULL_HANDLER,
! 32182: ZEND_NULL_HANDLER,
! 32183: ZEND_NULL_HANDLER,
! 32184: ZEND_NULL_HANDLER,
! 32185: ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER,
! 32186: ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER,
! 32187: ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER,
! 32188: ZEND_NULL_HANDLER,
! 32189: ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER,
! 32190: ZEND_NULL_HANDLER,
! 32191: ZEND_NULL_HANDLER,
! 32192: ZEND_NULL_HANDLER,
! 32193: ZEND_NULL_HANDLER,
! 32194: ZEND_NULL_HANDLER,
! 32195: ZEND_NULL_HANDLER,
! 32196: ZEND_NULL_HANDLER,
! 32197: ZEND_NULL_HANDLER,
! 32198: ZEND_NULL_HANDLER,
! 32199: ZEND_NULL_HANDLER,
! 32200: ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER,
! 32201: ZEND_FETCH_OBJ_R_SPEC_VAR_TMP_HANDLER,
! 32202: ZEND_FETCH_OBJ_R_SPEC_VAR_VAR_HANDLER,
! 32203: ZEND_NULL_HANDLER,
! 32204: ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER,
! 32205: ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER,
! 32206: ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMP_HANDLER,
! 32207: ZEND_FETCH_OBJ_R_SPEC_UNUSED_VAR_HANDLER,
! 32208: ZEND_NULL_HANDLER,
! 32209: ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER,
! 32210: ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER,
! 32211: ZEND_FETCH_OBJ_R_SPEC_CV_TMP_HANDLER,
! 32212: ZEND_FETCH_OBJ_R_SPEC_CV_VAR_HANDLER,
! 32213: ZEND_NULL_HANDLER,
! 32214: ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER,
! 32215: ZEND_FETCH_W_SPEC_CONST_HANDLER,
! 32216: ZEND_FETCH_W_SPEC_CONST_HANDLER,
! 32217: ZEND_FETCH_W_SPEC_CONST_HANDLER,
! 32218: ZEND_FETCH_W_SPEC_CONST_HANDLER,
! 32219: ZEND_FETCH_W_SPEC_CONST_HANDLER,
! 32220: ZEND_FETCH_W_SPEC_TMP_HANDLER,
! 32221: ZEND_FETCH_W_SPEC_TMP_HANDLER,
! 32222: ZEND_FETCH_W_SPEC_TMP_HANDLER,
! 32223: ZEND_FETCH_W_SPEC_TMP_HANDLER,
! 32224: ZEND_FETCH_W_SPEC_TMP_HANDLER,
! 32225: ZEND_FETCH_W_SPEC_VAR_HANDLER,
! 32226: ZEND_FETCH_W_SPEC_VAR_HANDLER,
! 32227: ZEND_FETCH_W_SPEC_VAR_HANDLER,
! 32228: ZEND_FETCH_W_SPEC_VAR_HANDLER,
! 32229: ZEND_FETCH_W_SPEC_VAR_HANDLER,
! 32230: ZEND_NULL_HANDLER,
! 32231: ZEND_NULL_HANDLER,
! 32232: ZEND_NULL_HANDLER,
! 32233: ZEND_NULL_HANDLER,
! 32234: ZEND_NULL_HANDLER,
! 32235: ZEND_FETCH_W_SPEC_CV_HANDLER,
! 32236: ZEND_FETCH_W_SPEC_CV_HANDLER,
! 32237: ZEND_FETCH_W_SPEC_CV_HANDLER,
! 32238: ZEND_FETCH_W_SPEC_CV_HANDLER,
! 32239: ZEND_FETCH_W_SPEC_CV_HANDLER,
! 32240: ZEND_NULL_HANDLER,
! 32241: ZEND_NULL_HANDLER,
! 32242: ZEND_NULL_HANDLER,
! 32243: ZEND_NULL_HANDLER,
! 32244: ZEND_NULL_HANDLER,
! 32245: ZEND_NULL_HANDLER,
! 32246: ZEND_NULL_HANDLER,
! 32247: ZEND_NULL_HANDLER,
! 32248: ZEND_NULL_HANDLER,
! 32249: ZEND_NULL_HANDLER,
! 32250: ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER,
! 32251: ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER,
! 32252: ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER,
! 32253: ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER,
! 32254: ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER,
! 32255: ZEND_NULL_HANDLER,
! 32256: ZEND_NULL_HANDLER,
! 32257: ZEND_NULL_HANDLER,
! 32258: ZEND_NULL_HANDLER,
! 32259: ZEND_NULL_HANDLER,
! 32260: ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER,
! 32261: ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER,
! 32262: ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER,
! 32263: ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER,
! 32264: ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER,
! 32265: ZEND_NULL_HANDLER,
! 32266: ZEND_NULL_HANDLER,
! 32267: ZEND_NULL_HANDLER,
! 32268: ZEND_NULL_HANDLER,
! 32269: ZEND_NULL_HANDLER,
! 32270: ZEND_NULL_HANDLER,
! 32271: ZEND_NULL_HANDLER,
! 32272: ZEND_NULL_HANDLER,
! 32273: ZEND_NULL_HANDLER,
! 32274: ZEND_NULL_HANDLER,
! 32275: ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER,
! 32276: ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER,
! 32277: ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER,
! 32278: ZEND_NULL_HANDLER,
! 32279: ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER,
! 32280: ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER,
! 32281: ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER,
! 32282: ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER,
! 32283: ZEND_NULL_HANDLER,
! 32284: ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER,
! 32285: ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER,
! 32286: ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER,
! 32287: ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER,
! 32288: ZEND_NULL_HANDLER,
! 32289: ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER,
! 32290: ZEND_FETCH_RW_SPEC_CONST_HANDLER,
! 32291: ZEND_FETCH_RW_SPEC_CONST_HANDLER,
! 32292: ZEND_FETCH_RW_SPEC_CONST_HANDLER,
! 32293: ZEND_FETCH_RW_SPEC_CONST_HANDLER,
! 32294: ZEND_FETCH_RW_SPEC_CONST_HANDLER,
! 32295: ZEND_FETCH_RW_SPEC_TMP_HANDLER,
! 32296: ZEND_FETCH_RW_SPEC_TMP_HANDLER,
! 32297: ZEND_FETCH_RW_SPEC_TMP_HANDLER,
! 32298: ZEND_FETCH_RW_SPEC_TMP_HANDLER,
! 32299: ZEND_FETCH_RW_SPEC_TMP_HANDLER,
! 32300: ZEND_FETCH_RW_SPEC_VAR_HANDLER,
! 32301: ZEND_FETCH_RW_SPEC_VAR_HANDLER,
! 32302: ZEND_FETCH_RW_SPEC_VAR_HANDLER,
! 32303: ZEND_FETCH_RW_SPEC_VAR_HANDLER,
! 32304: ZEND_FETCH_RW_SPEC_VAR_HANDLER,
! 32305: ZEND_NULL_HANDLER,
! 32306: ZEND_NULL_HANDLER,
! 32307: ZEND_NULL_HANDLER,
! 32308: ZEND_NULL_HANDLER,
! 32309: ZEND_NULL_HANDLER,
! 32310: ZEND_FETCH_RW_SPEC_CV_HANDLER,
! 32311: ZEND_FETCH_RW_SPEC_CV_HANDLER,
! 32312: ZEND_FETCH_RW_SPEC_CV_HANDLER,
! 32313: ZEND_FETCH_RW_SPEC_CV_HANDLER,
! 32314: ZEND_FETCH_RW_SPEC_CV_HANDLER,
! 32315: ZEND_NULL_HANDLER,
! 32316: ZEND_NULL_HANDLER,
! 32317: ZEND_NULL_HANDLER,
! 32318: ZEND_NULL_HANDLER,
! 32319: ZEND_NULL_HANDLER,
! 32320: ZEND_NULL_HANDLER,
! 32321: ZEND_NULL_HANDLER,
! 32322: ZEND_NULL_HANDLER,
! 32323: ZEND_NULL_HANDLER,
! 32324: ZEND_NULL_HANDLER,
! 32325: ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER,
! 32326: ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER,
! 32327: ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER,
! 32328: ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER,
! 32329: ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER,
! 32330: ZEND_NULL_HANDLER,
! 32331: ZEND_NULL_HANDLER,
! 32332: ZEND_NULL_HANDLER,
! 32333: ZEND_NULL_HANDLER,
! 32334: ZEND_NULL_HANDLER,
! 32335: ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER,
! 32336: ZEND_FETCH_DIM_RW_SPEC_CV_TMP_HANDLER,
! 32337: ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER,
! 32338: ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER,
! 32339: ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER,
! 32340: ZEND_NULL_HANDLER,
! 32341: ZEND_NULL_HANDLER,
! 32342: ZEND_NULL_HANDLER,
! 32343: ZEND_NULL_HANDLER,
! 32344: ZEND_NULL_HANDLER,
! 32345: ZEND_NULL_HANDLER,
! 32346: ZEND_NULL_HANDLER,
! 32347: ZEND_NULL_HANDLER,
! 32348: ZEND_NULL_HANDLER,
! 32349: ZEND_NULL_HANDLER,
! 32350: ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER,
! 32351: ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER,
! 32352: ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER,
! 32353: ZEND_NULL_HANDLER,
! 32354: ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER,
! 32355: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER,
! 32356: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMP_HANDLER,
! 32357: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER,
! 32358: ZEND_NULL_HANDLER,
! 32359: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER,
! 32360: ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER,
! 32361: ZEND_FETCH_OBJ_RW_SPEC_CV_TMP_HANDLER,
! 32362: ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER,
! 32363: ZEND_NULL_HANDLER,
! 32364: ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER,
! 32365: ZEND_FETCH_IS_SPEC_CONST_HANDLER,
! 32366: ZEND_FETCH_IS_SPEC_CONST_HANDLER,
! 32367: ZEND_FETCH_IS_SPEC_CONST_HANDLER,
! 32368: ZEND_FETCH_IS_SPEC_CONST_HANDLER,
! 32369: ZEND_FETCH_IS_SPEC_CONST_HANDLER,
! 32370: ZEND_FETCH_IS_SPEC_TMP_HANDLER,
! 32371: ZEND_FETCH_IS_SPEC_TMP_HANDLER,
! 32372: ZEND_FETCH_IS_SPEC_TMP_HANDLER,
! 32373: ZEND_FETCH_IS_SPEC_TMP_HANDLER,
! 32374: ZEND_FETCH_IS_SPEC_TMP_HANDLER,
! 32375: ZEND_FETCH_IS_SPEC_VAR_HANDLER,
! 32376: ZEND_FETCH_IS_SPEC_VAR_HANDLER,
! 32377: ZEND_FETCH_IS_SPEC_VAR_HANDLER,
! 32378: ZEND_FETCH_IS_SPEC_VAR_HANDLER,
! 32379: ZEND_FETCH_IS_SPEC_VAR_HANDLER,
! 32380: ZEND_NULL_HANDLER,
! 32381: ZEND_NULL_HANDLER,
! 32382: ZEND_NULL_HANDLER,
! 32383: ZEND_NULL_HANDLER,
! 32384: ZEND_NULL_HANDLER,
! 32385: ZEND_FETCH_IS_SPEC_CV_HANDLER,
! 32386: ZEND_FETCH_IS_SPEC_CV_HANDLER,
! 32387: ZEND_FETCH_IS_SPEC_CV_HANDLER,
! 32388: ZEND_FETCH_IS_SPEC_CV_HANDLER,
! 32389: ZEND_FETCH_IS_SPEC_CV_HANDLER,
! 32390: ZEND_NULL_HANDLER,
! 32391: ZEND_NULL_HANDLER,
! 32392: ZEND_NULL_HANDLER,
! 32393: ZEND_NULL_HANDLER,
! 32394: ZEND_NULL_HANDLER,
! 32395: ZEND_NULL_HANDLER,
! 32396: ZEND_NULL_HANDLER,
! 32397: ZEND_NULL_HANDLER,
! 32398: ZEND_NULL_HANDLER,
! 32399: ZEND_NULL_HANDLER,
! 32400: ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER,
! 32401: ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER,
! 32402: ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER,
! 32403: ZEND_NULL_HANDLER,
! 32404: ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER,
! 32405: ZEND_NULL_HANDLER,
! 32406: ZEND_NULL_HANDLER,
! 32407: ZEND_NULL_HANDLER,
! 32408: ZEND_NULL_HANDLER,
! 32409: ZEND_NULL_HANDLER,
! 32410: ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER,
! 32411: ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER,
! 32412: ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER,
! 32413: ZEND_NULL_HANDLER,
! 32414: ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER,
! 32415: ZEND_NULL_HANDLER,
! 32416: ZEND_NULL_HANDLER,
! 32417: ZEND_NULL_HANDLER,
! 32418: ZEND_NULL_HANDLER,
! 32419: ZEND_NULL_HANDLER,
! 32420: ZEND_NULL_HANDLER,
! 32421: ZEND_NULL_HANDLER,
! 32422: ZEND_NULL_HANDLER,
! 32423: ZEND_NULL_HANDLER,
! 32424: ZEND_NULL_HANDLER,
! 32425: ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER,
! 32426: ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER,
! 32427: ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER,
! 32428: ZEND_NULL_HANDLER,
! 32429: ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER,
! 32430: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER,
! 32431: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMP_HANDLER,
! 32432: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER,
! 32433: ZEND_NULL_HANDLER,
! 32434: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER,
! 32435: ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER,
! 32436: ZEND_FETCH_OBJ_IS_SPEC_CV_TMP_HANDLER,
! 32437: ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER,
! 32438: ZEND_NULL_HANDLER,
! 32439: ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER,
! 32440: ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER,
! 32441: ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER,
! 32442: ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER,
! 32443: ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER,
! 32444: ZEND_FETCH_FUNC_ARG_SPEC_CONST_HANDLER,
! 32445: ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER,
! 32446: ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER,
! 32447: ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER,
! 32448: ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER,
! 32449: ZEND_FETCH_FUNC_ARG_SPEC_TMP_HANDLER,
! 32450: ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER,
! 32451: ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER,
! 32452: ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER,
! 32453: ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER,
! 32454: ZEND_FETCH_FUNC_ARG_SPEC_VAR_HANDLER,
! 32455: ZEND_NULL_HANDLER,
! 32456: ZEND_NULL_HANDLER,
! 32457: ZEND_NULL_HANDLER,
! 32458: ZEND_NULL_HANDLER,
! 32459: ZEND_NULL_HANDLER,
! 32460: ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER,
! 32461: ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER,
! 32462: ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER,
! 32463: ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER,
! 32464: ZEND_FETCH_FUNC_ARG_SPEC_CV_HANDLER,
! 32465: ZEND_NULL_HANDLER,
! 32466: ZEND_NULL_HANDLER,
! 32467: ZEND_NULL_HANDLER,
! 32468: ZEND_NULL_HANDLER,
! 32469: ZEND_NULL_HANDLER,
! 32470: ZEND_NULL_HANDLER,
! 32471: ZEND_NULL_HANDLER,
! 32472: ZEND_NULL_HANDLER,
! 32473: ZEND_NULL_HANDLER,
! 32474: ZEND_NULL_HANDLER,
! 32475: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
! 32476: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER,
! 32477: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER,
! 32478: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER,
! 32479: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER,
! 32480: ZEND_NULL_HANDLER,
! 32481: ZEND_NULL_HANDLER,
! 32482: ZEND_NULL_HANDLER,
! 32483: ZEND_NULL_HANDLER,
! 32484: ZEND_NULL_HANDLER,
! 32485: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER,
! 32486: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER,
! 32487: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER,
! 32488: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER,
! 32489: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER,
! 32490: ZEND_NULL_HANDLER,
! 32491: ZEND_NULL_HANDLER,
! 32492: ZEND_NULL_HANDLER,
! 32493: ZEND_NULL_HANDLER,
! 32494: ZEND_NULL_HANDLER,
! 32495: ZEND_NULL_HANDLER,
! 32496: ZEND_NULL_HANDLER,
! 32497: ZEND_NULL_HANDLER,
! 32498: ZEND_NULL_HANDLER,
! 32499: ZEND_NULL_HANDLER,
! 32500: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
! 32501: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMP_HANDLER,
! 32502: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER,
! 32503: ZEND_NULL_HANDLER,
! 32504: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER,
! 32505: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER,
! 32506: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMP_HANDLER,
! 32507: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER,
! 32508: ZEND_NULL_HANDLER,
! 32509: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER,
! 32510: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER,
! 32511: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP_HANDLER,
! 32512: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER,
! 32513: ZEND_NULL_HANDLER,
! 32514: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER,
! 32515: ZEND_FETCH_UNSET_SPEC_CONST_HANDLER,
! 32516: ZEND_FETCH_UNSET_SPEC_CONST_HANDLER,
! 32517: ZEND_FETCH_UNSET_SPEC_CONST_HANDLER,
! 32518: ZEND_FETCH_UNSET_SPEC_CONST_HANDLER,
! 32519: ZEND_FETCH_UNSET_SPEC_CONST_HANDLER,
! 32520: ZEND_FETCH_UNSET_SPEC_TMP_HANDLER,
! 32521: ZEND_FETCH_UNSET_SPEC_TMP_HANDLER,
! 32522: ZEND_FETCH_UNSET_SPEC_TMP_HANDLER,
! 32523: ZEND_FETCH_UNSET_SPEC_TMP_HANDLER,
! 32524: ZEND_FETCH_UNSET_SPEC_TMP_HANDLER,
! 32525: ZEND_FETCH_UNSET_SPEC_VAR_HANDLER,
! 32526: ZEND_FETCH_UNSET_SPEC_VAR_HANDLER,
! 32527: ZEND_FETCH_UNSET_SPEC_VAR_HANDLER,
! 32528: ZEND_FETCH_UNSET_SPEC_VAR_HANDLER,
! 32529: ZEND_FETCH_UNSET_SPEC_VAR_HANDLER,
! 32530: ZEND_NULL_HANDLER,
! 32531: ZEND_NULL_HANDLER,
! 32532: ZEND_NULL_HANDLER,
! 32533: ZEND_NULL_HANDLER,
! 32534: ZEND_NULL_HANDLER,
! 32535: ZEND_FETCH_UNSET_SPEC_CV_HANDLER,
! 32536: ZEND_FETCH_UNSET_SPEC_CV_HANDLER,
! 32537: ZEND_FETCH_UNSET_SPEC_CV_HANDLER,
! 32538: ZEND_FETCH_UNSET_SPEC_CV_HANDLER,
! 32539: ZEND_FETCH_UNSET_SPEC_CV_HANDLER,
! 32540: ZEND_NULL_HANDLER,
! 32541: ZEND_NULL_HANDLER,
! 32542: ZEND_NULL_HANDLER,
! 32543: ZEND_NULL_HANDLER,
! 32544: ZEND_NULL_HANDLER,
! 32545: ZEND_NULL_HANDLER,
! 32546: ZEND_NULL_HANDLER,
! 32547: ZEND_NULL_HANDLER,
! 32548: ZEND_NULL_HANDLER,
! 32549: ZEND_NULL_HANDLER,
! 32550: ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER,
! 32551: ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER,
! 32552: ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER,
! 32553: ZEND_NULL_HANDLER,
! 32554: ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER,
! 32555: ZEND_NULL_HANDLER,
! 32556: ZEND_NULL_HANDLER,
! 32557: ZEND_NULL_HANDLER,
! 32558: ZEND_NULL_HANDLER,
! 32559: ZEND_NULL_HANDLER,
! 32560: ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER,
! 32561: ZEND_FETCH_DIM_UNSET_SPEC_CV_TMP_HANDLER,
! 32562: ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER,
! 32563: ZEND_NULL_HANDLER,
! 32564: ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER,
! 32565: ZEND_NULL_HANDLER,
! 32566: ZEND_NULL_HANDLER,
! 32567: ZEND_NULL_HANDLER,
! 32568: ZEND_NULL_HANDLER,
! 32569: ZEND_NULL_HANDLER,
! 32570: ZEND_NULL_HANDLER,
! 32571: ZEND_NULL_HANDLER,
! 32572: ZEND_NULL_HANDLER,
! 32573: ZEND_NULL_HANDLER,
! 32574: ZEND_NULL_HANDLER,
! 32575: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER,
! 32576: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER,
! 32577: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER,
! 32578: ZEND_NULL_HANDLER,
! 32579: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER,
! 32580: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER,
! 32581: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER,
! 32582: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER,
! 32583: ZEND_NULL_HANDLER,
! 32584: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER,
! 32585: ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER,
! 32586: ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMP_HANDLER,
! 32587: ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER,
! 32588: ZEND_NULL_HANDLER,
! 32589: ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER,
! 32590: ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER,
! 32591: ZEND_NULL_HANDLER,
! 32592: ZEND_NULL_HANDLER,
! 32593: ZEND_NULL_HANDLER,
! 32594: ZEND_NULL_HANDLER,
! 32595: ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER,
! 32596: ZEND_NULL_HANDLER,
! 32597: ZEND_NULL_HANDLER,
! 32598: ZEND_NULL_HANDLER,
! 32599: ZEND_NULL_HANDLER,
! 32600: ZEND_NULL_HANDLER,
! 32601: ZEND_NULL_HANDLER,
! 32602: ZEND_NULL_HANDLER,
! 32603: ZEND_NULL_HANDLER,
! 32604: ZEND_NULL_HANDLER,
! 32605: ZEND_NULL_HANDLER,
! 32606: ZEND_NULL_HANDLER,
! 32607: ZEND_NULL_HANDLER,
! 32608: ZEND_NULL_HANDLER,
! 32609: ZEND_NULL_HANDLER,
! 32610: ZEND_NULL_HANDLER,
! 32611: ZEND_NULL_HANDLER,
! 32612: ZEND_NULL_HANDLER,
! 32613: ZEND_NULL_HANDLER,
! 32614: ZEND_NULL_HANDLER,
! 32615: ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER,
! 32616: ZEND_NULL_HANDLER,
! 32617: ZEND_NULL_HANDLER,
! 32618: ZEND_NULL_HANDLER,
! 32619: ZEND_NULL_HANDLER,
! 32620: ZEND_NULL_HANDLER,
! 32621: ZEND_NULL_HANDLER,
! 32622: ZEND_NULL_HANDLER,
! 32623: ZEND_NULL_HANDLER,
! 32624: ZEND_NULL_HANDLER,
! 32625: ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER,
! 32626: ZEND_NULL_HANDLER,
! 32627: ZEND_NULL_HANDLER,
! 32628: ZEND_NULL_HANDLER,
! 32629: ZEND_NULL_HANDLER,
! 32630: ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER,
! 32631: ZEND_NULL_HANDLER,
! 32632: ZEND_NULL_HANDLER,
! 32633: ZEND_NULL_HANDLER,
! 32634: ZEND_NULL_HANDLER,
! 32635: ZEND_NULL_HANDLER,
! 32636: ZEND_NULL_HANDLER,
! 32637: ZEND_NULL_HANDLER,
! 32638: ZEND_NULL_HANDLER,
! 32639: ZEND_NULL_HANDLER,
! 32640: ZEND_GOTO_SPEC_CONST_HANDLER,
! 32641: ZEND_NULL_HANDLER,
! 32642: ZEND_NULL_HANDLER,
! 32643: ZEND_NULL_HANDLER,
! 32644: ZEND_NULL_HANDLER,
! 32645: ZEND_GOTO_SPEC_CONST_HANDLER,
! 32646: ZEND_NULL_HANDLER,
! 32647: ZEND_NULL_HANDLER,
! 32648: ZEND_NULL_HANDLER,
! 32649: ZEND_NULL_HANDLER,
! 32650: ZEND_GOTO_SPEC_CONST_HANDLER,
! 32651: ZEND_NULL_HANDLER,
! 32652: ZEND_NULL_HANDLER,
! 32653: ZEND_NULL_HANDLER,
! 32654: ZEND_NULL_HANDLER,
! 32655: ZEND_GOTO_SPEC_CONST_HANDLER,
! 32656: ZEND_NULL_HANDLER,
! 32657: ZEND_NULL_HANDLER,
! 32658: ZEND_NULL_HANDLER,
! 32659: ZEND_NULL_HANDLER,
! 32660: ZEND_GOTO_SPEC_CONST_HANDLER,
! 32661: ZEND_NULL_HANDLER,
! 32662: ZEND_NULL_HANDLER,
! 32663: ZEND_NULL_HANDLER,
! 32664: ZEND_NULL_HANDLER,
! 32665: ZEND_EXT_STMT_SPEC_HANDLER,
! 32666: ZEND_EXT_STMT_SPEC_HANDLER,
! 32667: ZEND_EXT_STMT_SPEC_HANDLER,
! 32668: ZEND_EXT_STMT_SPEC_HANDLER,
! 32669: ZEND_EXT_STMT_SPEC_HANDLER,
! 32670: ZEND_EXT_STMT_SPEC_HANDLER,
! 32671: ZEND_EXT_STMT_SPEC_HANDLER,
! 32672: ZEND_EXT_STMT_SPEC_HANDLER,
! 32673: ZEND_EXT_STMT_SPEC_HANDLER,
! 32674: ZEND_EXT_STMT_SPEC_HANDLER,
! 32675: ZEND_EXT_STMT_SPEC_HANDLER,
! 32676: ZEND_EXT_STMT_SPEC_HANDLER,
! 32677: ZEND_EXT_STMT_SPEC_HANDLER,
! 32678: ZEND_EXT_STMT_SPEC_HANDLER,
! 32679: ZEND_EXT_STMT_SPEC_HANDLER,
! 32680: ZEND_EXT_STMT_SPEC_HANDLER,
! 32681: ZEND_EXT_STMT_SPEC_HANDLER,
! 32682: ZEND_EXT_STMT_SPEC_HANDLER,
! 32683: ZEND_EXT_STMT_SPEC_HANDLER,
! 32684: ZEND_EXT_STMT_SPEC_HANDLER,
! 32685: ZEND_EXT_STMT_SPEC_HANDLER,
! 32686: ZEND_EXT_STMT_SPEC_HANDLER,
! 32687: ZEND_EXT_STMT_SPEC_HANDLER,
! 32688: ZEND_EXT_STMT_SPEC_HANDLER,
! 32689: ZEND_EXT_STMT_SPEC_HANDLER,
! 32690: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32691: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32692: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32693: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32694: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32695: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32696: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32697: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32698: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32699: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32700: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32701: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32702: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32703: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32704: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32705: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32706: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32707: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32708: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32709: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32710: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32711: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32712: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32713: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32714: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
! 32715: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32716: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32717: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32718: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32719: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32720: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32721: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32722: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32723: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32724: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32725: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32726: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32727: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32728: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32729: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32730: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32731: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32732: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32733: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32734: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32735: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32736: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32737: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32738: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32739: ZEND_EXT_FCALL_END_SPEC_HANDLER,
! 32740: ZEND_EXT_NOP_SPEC_HANDLER,
! 32741: ZEND_EXT_NOP_SPEC_HANDLER,
! 32742: ZEND_EXT_NOP_SPEC_HANDLER,
! 32743: ZEND_EXT_NOP_SPEC_HANDLER,
! 32744: ZEND_EXT_NOP_SPEC_HANDLER,
! 32745: ZEND_EXT_NOP_SPEC_HANDLER,
! 32746: ZEND_EXT_NOP_SPEC_HANDLER,
! 32747: ZEND_EXT_NOP_SPEC_HANDLER,
! 32748: ZEND_EXT_NOP_SPEC_HANDLER,
! 32749: ZEND_EXT_NOP_SPEC_HANDLER,
! 32750: ZEND_EXT_NOP_SPEC_HANDLER,
! 32751: ZEND_EXT_NOP_SPEC_HANDLER,
! 32752: ZEND_EXT_NOP_SPEC_HANDLER,
! 32753: ZEND_EXT_NOP_SPEC_HANDLER,
! 32754: ZEND_EXT_NOP_SPEC_HANDLER,
! 32755: ZEND_EXT_NOP_SPEC_HANDLER,
! 32756: ZEND_EXT_NOP_SPEC_HANDLER,
! 32757: ZEND_EXT_NOP_SPEC_HANDLER,
! 32758: ZEND_EXT_NOP_SPEC_HANDLER,
! 32759: ZEND_EXT_NOP_SPEC_HANDLER,
! 32760: ZEND_EXT_NOP_SPEC_HANDLER,
! 32761: ZEND_EXT_NOP_SPEC_HANDLER,
! 32762: ZEND_EXT_NOP_SPEC_HANDLER,
! 32763: ZEND_EXT_NOP_SPEC_HANDLER,
! 32764: ZEND_EXT_NOP_SPEC_HANDLER,
! 32765: ZEND_TICKS_SPEC_CONST_HANDLER,
! 32766: ZEND_TICKS_SPEC_CONST_HANDLER,
! 32767: ZEND_TICKS_SPEC_CONST_HANDLER,
! 32768: ZEND_TICKS_SPEC_CONST_HANDLER,
! 32769: ZEND_TICKS_SPEC_CONST_HANDLER,
! 32770: ZEND_NULL_HANDLER,
! 32771: ZEND_NULL_HANDLER,
! 32772: ZEND_NULL_HANDLER,
! 32773: ZEND_NULL_HANDLER,
! 32774: ZEND_NULL_HANDLER,
! 32775: ZEND_NULL_HANDLER,
! 32776: ZEND_NULL_HANDLER,
! 32777: ZEND_NULL_HANDLER,
! 32778: ZEND_NULL_HANDLER,
! 32779: ZEND_NULL_HANDLER,
! 32780: ZEND_NULL_HANDLER,
! 32781: ZEND_NULL_HANDLER,
! 32782: ZEND_NULL_HANDLER,
! 32783: ZEND_NULL_HANDLER,
! 32784: ZEND_NULL_HANDLER,
! 32785: ZEND_NULL_HANDLER,
! 32786: ZEND_NULL_HANDLER,
! 32787: ZEND_NULL_HANDLER,
! 32788: ZEND_NULL_HANDLER,
! 32789: ZEND_NULL_HANDLER,
! 32790: ZEND_NULL_HANDLER,
! 32791: ZEND_NULL_HANDLER,
! 32792: ZEND_NULL_HANDLER,
! 32793: ZEND_NULL_HANDLER,
! 32794: ZEND_NULL_HANDLER,
! 32795: ZEND_NULL_HANDLER,
! 32796: ZEND_NULL_HANDLER,
! 32797: ZEND_NULL_HANDLER,
! 32798: ZEND_NULL_HANDLER,
! 32799: ZEND_NULL_HANDLER,
! 32800: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
! 32801: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
! 32802: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
! 32803: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
! 32804: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
! 32805: ZEND_NULL_HANDLER,
! 32806: ZEND_NULL_HANDLER,
! 32807: ZEND_NULL_HANDLER,
! 32808: ZEND_NULL_HANDLER,
! 32809: ZEND_NULL_HANDLER,
! 32810: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
! 32811: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
! 32812: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
! 32813: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
! 32814: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
! 32815: ZEND_NULL_HANDLER,
! 32816: ZEND_NULL_HANDLER,
! 32817: ZEND_NULL_HANDLER,
! 32818: ZEND_NULL_HANDLER,
! 32819: ZEND_CATCH_SPEC_CV_HANDLER,
! 32820: ZEND_NULL_HANDLER,
! 32821: ZEND_NULL_HANDLER,
! 32822: ZEND_NULL_HANDLER,
! 32823: ZEND_NULL_HANDLER,
! 32824: ZEND_CATCH_SPEC_CV_HANDLER,
! 32825: ZEND_NULL_HANDLER,
! 32826: ZEND_NULL_HANDLER,
! 32827: ZEND_NULL_HANDLER,
! 32828: ZEND_NULL_HANDLER,
! 32829: ZEND_CATCH_SPEC_CV_HANDLER,
! 32830: ZEND_NULL_HANDLER,
! 32831: ZEND_NULL_HANDLER,
! 32832: ZEND_NULL_HANDLER,
! 32833: ZEND_NULL_HANDLER,
! 32834: ZEND_CATCH_SPEC_CV_HANDLER,
! 32835: ZEND_NULL_HANDLER,
! 32836: ZEND_NULL_HANDLER,
! 32837: ZEND_NULL_HANDLER,
! 32838: ZEND_NULL_HANDLER,
! 32839: ZEND_CATCH_SPEC_CV_HANDLER,
! 32840: ZEND_THROW_SPEC_CONST_HANDLER,
! 32841: ZEND_THROW_SPEC_CONST_HANDLER,
! 32842: ZEND_THROW_SPEC_CONST_HANDLER,
! 32843: ZEND_THROW_SPEC_CONST_HANDLER,
! 32844: ZEND_THROW_SPEC_CONST_HANDLER,
! 32845: ZEND_THROW_SPEC_TMP_HANDLER,
! 32846: ZEND_THROW_SPEC_TMP_HANDLER,
! 32847: ZEND_THROW_SPEC_TMP_HANDLER,
! 32848: ZEND_THROW_SPEC_TMP_HANDLER,
! 32849: ZEND_THROW_SPEC_TMP_HANDLER,
! 32850: ZEND_THROW_SPEC_VAR_HANDLER,
! 32851: ZEND_THROW_SPEC_VAR_HANDLER,
! 32852: ZEND_THROW_SPEC_VAR_HANDLER,
! 32853: ZEND_THROW_SPEC_VAR_HANDLER,
! 32854: ZEND_THROW_SPEC_VAR_HANDLER,
! 32855: ZEND_NULL_HANDLER,
! 32856: ZEND_NULL_HANDLER,
! 32857: ZEND_NULL_HANDLER,
! 32858: ZEND_NULL_HANDLER,
! 32859: ZEND_NULL_HANDLER,
! 32860: ZEND_THROW_SPEC_CV_HANDLER,
! 32861: ZEND_THROW_SPEC_CV_HANDLER,
! 32862: ZEND_THROW_SPEC_CV_HANDLER,
! 32863: ZEND_THROW_SPEC_CV_HANDLER,
! 32864: ZEND_THROW_SPEC_CV_HANDLER,
! 32865: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
! 32866: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
! 32867: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
! 32868: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
! 32869: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
! 32870: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
! 32871: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
! 32872: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
! 32873: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
! 32874: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
! 32875: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
! 32876: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
! 32877: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
! 32878: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
! 32879: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
! 32880: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
! 32881: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
! 32882: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
! 32883: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
! 32884: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
! 32885: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
! 32886: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
! 32887: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
! 32888: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
! 32889: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
! 32890: ZEND_CLONE_SPEC_CONST_HANDLER,
! 32891: ZEND_CLONE_SPEC_CONST_HANDLER,
! 32892: ZEND_CLONE_SPEC_CONST_HANDLER,
! 32893: ZEND_CLONE_SPEC_CONST_HANDLER,
! 32894: ZEND_CLONE_SPEC_CONST_HANDLER,
! 32895: ZEND_CLONE_SPEC_TMP_HANDLER,
! 32896: ZEND_CLONE_SPEC_TMP_HANDLER,
! 32897: ZEND_CLONE_SPEC_TMP_HANDLER,
! 32898: ZEND_CLONE_SPEC_TMP_HANDLER,
! 32899: ZEND_CLONE_SPEC_TMP_HANDLER,
! 32900: ZEND_CLONE_SPEC_VAR_HANDLER,
! 32901: ZEND_CLONE_SPEC_VAR_HANDLER,
! 32902: ZEND_CLONE_SPEC_VAR_HANDLER,
! 32903: ZEND_CLONE_SPEC_VAR_HANDLER,
! 32904: ZEND_CLONE_SPEC_VAR_HANDLER,
! 32905: ZEND_CLONE_SPEC_UNUSED_HANDLER,
! 32906: ZEND_CLONE_SPEC_UNUSED_HANDLER,
! 32907: ZEND_CLONE_SPEC_UNUSED_HANDLER,
! 32908: ZEND_CLONE_SPEC_UNUSED_HANDLER,
! 32909: ZEND_CLONE_SPEC_UNUSED_HANDLER,
! 32910: ZEND_CLONE_SPEC_CV_HANDLER,
! 32911: ZEND_CLONE_SPEC_CV_HANDLER,
! 32912: ZEND_CLONE_SPEC_CV_HANDLER,
! 32913: ZEND_CLONE_SPEC_CV_HANDLER,
! 32914: ZEND_CLONE_SPEC_CV_HANDLER,
! 32915: ZEND_NULL_HANDLER,
! 32916: ZEND_NULL_HANDLER,
! 32917: ZEND_NULL_HANDLER,
! 32918: ZEND_NULL_HANDLER,
! 32919: ZEND_NULL_HANDLER,
! 32920: ZEND_NULL_HANDLER,
! 32921: ZEND_NULL_HANDLER,
! 32922: ZEND_NULL_HANDLER,
! 32923: ZEND_NULL_HANDLER,
! 32924: ZEND_NULL_HANDLER,
! 32925: ZEND_NULL_HANDLER,
! 32926: ZEND_NULL_HANDLER,
! 32927: ZEND_NULL_HANDLER,
! 32928: ZEND_NULL_HANDLER,
! 32929: ZEND_NULL_HANDLER,
! 32930: ZEND_NULL_HANDLER,
! 32931: ZEND_NULL_HANDLER,
! 32932: ZEND_NULL_HANDLER,
! 32933: ZEND_NULL_HANDLER,
! 32934: ZEND_NULL_HANDLER,
! 32935: ZEND_NULL_HANDLER,
! 32936: ZEND_NULL_HANDLER,
! 32937: ZEND_NULL_HANDLER,
! 32938: ZEND_NULL_HANDLER,
! 32939: ZEND_NULL_HANDLER,
! 32940: ZEND_NULL_HANDLER,
! 32941: ZEND_NULL_HANDLER,
! 32942: ZEND_NULL_HANDLER,
! 32943: ZEND_NULL_HANDLER,
! 32944: ZEND_NULL_HANDLER,
! 32945: ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER,
! 32946: ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER,
! 32947: ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER,
! 32948: ZEND_NULL_HANDLER,
! 32949: ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER,
! 32950: ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER,
! 32951: ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER,
! 32952: ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER,
! 32953: ZEND_NULL_HANDLER,
! 32954: ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER,
! 32955: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER,
! 32956: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER,
! 32957: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER,
! 32958: ZEND_NULL_HANDLER,
! 32959: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER,
! 32960: ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER,
! 32961: ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER,
! 32962: ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER,
! 32963: ZEND_NULL_HANDLER,
! 32964: ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER,
! 32965: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER,
! 32966: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER,
! 32967: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER,
! 32968: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER,
! 32969: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER,
! 32970: ZEND_NULL_HANDLER,
! 32971: ZEND_NULL_HANDLER,
! 32972: ZEND_NULL_HANDLER,
! 32973: ZEND_NULL_HANDLER,
! 32974: ZEND_NULL_HANDLER,
! 32975: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER,
! 32976: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER,
! 32977: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER,
! 32978: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER,
! 32979: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER,
! 32980: ZEND_NULL_HANDLER,
! 32981: ZEND_NULL_HANDLER,
! 32982: ZEND_NULL_HANDLER,
! 32983: ZEND_NULL_HANDLER,
! 32984: ZEND_NULL_HANDLER,
! 32985: ZEND_NULL_HANDLER,
! 32986: ZEND_NULL_HANDLER,
! 32987: ZEND_NULL_HANDLER,
! 32988: ZEND_NULL_HANDLER,
! 32989: ZEND_NULL_HANDLER,
! 32990: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER,
! 32991: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER,
! 32992: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER,
! 32993: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER,
! 32994: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER,
! 32995: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER,
! 32996: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER,
! 32997: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER,
! 32998: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER,
! 32999: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER,
! 33000: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER,
! 33001: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER,
! 33002: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER,
! 33003: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER,
! 33004: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER,
! 33005: ZEND_NULL_HANDLER,
! 33006: ZEND_NULL_HANDLER,
! 33007: ZEND_NULL_HANDLER,
! 33008: ZEND_NULL_HANDLER,
! 33009: ZEND_NULL_HANDLER,
! 33010: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER,
! 33011: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER,
! 33012: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER,
! 33013: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER,
! 33014: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER,
! 33015: ZEND_NULL_HANDLER,
! 33016: ZEND_NULL_HANDLER,
! 33017: ZEND_NULL_HANDLER,
! 33018: ZEND_NULL_HANDLER,
! 33019: ZEND_NULL_HANDLER,
! 33020: ZEND_NULL_HANDLER,
! 33021: ZEND_NULL_HANDLER,
! 33022: ZEND_NULL_HANDLER,
! 33023: ZEND_NULL_HANDLER,
! 33024: ZEND_NULL_HANDLER,
! 33025: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER,
! 33026: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER,
! 33027: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER,
! 33028: ZEND_NULL_HANDLER,
! 33029: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER,
! 33030: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33031: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33032: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33033: ZEND_NULL_HANDLER,
! 33034: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33035: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER,
! 33036: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER,
! 33037: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER,
! 33038: ZEND_NULL_HANDLER,
! 33039: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER,
! 33040: ZEND_NULL_HANDLER,
! 33041: ZEND_NULL_HANDLER,
! 33042: ZEND_NULL_HANDLER,
! 33043: ZEND_NULL_HANDLER,
! 33044: ZEND_NULL_HANDLER,
! 33045: ZEND_NULL_HANDLER,
! 33046: ZEND_NULL_HANDLER,
! 33047: ZEND_NULL_HANDLER,
! 33048: ZEND_NULL_HANDLER,
! 33049: ZEND_NULL_HANDLER,
! 33050: ZEND_NULL_HANDLER,
! 33051: ZEND_NULL_HANDLER,
! 33052: ZEND_NULL_HANDLER,
! 33053: ZEND_NULL_HANDLER,
! 33054: ZEND_NULL_HANDLER,
! 33055: ZEND_NULL_HANDLER,
! 33056: ZEND_NULL_HANDLER,
! 33057: ZEND_NULL_HANDLER,
! 33058: ZEND_NULL_HANDLER,
! 33059: ZEND_NULL_HANDLER,
! 33060: ZEND_NULL_HANDLER,
! 33061: ZEND_NULL_HANDLER,
! 33062: ZEND_NULL_HANDLER,
! 33063: ZEND_NULL_HANDLER,
! 33064: ZEND_NULL_HANDLER,
! 33065: ZEND_NULL_HANDLER,
! 33066: ZEND_NULL_HANDLER,
! 33067: ZEND_NULL_HANDLER,
! 33068: ZEND_NULL_HANDLER,
! 33069: ZEND_NULL_HANDLER,
! 33070: ZEND_NULL_HANDLER,
! 33071: ZEND_NULL_HANDLER,
! 33072: ZEND_NULL_HANDLER,
! 33073: ZEND_NULL_HANDLER,
! 33074: ZEND_NULL_HANDLER,
! 33075: ZEND_NULL_HANDLER,
! 33076: ZEND_NULL_HANDLER,
! 33077: ZEND_NULL_HANDLER,
! 33078: ZEND_NULL_HANDLER,
! 33079: ZEND_NULL_HANDLER,
! 33080: ZEND_NULL_HANDLER,
! 33081: ZEND_NULL_HANDLER,
! 33082: ZEND_NULL_HANDLER,
! 33083: ZEND_NULL_HANDLER,
! 33084: ZEND_NULL_HANDLER,
! 33085: ZEND_NULL_HANDLER,
! 33086: ZEND_NULL_HANDLER,
! 33087: ZEND_NULL_HANDLER,
! 33088: ZEND_NULL_HANDLER,
! 33089: ZEND_NULL_HANDLER,
! 33090: ZEND_NULL_HANDLER,
! 33091: ZEND_NULL_HANDLER,
! 33092: ZEND_NULL_HANDLER,
! 33093: ZEND_NULL_HANDLER,
! 33094: ZEND_NULL_HANDLER,
! 33095: ZEND_NULL_HANDLER,
! 33096: ZEND_NULL_HANDLER,
! 33097: ZEND_NULL_HANDLER,
! 33098: ZEND_NULL_HANDLER,
! 33099: ZEND_NULL_HANDLER,
! 33100: ZEND_NULL_HANDLER,
! 33101: ZEND_NULL_HANDLER,
! 33102: ZEND_NULL_HANDLER,
! 33103: ZEND_NULL_HANDLER,
! 33104: ZEND_NULL_HANDLER,
! 33105: ZEND_NULL_HANDLER,
! 33106: ZEND_NULL_HANDLER,
! 33107: ZEND_NULL_HANDLER,
! 33108: ZEND_NULL_HANDLER,
! 33109: ZEND_NULL_HANDLER,
! 33110: ZEND_NULL_HANDLER,
! 33111: ZEND_NULL_HANDLER,
! 33112: ZEND_NULL_HANDLER,
! 33113: ZEND_NULL_HANDLER,
! 33114: ZEND_NULL_HANDLER,
! 33115: ZEND_NULL_HANDLER,
! 33116: ZEND_NULL_HANDLER,
! 33117: ZEND_NULL_HANDLER,
! 33118: ZEND_NULL_HANDLER,
! 33119: ZEND_NULL_HANDLER,
! 33120: ZEND_NULL_HANDLER,
! 33121: ZEND_NULL_HANDLER,
! 33122: ZEND_NULL_HANDLER,
! 33123: ZEND_NULL_HANDLER,
! 33124: ZEND_NULL_HANDLER,
! 33125: ZEND_NULL_HANDLER,
! 33126: ZEND_NULL_HANDLER,
! 33127: ZEND_NULL_HANDLER,
! 33128: ZEND_NULL_HANDLER,
! 33129: ZEND_NULL_HANDLER,
! 33130: ZEND_NULL_HANDLER,
! 33131: ZEND_NULL_HANDLER,
! 33132: ZEND_NULL_HANDLER,
! 33133: ZEND_NULL_HANDLER,
! 33134: ZEND_NULL_HANDLER,
! 33135: ZEND_NULL_HANDLER,
! 33136: ZEND_NULL_HANDLER,
! 33137: ZEND_NULL_HANDLER,
! 33138: ZEND_NULL_HANDLER,
! 33139: ZEND_NULL_HANDLER,
! 33140: ZEND_NULL_HANDLER,
! 33141: ZEND_NULL_HANDLER,
! 33142: ZEND_NULL_HANDLER,
! 33143: ZEND_NULL_HANDLER,
! 33144: ZEND_NULL_HANDLER,
! 33145: ZEND_NULL_HANDLER,
! 33146: ZEND_NULL_HANDLER,
! 33147: ZEND_NULL_HANDLER,
! 33148: ZEND_NULL_HANDLER,
! 33149: ZEND_NULL_HANDLER,
! 33150: ZEND_NULL_HANDLER,
! 33151: ZEND_NULL_HANDLER,
! 33152: ZEND_NULL_HANDLER,
! 33153: ZEND_NULL_HANDLER,
! 33154: ZEND_NULL_HANDLER,
! 33155: ZEND_NULL_HANDLER,
! 33156: ZEND_NULL_HANDLER,
! 33157: ZEND_NULL_HANDLER,
! 33158: ZEND_NULL_HANDLER,
! 33159: ZEND_NULL_HANDLER,
! 33160: ZEND_NULL_HANDLER,
! 33161: ZEND_NULL_HANDLER,
! 33162: ZEND_NULL_HANDLER,
! 33163: ZEND_NULL_HANDLER,
! 33164: ZEND_NULL_HANDLER,
! 33165: ZEND_NULL_HANDLER,
! 33166: ZEND_NULL_HANDLER,
! 33167: ZEND_NULL_HANDLER,
! 33168: ZEND_NULL_HANDLER,
! 33169: ZEND_NULL_HANDLER,
! 33170: ZEND_NULL_HANDLER,
! 33171: ZEND_NULL_HANDLER,
! 33172: ZEND_NULL_HANDLER,
! 33173: ZEND_NULL_HANDLER,
! 33174: ZEND_NULL_HANDLER,
! 33175: ZEND_NULL_HANDLER,
! 33176: ZEND_NULL_HANDLER,
! 33177: ZEND_NULL_HANDLER,
! 33178: ZEND_NULL_HANDLER,
! 33179: ZEND_NULL_HANDLER,
! 33180: ZEND_NULL_HANDLER,
! 33181: ZEND_NULL_HANDLER,
! 33182: ZEND_NULL_HANDLER,
! 33183: ZEND_NULL_HANDLER,
! 33184: ZEND_NULL_HANDLER,
! 33185: ZEND_NULL_HANDLER,
! 33186: ZEND_NULL_HANDLER,
! 33187: ZEND_NULL_HANDLER,
! 33188: ZEND_NULL_HANDLER,
! 33189: ZEND_NULL_HANDLER,
! 33190: ZEND_NULL_HANDLER,
! 33191: ZEND_NULL_HANDLER,
! 33192: ZEND_NULL_HANDLER,
! 33193: ZEND_NULL_HANDLER,
! 33194: ZEND_NULL_HANDLER,
! 33195: ZEND_NULL_HANDLER,
! 33196: ZEND_NULL_HANDLER,
! 33197: ZEND_NULL_HANDLER,
! 33198: ZEND_NULL_HANDLER,
! 33199: ZEND_NULL_HANDLER,
! 33200: ZEND_NULL_HANDLER,
! 33201: ZEND_NULL_HANDLER,
! 33202: ZEND_NULL_HANDLER,
! 33203: ZEND_NULL_HANDLER,
! 33204: ZEND_NULL_HANDLER,
! 33205: ZEND_NULL_HANDLER,
! 33206: ZEND_NULL_HANDLER,
! 33207: ZEND_NULL_HANDLER,
! 33208: ZEND_NULL_HANDLER,
! 33209: ZEND_NULL_HANDLER,
! 33210: ZEND_NULL_HANDLER,
! 33211: ZEND_NULL_HANDLER,
! 33212: ZEND_NULL_HANDLER,
! 33213: ZEND_NULL_HANDLER,
! 33214: ZEND_NULL_HANDLER,
! 33215: ZEND_NULL_HANDLER,
! 33216: ZEND_NULL_HANDLER,
! 33217: ZEND_NULL_HANDLER,
! 33218: ZEND_NULL_HANDLER,
! 33219: ZEND_NULL_HANDLER,
! 33220: ZEND_NULL_HANDLER,
! 33221: ZEND_NULL_HANDLER,
! 33222: ZEND_NULL_HANDLER,
! 33223: ZEND_NULL_HANDLER,
! 33224: ZEND_NULL_HANDLER,
! 33225: ZEND_NULL_HANDLER,
! 33226: ZEND_NULL_HANDLER,
! 33227: ZEND_NULL_HANDLER,
! 33228: ZEND_NULL_HANDLER,
! 33229: ZEND_NULL_HANDLER,
! 33230: ZEND_NULL_HANDLER,
! 33231: ZEND_NULL_HANDLER,
! 33232: ZEND_NULL_HANDLER,
! 33233: ZEND_NULL_HANDLER,
! 33234: ZEND_NULL_HANDLER,
! 33235: ZEND_NULL_HANDLER,
! 33236: ZEND_NULL_HANDLER,
! 33237: ZEND_NULL_HANDLER,
! 33238: ZEND_NULL_HANDLER,
! 33239: ZEND_NULL_HANDLER,
! 33240: ZEND_NULL_HANDLER,
! 33241: ZEND_NULL_HANDLER,
! 33242: ZEND_NULL_HANDLER,
! 33243: ZEND_NULL_HANDLER,
! 33244: ZEND_NULL_HANDLER,
! 33245: ZEND_NULL_HANDLER,
! 33246: ZEND_NULL_HANDLER,
! 33247: ZEND_NULL_HANDLER,
! 33248: ZEND_NULL_HANDLER,
! 33249: ZEND_NULL_HANDLER,
! 33250: ZEND_NULL_HANDLER,
! 33251: ZEND_NULL_HANDLER,
! 33252: ZEND_NULL_HANDLER,
! 33253: ZEND_NULL_HANDLER,
! 33254: ZEND_NULL_HANDLER,
! 33255: ZEND_NULL_HANDLER,
! 33256: ZEND_NULL_HANDLER,
! 33257: ZEND_NULL_HANDLER,
! 33258: ZEND_NULL_HANDLER,
! 33259: ZEND_NULL_HANDLER,
! 33260: ZEND_NULL_HANDLER,
! 33261: ZEND_NULL_HANDLER,
! 33262: ZEND_NULL_HANDLER,
! 33263: ZEND_NULL_HANDLER,
! 33264: ZEND_NULL_HANDLER,
! 33265: ZEND_NULL_HANDLER,
! 33266: ZEND_NULL_HANDLER,
! 33267: ZEND_NULL_HANDLER,
! 33268: ZEND_NULL_HANDLER,
! 33269: ZEND_NULL_HANDLER,
! 33270: ZEND_NULL_HANDLER,
! 33271: ZEND_NULL_HANDLER,
! 33272: ZEND_NULL_HANDLER,
! 33273: ZEND_NULL_HANDLER,
! 33274: ZEND_NULL_HANDLER,
! 33275: ZEND_NULL_HANDLER,
! 33276: ZEND_NULL_HANDLER,
! 33277: ZEND_NULL_HANDLER,
! 33278: ZEND_NULL_HANDLER,
! 33279: ZEND_NULL_HANDLER,
! 33280: ZEND_NULL_HANDLER,
! 33281: ZEND_NULL_HANDLER,
! 33282: ZEND_NULL_HANDLER,
! 33283: ZEND_NULL_HANDLER,
! 33284: ZEND_NULL_HANDLER,
! 33285: ZEND_NULL_HANDLER,
! 33286: ZEND_NULL_HANDLER,
! 33287: ZEND_NULL_HANDLER,
! 33288: ZEND_NULL_HANDLER,
! 33289: ZEND_NULL_HANDLER,
! 33290: ZEND_NULL_HANDLER,
! 33291: ZEND_NULL_HANDLER,
! 33292: ZEND_NULL_HANDLER,
! 33293: ZEND_NULL_HANDLER,
! 33294: ZEND_NULL_HANDLER,
! 33295: ZEND_NULL_HANDLER,
! 33296: ZEND_NULL_HANDLER,
! 33297: ZEND_NULL_HANDLER,
! 33298: ZEND_NULL_HANDLER,
! 33299: ZEND_NULL_HANDLER,
! 33300: ZEND_NULL_HANDLER,
! 33301: ZEND_NULL_HANDLER,
! 33302: ZEND_NULL_HANDLER,
! 33303: ZEND_NULL_HANDLER,
! 33304: ZEND_NULL_HANDLER,
! 33305: ZEND_NULL_HANDLER,
! 33306: ZEND_NULL_HANDLER,
! 33307: ZEND_NULL_HANDLER,
! 33308: ZEND_NULL_HANDLER,
! 33309: ZEND_NULL_HANDLER,
! 33310: ZEND_NULL_HANDLER,
! 33311: ZEND_NULL_HANDLER,
! 33312: ZEND_NULL_HANDLER,
! 33313: ZEND_NULL_HANDLER,
! 33314: ZEND_NULL_HANDLER,
! 33315: ZEND_NULL_HANDLER,
! 33316: ZEND_NULL_HANDLER,
! 33317: ZEND_NULL_HANDLER,
! 33318: ZEND_NULL_HANDLER,
! 33319: ZEND_NULL_HANDLER,
! 33320: ZEND_NULL_HANDLER,
! 33321: ZEND_NULL_HANDLER,
! 33322: ZEND_NULL_HANDLER,
! 33323: ZEND_NULL_HANDLER,
! 33324: ZEND_NULL_HANDLER,
! 33325: ZEND_NULL_HANDLER,
! 33326: ZEND_NULL_HANDLER,
! 33327: ZEND_NULL_HANDLER,
! 33328: ZEND_NULL_HANDLER,
! 33329: ZEND_NULL_HANDLER,
! 33330: ZEND_NULL_HANDLER,
! 33331: ZEND_NULL_HANDLER,
! 33332: ZEND_NULL_HANDLER,
! 33333: ZEND_NULL_HANDLER,
! 33334: ZEND_NULL_HANDLER,
! 33335: ZEND_NULL_HANDLER,
! 33336: ZEND_NULL_HANDLER,
! 33337: ZEND_NULL_HANDLER,
! 33338: ZEND_NULL_HANDLER,
! 33339: ZEND_NULL_HANDLER,
! 33340: ZEND_NULL_HANDLER,
! 33341: ZEND_NULL_HANDLER,
! 33342: ZEND_NULL_HANDLER,
! 33343: ZEND_NULL_HANDLER,
! 33344: ZEND_NULL_HANDLER,
! 33345: ZEND_NULL_HANDLER,
! 33346: ZEND_NULL_HANDLER,
! 33347: ZEND_NULL_HANDLER,
! 33348: ZEND_NULL_HANDLER,
! 33349: ZEND_NULL_HANDLER,
! 33350: ZEND_NULL_HANDLER,
! 33351: ZEND_NULL_HANDLER,
! 33352: ZEND_NULL_HANDLER,
! 33353: ZEND_NULL_HANDLER,
! 33354: ZEND_NULL_HANDLER,
! 33355: ZEND_NULL_HANDLER,
! 33356: ZEND_NULL_HANDLER,
! 33357: ZEND_NULL_HANDLER,
! 33358: ZEND_NULL_HANDLER,
! 33359: ZEND_NULL_HANDLER,
! 33360: ZEND_NULL_HANDLER,
! 33361: ZEND_NULL_HANDLER,
! 33362: ZEND_NULL_HANDLER,
! 33363: ZEND_NULL_HANDLER,
! 33364: ZEND_NULL_HANDLER,
! 33365: ZEND_NULL_HANDLER,
! 33366: ZEND_NULL_HANDLER,
! 33367: ZEND_NULL_HANDLER,
! 33368: ZEND_NULL_HANDLER,
! 33369: ZEND_NULL_HANDLER,
! 33370: ZEND_NULL_HANDLER,
! 33371: ZEND_NULL_HANDLER,
! 33372: ZEND_NULL_HANDLER,
! 33373: ZEND_NULL_HANDLER,
! 33374: ZEND_NULL_HANDLER,
! 33375: ZEND_NULL_HANDLER,
! 33376: ZEND_NULL_HANDLER,
! 33377: ZEND_NULL_HANDLER,
! 33378: ZEND_NULL_HANDLER,
! 33379: ZEND_NULL_HANDLER,
! 33380: ZEND_NULL_HANDLER,
! 33381: ZEND_NULL_HANDLER,
! 33382: ZEND_NULL_HANDLER,
! 33383: ZEND_NULL_HANDLER,
! 33384: ZEND_NULL_HANDLER,
! 33385: ZEND_NULL_HANDLER,
! 33386: ZEND_NULL_HANDLER,
! 33387: ZEND_NULL_HANDLER,
! 33388: ZEND_NULL_HANDLER,
! 33389: ZEND_NULL_HANDLER,
! 33390: ZEND_NULL_HANDLER,
! 33391: ZEND_NULL_HANDLER,
! 33392: ZEND_NULL_HANDLER,
! 33393: ZEND_NULL_HANDLER,
! 33394: ZEND_NULL_HANDLER,
! 33395: ZEND_NULL_HANDLER,
! 33396: ZEND_NULL_HANDLER,
! 33397: ZEND_NULL_HANDLER,
! 33398: ZEND_NULL_HANDLER,
! 33399: ZEND_NULL_HANDLER,
! 33400: ZEND_NULL_HANDLER,
! 33401: ZEND_NULL_HANDLER,
! 33402: ZEND_NULL_HANDLER,
! 33403: ZEND_NULL_HANDLER,
! 33404: ZEND_NULL_HANDLER,
! 33405: ZEND_NULL_HANDLER,
! 33406: ZEND_NULL_HANDLER,
! 33407: ZEND_NULL_HANDLER,
! 33408: ZEND_NULL_HANDLER,
! 33409: ZEND_NULL_HANDLER,
! 33410: ZEND_NULL_HANDLER,
! 33411: ZEND_NULL_HANDLER,
! 33412: ZEND_NULL_HANDLER,
! 33413: ZEND_NULL_HANDLER,
! 33414: ZEND_NULL_HANDLER,
! 33415: ZEND_NULL_HANDLER,
! 33416: ZEND_NULL_HANDLER,
! 33417: ZEND_NULL_HANDLER,
! 33418: ZEND_NULL_HANDLER,
! 33419: ZEND_NULL_HANDLER,
! 33420: ZEND_NULL_HANDLER,
! 33421: ZEND_NULL_HANDLER,
! 33422: ZEND_NULL_HANDLER,
! 33423: ZEND_NULL_HANDLER,
! 33424: ZEND_NULL_HANDLER,
! 33425: ZEND_NULL_HANDLER,
! 33426: ZEND_NULL_HANDLER,
! 33427: ZEND_NULL_HANDLER,
! 33428: ZEND_NULL_HANDLER,
! 33429: ZEND_NULL_HANDLER,
! 33430: ZEND_NULL_HANDLER,
! 33431: ZEND_NULL_HANDLER,
! 33432: ZEND_NULL_HANDLER,
! 33433: ZEND_NULL_HANDLER,
! 33434: ZEND_NULL_HANDLER,
! 33435: ZEND_NULL_HANDLER,
! 33436: ZEND_NULL_HANDLER,
! 33437: ZEND_NULL_HANDLER,
! 33438: ZEND_NULL_HANDLER,
! 33439: ZEND_NULL_HANDLER,
! 33440: ZEND_NULL_HANDLER,
! 33441: ZEND_NULL_HANDLER,
! 33442: ZEND_NULL_HANDLER,
! 33443: ZEND_NULL_HANDLER,
! 33444: ZEND_NULL_HANDLER,
! 33445: ZEND_NULL_HANDLER,
! 33446: ZEND_NULL_HANDLER,
! 33447: ZEND_NULL_HANDLER,
! 33448: ZEND_NULL_HANDLER,
! 33449: ZEND_NULL_HANDLER,
! 33450: ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER,
! 33451: ZEND_PRE_INC_OBJ_SPEC_VAR_TMP_HANDLER,
! 33452: ZEND_PRE_INC_OBJ_SPEC_VAR_VAR_HANDLER,
! 33453: ZEND_NULL_HANDLER,
! 33454: ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER,
! 33455: ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33456: ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33457: ZEND_PRE_INC_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33458: ZEND_NULL_HANDLER,
! 33459: ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33460: ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER,
! 33461: ZEND_PRE_INC_OBJ_SPEC_CV_TMP_HANDLER,
! 33462: ZEND_PRE_INC_OBJ_SPEC_CV_VAR_HANDLER,
! 33463: ZEND_NULL_HANDLER,
! 33464: ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER,
! 33465: ZEND_NULL_HANDLER,
! 33466: ZEND_NULL_HANDLER,
! 33467: ZEND_NULL_HANDLER,
! 33468: ZEND_NULL_HANDLER,
! 33469: ZEND_NULL_HANDLER,
! 33470: ZEND_NULL_HANDLER,
! 33471: ZEND_NULL_HANDLER,
! 33472: ZEND_NULL_HANDLER,
! 33473: ZEND_NULL_HANDLER,
! 33474: ZEND_NULL_HANDLER,
! 33475: ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
! 33476: ZEND_PRE_DEC_OBJ_SPEC_VAR_TMP_HANDLER,
! 33477: ZEND_PRE_DEC_OBJ_SPEC_VAR_VAR_HANDLER,
! 33478: ZEND_NULL_HANDLER,
! 33479: ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER,
! 33480: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33481: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33482: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33483: ZEND_NULL_HANDLER,
! 33484: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33485: ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER,
! 33486: ZEND_PRE_DEC_OBJ_SPEC_CV_TMP_HANDLER,
! 33487: ZEND_PRE_DEC_OBJ_SPEC_CV_VAR_HANDLER,
! 33488: ZEND_NULL_HANDLER,
! 33489: ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER,
! 33490: ZEND_NULL_HANDLER,
! 33491: ZEND_NULL_HANDLER,
! 33492: ZEND_NULL_HANDLER,
! 33493: ZEND_NULL_HANDLER,
! 33494: ZEND_NULL_HANDLER,
! 33495: ZEND_NULL_HANDLER,
! 33496: ZEND_NULL_HANDLER,
! 33497: ZEND_NULL_HANDLER,
! 33498: ZEND_NULL_HANDLER,
! 33499: ZEND_NULL_HANDLER,
! 33500: ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER,
! 33501: ZEND_POST_INC_OBJ_SPEC_VAR_TMP_HANDLER,
! 33502: ZEND_POST_INC_OBJ_SPEC_VAR_VAR_HANDLER,
! 33503: ZEND_NULL_HANDLER,
! 33504: ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER,
! 33505: ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33506: ZEND_POST_INC_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33507: ZEND_POST_INC_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33508: ZEND_NULL_HANDLER,
! 33509: ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33510: ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER,
! 33511: ZEND_POST_INC_OBJ_SPEC_CV_TMP_HANDLER,
! 33512: ZEND_POST_INC_OBJ_SPEC_CV_VAR_HANDLER,
! 33513: ZEND_NULL_HANDLER,
! 33514: ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER,
! 33515: ZEND_NULL_HANDLER,
! 33516: ZEND_NULL_HANDLER,
! 33517: ZEND_NULL_HANDLER,
! 33518: ZEND_NULL_HANDLER,
! 33519: ZEND_NULL_HANDLER,
! 33520: ZEND_NULL_HANDLER,
! 33521: ZEND_NULL_HANDLER,
! 33522: ZEND_NULL_HANDLER,
! 33523: ZEND_NULL_HANDLER,
! 33524: ZEND_NULL_HANDLER,
! 33525: ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
! 33526: ZEND_POST_DEC_OBJ_SPEC_VAR_TMP_HANDLER,
! 33527: ZEND_POST_DEC_OBJ_SPEC_VAR_VAR_HANDLER,
! 33528: ZEND_NULL_HANDLER,
! 33529: ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER,
! 33530: ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33531: ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33532: ZEND_POST_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33533: ZEND_NULL_HANDLER,
! 33534: ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33535: ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER,
! 33536: ZEND_POST_DEC_OBJ_SPEC_CV_TMP_HANDLER,
! 33537: ZEND_POST_DEC_OBJ_SPEC_CV_VAR_HANDLER,
! 33538: ZEND_NULL_HANDLER,
! 33539: ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER,
! 33540: ZEND_NULL_HANDLER,
! 33541: ZEND_NULL_HANDLER,
! 33542: ZEND_NULL_HANDLER,
! 33543: ZEND_NULL_HANDLER,
! 33544: ZEND_NULL_HANDLER,
! 33545: ZEND_NULL_HANDLER,
! 33546: ZEND_NULL_HANDLER,
! 33547: ZEND_NULL_HANDLER,
! 33548: ZEND_NULL_HANDLER,
! 33549: ZEND_NULL_HANDLER,
! 33550: ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER,
! 33551: ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER,
! 33552: ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER,
! 33553: ZEND_NULL_HANDLER,
! 33554: ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER,
! 33555: ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33556: ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33557: ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33558: ZEND_NULL_HANDLER,
! 33559: ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33560: ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDLER,
! 33561: ZEND_ASSIGN_OBJ_SPEC_CV_TMP_HANDLER,
! 33562: ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER,
! 33563: ZEND_NULL_HANDLER,
! 33564: ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER,
! 33565: ZEND_NULL_HANDLER,
! 33566: ZEND_NULL_HANDLER,
! 33567: ZEND_NULL_HANDLER,
! 33568: ZEND_NULL_HANDLER,
! 33569: ZEND_NULL_HANDLER,
! 33570: ZEND_NULL_HANDLER,
! 33571: ZEND_NULL_HANDLER,
! 33572: ZEND_NULL_HANDLER,
! 33573: ZEND_NULL_HANDLER,
! 33574: ZEND_NULL_HANDLER,
! 33575: ZEND_NULL_HANDLER,
! 33576: ZEND_NULL_HANDLER,
! 33577: ZEND_NULL_HANDLER,
! 33578: ZEND_NULL_HANDLER,
! 33579: ZEND_NULL_HANDLER,
! 33580: ZEND_NULL_HANDLER,
! 33581: ZEND_NULL_HANDLER,
! 33582: ZEND_NULL_HANDLER,
! 33583: ZEND_NULL_HANDLER,
! 33584: ZEND_NULL_HANDLER,
! 33585: ZEND_NULL_HANDLER,
! 33586: ZEND_NULL_HANDLER,
! 33587: ZEND_NULL_HANDLER,
! 33588: ZEND_NULL_HANDLER,
! 33589: ZEND_NULL_HANDLER,
! 33590: ZEND_NULL_HANDLER,
! 33591: ZEND_NULL_HANDLER,
! 33592: ZEND_NULL_HANDLER,
! 33593: ZEND_NULL_HANDLER,
! 33594: ZEND_NULL_HANDLER,
! 33595: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
! 33596: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
! 33597: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
! 33598: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
! 33599: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
! 33600: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
! 33601: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
! 33602: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
! 33603: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
! 33604: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
! 33605: ZEND_NULL_HANDLER,
! 33606: ZEND_NULL_HANDLER,
! 33607: ZEND_NULL_HANDLER,
! 33608: ZEND_NULL_HANDLER,
! 33609: ZEND_NULL_HANDLER,
! 33610: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
! 33611: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
! 33612: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
! 33613: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
! 33614: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
! 33615: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33616: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33617: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33618: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33619: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33620: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33621: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33622: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33623: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33624: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33625: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33626: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33627: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33628: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33629: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33630: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33631: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33632: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33633: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33634: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33635: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33636: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33637: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33638: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33639: ZEND_DECLARE_CLASS_SPEC_HANDLER,
! 33640: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33641: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33642: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33643: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33644: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33645: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33646: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33647: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33648: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33649: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33650: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33651: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33652: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33653: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33654: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33655: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33656: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33657: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33658: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33659: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33660: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33661: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33662: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33663: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33664: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
! 33665: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33666: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33667: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33668: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33669: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33670: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33671: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33672: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33673: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33674: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33675: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33676: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33677: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33678: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33679: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33680: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33681: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33682: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33683: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33684: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33685: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33686: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33687: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33688: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33689: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
! 33690: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33691: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33692: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33693: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33694: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33695: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33696: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33697: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33698: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33699: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33700: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33701: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33702: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33703: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33704: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33705: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33706: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33707: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33708: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33709: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33710: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33711: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33712: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33713: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33714: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
! 33715: ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
! 33716: ZEND_NULL_HANDLER,
! 33717: ZEND_NULL_HANDLER,
! 33718: ZEND_NULL_HANDLER,
! 33719: ZEND_NULL_HANDLER,
! 33720: ZEND_NULL_HANDLER,
! 33721: ZEND_NULL_HANDLER,
! 33722: ZEND_NULL_HANDLER,
! 33723: ZEND_NULL_HANDLER,
! 33724: ZEND_NULL_HANDLER,
! 33725: ZEND_NULL_HANDLER,
! 33726: ZEND_NULL_HANDLER,
! 33727: ZEND_NULL_HANDLER,
! 33728: ZEND_NULL_HANDLER,
! 33729: ZEND_NULL_HANDLER,
! 33730: ZEND_NULL_HANDLER,
! 33731: ZEND_NULL_HANDLER,
! 33732: ZEND_NULL_HANDLER,
! 33733: ZEND_NULL_HANDLER,
! 33734: ZEND_NULL_HANDLER,
! 33735: ZEND_NULL_HANDLER,
! 33736: ZEND_NULL_HANDLER,
! 33737: ZEND_NULL_HANDLER,
! 33738: ZEND_NULL_HANDLER,
! 33739: ZEND_NULL_HANDLER,
! 33740: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
! 33741: ZEND_NULL_HANDLER,
! 33742: ZEND_NULL_HANDLER,
! 33743: ZEND_NULL_HANDLER,
! 33744: ZEND_NULL_HANDLER,
! 33745: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
! 33746: ZEND_NULL_HANDLER,
! 33747: ZEND_NULL_HANDLER,
! 33748: ZEND_NULL_HANDLER,
! 33749: ZEND_NULL_HANDLER,
! 33750: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
! 33751: ZEND_NULL_HANDLER,
! 33752: ZEND_NULL_HANDLER,
! 33753: ZEND_NULL_HANDLER,
! 33754: ZEND_NULL_HANDLER,
! 33755: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
! 33756: ZEND_NULL_HANDLER,
! 33757: ZEND_NULL_HANDLER,
! 33758: ZEND_NULL_HANDLER,
! 33759: ZEND_NULL_HANDLER,
! 33760: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
! 33761: ZEND_NULL_HANDLER,
! 33762: ZEND_NULL_HANDLER,
! 33763: ZEND_NULL_HANDLER,
! 33764: ZEND_NULL_HANDLER,
! 33765: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33766: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33767: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33768: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33769: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33770: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33771: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33772: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33773: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33774: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33775: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33776: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33777: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33778: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33779: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33780: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33781: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33782: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33783: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33784: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33785: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33786: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33787: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33788: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33789: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
! 33790: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33791: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33792: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33793: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33794: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33795: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33796: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33797: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33798: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33799: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33800: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33801: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33802: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33803: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33804: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33805: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33806: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33807: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33808: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33809: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33810: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33811: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33812: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33813: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33814: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
! 33815: ZEND_NULL_HANDLER,
! 33816: ZEND_NULL_HANDLER,
! 33817: ZEND_NULL_HANDLER,
! 33818: ZEND_NULL_HANDLER,
! 33819: ZEND_NULL_HANDLER,
! 33820: ZEND_NULL_HANDLER,
! 33821: ZEND_NULL_HANDLER,
! 33822: ZEND_NULL_HANDLER,
! 33823: ZEND_NULL_HANDLER,
! 33824: ZEND_NULL_HANDLER,
! 33825: ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER,
! 33826: ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER,
! 33827: ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER,
! 33828: ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER,
! 33829: ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER,
! 33830: ZEND_NULL_HANDLER,
! 33831: ZEND_NULL_HANDLER,
! 33832: ZEND_NULL_HANDLER,
! 33833: ZEND_NULL_HANDLER,
! 33834: ZEND_NULL_HANDLER,
! 33835: ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER,
! 33836: ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER,
! 33837: ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER,
! 33838: ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER,
! 33839: ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER,
! 33840: ZEND_NULL_HANDLER,
! 33841: ZEND_NULL_HANDLER,
! 33842: ZEND_NULL_HANDLER,
! 33843: ZEND_NULL_HANDLER,
! 33844: ZEND_NULL_HANDLER,
! 33845: ZEND_NULL_HANDLER,
! 33846: ZEND_NULL_HANDLER,
! 33847: ZEND_NULL_HANDLER,
! 33848: ZEND_NULL_HANDLER,
! 33849: ZEND_NULL_HANDLER,
! 33850: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER,
! 33851: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER,
! 33852: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER,
! 33853: ZEND_NULL_HANDLER,
! 33854: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER,
! 33855: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER,
! 33856: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER,
! 33857: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER,
! 33858: ZEND_NULL_HANDLER,
! 33859: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER,
! 33860: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER,
! 33861: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER,
! 33862: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER,
! 33863: ZEND_NULL_HANDLER,
! 33864: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER,
! 33865: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33866: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33867: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33868: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33869: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33870: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33871: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33872: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33873: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33874: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33875: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33876: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33877: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33878: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33879: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33880: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33881: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33882: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33883: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33884: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33885: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33886: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33887: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33888: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33889: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
! 33890: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33891: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33892: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33893: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33894: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33895: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33896: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33897: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33898: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33899: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33900: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33901: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33902: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33903: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33904: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33905: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33906: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33907: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33908: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33909: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33910: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33911: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33912: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33913: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33914: ZEND_USER_OPCODE_SPEC_HANDLER,
! 33915: ZEND_NULL_HANDLER,
! 33916: ZEND_NULL_HANDLER,
! 33917: ZEND_NULL_HANDLER,
! 33918: ZEND_NULL_HANDLER,
! 33919: ZEND_NULL_HANDLER,
! 33920: ZEND_NULL_HANDLER,
! 33921: ZEND_NULL_HANDLER,
! 33922: ZEND_NULL_HANDLER,
! 33923: ZEND_NULL_HANDLER,
! 33924: ZEND_NULL_HANDLER,
! 33925: ZEND_NULL_HANDLER,
! 33926: ZEND_NULL_HANDLER,
! 33927: ZEND_NULL_HANDLER,
! 33928: ZEND_NULL_HANDLER,
! 33929: ZEND_NULL_HANDLER,
! 33930: ZEND_NULL_HANDLER,
! 33931: ZEND_NULL_HANDLER,
! 33932: ZEND_NULL_HANDLER,
! 33933: ZEND_NULL_HANDLER,
! 33934: ZEND_NULL_HANDLER,
! 33935: ZEND_NULL_HANDLER,
! 33936: ZEND_NULL_HANDLER,
! 33937: ZEND_NULL_HANDLER,
! 33938: ZEND_NULL_HANDLER,
! 33939: ZEND_NULL_HANDLER,
! 33940: ZEND_JMP_SET_SPEC_CONST_HANDLER,
! 33941: ZEND_JMP_SET_SPEC_CONST_HANDLER,
! 33942: ZEND_JMP_SET_SPEC_CONST_HANDLER,
! 33943: ZEND_JMP_SET_SPEC_CONST_HANDLER,
! 33944: ZEND_JMP_SET_SPEC_CONST_HANDLER,
! 33945: ZEND_JMP_SET_SPEC_TMP_HANDLER,
! 33946: ZEND_JMP_SET_SPEC_TMP_HANDLER,
! 33947: ZEND_JMP_SET_SPEC_TMP_HANDLER,
! 33948: ZEND_JMP_SET_SPEC_TMP_HANDLER,
! 33949: ZEND_JMP_SET_SPEC_TMP_HANDLER,
! 33950: ZEND_JMP_SET_SPEC_VAR_HANDLER,
! 33951: ZEND_JMP_SET_SPEC_VAR_HANDLER,
! 33952: ZEND_JMP_SET_SPEC_VAR_HANDLER,
! 33953: ZEND_JMP_SET_SPEC_VAR_HANDLER,
! 33954: ZEND_JMP_SET_SPEC_VAR_HANDLER,
! 33955: ZEND_NULL_HANDLER,
! 33956: ZEND_NULL_HANDLER,
! 33957: ZEND_NULL_HANDLER,
! 33958: ZEND_NULL_HANDLER,
! 33959: ZEND_NULL_HANDLER,
! 33960: ZEND_JMP_SET_SPEC_CV_HANDLER,
! 33961: ZEND_JMP_SET_SPEC_CV_HANDLER,
! 33962: ZEND_JMP_SET_SPEC_CV_HANDLER,
! 33963: ZEND_JMP_SET_SPEC_CV_HANDLER,
! 33964: ZEND_JMP_SET_SPEC_CV_HANDLER,
! 33965: ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_CONST_HANDLER,
! 33966: ZEND_NULL_HANDLER,
! 33967: ZEND_NULL_HANDLER,
! 33968: ZEND_NULL_HANDLER,
! 33969: ZEND_NULL_HANDLER,
! 33970: ZEND_NULL_HANDLER,
! 33971: ZEND_NULL_HANDLER,
! 33972: ZEND_NULL_HANDLER,
! 33973: ZEND_NULL_HANDLER,
! 33974: ZEND_NULL_HANDLER,
! 33975: ZEND_NULL_HANDLER,
! 33976: ZEND_NULL_HANDLER,
! 33977: ZEND_NULL_HANDLER,
! 33978: ZEND_NULL_HANDLER,
! 33979: ZEND_NULL_HANDLER,
! 33980: ZEND_NULL_HANDLER,
! 33981: ZEND_NULL_HANDLER,
! 33982: ZEND_NULL_HANDLER,
! 33983: ZEND_NULL_HANDLER,
! 33984: ZEND_NULL_HANDLER,
! 33985: ZEND_NULL_HANDLER,
! 33986: ZEND_NULL_HANDLER,
! 33987: ZEND_NULL_HANDLER,
! 33988: ZEND_NULL_HANDLER,
! 33989: ZEND_NULL_HANDLER,
! 33990: ZEND_NULL_HANDLER
! 33991: };
! 33992: zend_opcode_handlers = (opcode_handler_t*)labels;
! 33993: }
! 33994: static opcode_handler_t zend_vm_get_opcode_handler(zend_uchar opcode, zend_op* op)
! 33995: {
! 33996: static const int zend_vm_decode[] = {
! 33997: _UNUSED_CODE, /* 0 */
! 33998: _CONST_CODE, /* 1 = IS_CONST */
! 33999: _TMP_CODE, /* 2 = IS_TMP_VAR */
! 34000: _UNUSED_CODE, /* 3 */
! 34001: _VAR_CODE, /* 4 = IS_VAR */
! 34002: _UNUSED_CODE, /* 5 */
! 34003: _UNUSED_CODE, /* 6 */
! 34004: _UNUSED_CODE, /* 7 */
! 34005: _UNUSED_CODE, /* 8 = IS_UNUSED */
! 34006: _UNUSED_CODE, /* 9 */
! 34007: _UNUSED_CODE, /* 10 */
! 34008: _UNUSED_CODE, /* 11 */
! 34009: _UNUSED_CODE, /* 12 */
! 34010: _UNUSED_CODE, /* 13 */
! 34011: _UNUSED_CODE, /* 14 */
! 34012: _UNUSED_CODE, /* 15 */
! 34013: _CV_CODE /* 16 = IS_CV */
! 34014: };
! 34015: return zend_opcode_handlers[opcode * 25 + zend_vm_decode[op->op1.op_type] * 5 + zend_vm_decode[op->op2.op_type]];
! 34016: }
! 34017:
! 34018: ZEND_API void zend_vm_set_opcode_handler(zend_op* op)
! 34019: {
! 34020: op->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op);
! 34021: }
! 34022:
! 34023: ZEND_API int zend_do_fcall(ZEND_OPCODE_HANDLER_ARGS)
! 34024: {
! 34025: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
! 34026: }
! 34027:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>