Annotation of embedaddon/php/Zend/zend_vm_execute.h, revision 1.1.1.5
1.1 misho 1: /*
2: +----------------------------------------------------------------------+
3: | Zend Engine |
4: +----------------------------------------------------------------------+
1.1.1.5 ! misho 5: | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) |
1.1 misho 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
1.1.1.2 misho 24: static user_opcode_handler_t zend_user_opcode_handlers[256] = {
25: (user_opcode_handler_t)NULL,
26: (user_opcode_handler_t)NULL,
27: (user_opcode_handler_t)NULL,
28: (user_opcode_handler_t)NULL,
29: (user_opcode_handler_t)NULL,
30: (user_opcode_handler_t)NULL,
31: (user_opcode_handler_t)NULL,
32: (user_opcode_handler_t)NULL,
33: (user_opcode_handler_t)NULL,
34: (user_opcode_handler_t)NULL,
35: (user_opcode_handler_t)NULL,
36: (user_opcode_handler_t)NULL,
37: (user_opcode_handler_t)NULL,
38: (user_opcode_handler_t)NULL,
39: (user_opcode_handler_t)NULL,
40: (user_opcode_handler_t)NULL,
41: (user_opcode_handler_t)NULL,
42: (user_opcode_handler_t)NULL,
43: (user_opcode_handler_t)NULL,
44: (user_opcode_handler_t)NULL,
45: (user_opcode_handler_t)NULL,
46: (user_opcode_handler_t)NULL,
47: (user_opcode_handler_t)NULL,
48: (user_opcode_handler_t)NULL,
49: (user_opcode_handler_t)NULL,
50: (user_opcode_handler_t)NULL,
51: (user_opcode_handler_t)NULL,
52: (user_opcode_handler_t)NULL,
53: (user_opcode_handler_t)NULL,
54: (user_opcode_handler_t)NULL,
55: (user_opcode_handler_t)NULL,
56: (user_opcode_handler_t)NULL,
57: (user_opcode_handler_t)NULL,
58: (user_opcode_handler_t)NULL,
59: (user_opcode_handler_t)NULL,
60: (user_opcode_handler_t)NULL,
61: (user_opcode_handler_t)NULL,
62: (user_opcode_handler_t)NULL,
63: (user_opcode_handler_t)NULL,
64: (user_opcode_handler_t)NULL,
65: (user_opcode_handler_t)NULL,
66: (user_opcode_handler_t)NULL,
67: (user_opcode_handler_t)NULL,
68: (user_opcode_handler_t)NULL,
69: (user_opcode_handler_t)NULL,
70: (user_opcode_handler_t)NULL,
71: (user_opcode_handler_t)NULL,
72: (user_opcode_handler_t)NULL,
73: (user_opcode_handler_t)NULL,
74: (user_opcode_handler_t)NULL,
75: (user_opcode_handler_t)NULL,
76: (user_opcode_handler_t)NULL,
77: (user_opcode_handler_t)NULL,
78: (user_opcode_handler_t)NULL,
79: (user_opcode_handler_t)NULL,
80: (user_opcode_handler_t)NULL,
81: (user_opcode_handler_t)NULL,
82: (user_opcode_handler_t)NULL,
83: (user_opcode_handler_t)NULL,
84: (user_opcode_handler_t)NULL,
85: (user_opcode_handler_t)NULL,
86: (user_opcode_handler_t)NULL,
87: (user_opcode_handler_t)NULL,
88: (user_opcode_handler_t)NULL,
89: (user_opcode_handler_t)NULL,
90: (user_opcode_handler_t)NULL,
91: (user_opcode_handler_t)NULL,
92: (user_opcode_handler_t)NULL,
93: (user_opcode_handler_t)NULL,
94: (user_opcode_handler_t)NULL,
95: (user_opcode_handler_t)NULL,
96: (user_opcode_handler_t)NULL,
97: (user_opcode_handler_t)NULL,
98: (user_opcode_handler_t)NULL,
99: (user_opcode_handler_t)NULL,
100: (user_opcode_handler_t)NULL,
101: (user_opcode_handler_t)NULL,
102: (user_opcode_handler_t)NULL,
103: (user_opcode_handler_t)NULL,
104: (user_opcode_handler_t)NULL,
105: (user_opcode_handler_t)NULL,
106: (user_opcode_handler_t)NULL,
107: (user_opcode_handler_t)NULL,
108: (user_opcode_handler_t)NULL,
109: (user_opcode_handler_t)NULL,
110: (user_opcode_handler_t)NULL,
111: (user_opcode_handler_t)NULL,
112: (user_opcode_handler_t)NULL,
113: (user_opcode_handler_t)NULL,
114: (user_opcode_handler_t)NULL,
115: (user_opcode_handler_t)NULL,
116: (user_opcode_handler_t)NULL,
117: (user_opcode_handler_t)NULL,
118: (user_opcode_handler_t)NULL,
119: (user_opcode_handler_t)NULL,
120: (user_opcode_handler_t)NULL,
121: (user_opcode_handler_t)NULL,
122: (user_opcode_handler_t)NULL,
123: (user_opcode_handler_t)NULL,
124: (user_opcode_handler_t)NULL,
125: (user_opcode_handler_t)NULL,
126: (user_opcode_handler_t)NULL,
127: (user_opcode_handler_t)NULL,
128: (user_opcode_handler_t)NULL,
129: (user_opcode_handler_t)NULL,
130: (user_opcode_handler_t)NULL,
131: (user_opcode_handler_t)NULL,
132: (user_opcode_handler_t)NULL,
133: (user_opcode_handler_t)NULL,
134: (user_opcode_handler_t)NULL,
135: (user_opcode_handler_t)NULL,
136: (user_opcode_handler_t)NULL,
137: (user_opcode_handler_t)NULL,
138: (user_opcode_handler_t)NULL,
139: (user_opcode_handler_t)NULL,
140: (user_opcode_handler_t)NULL,
141: (user_opcode_handler_t)NULL,
142: (user_opcode_handler_t)NULL,
143: (user_opcode_handler_t)NULL,
144: (user_opcode_handler_t)NULL,
145: (user_opcode_handler_t)NULL,
146: (user_opcode_handler_t)NULL,
147: (user_opcode_handler_t)NULL,
148: (user_opcode_handler_t)NULL,
149: (user_opcode_handler_t)NULL,
150: (user_opcode_handler_t)NULL,
151: (user_opcode_handler_t)NULL,
152: (user_opcode_handler_t)NULL,
153: (user_opcode_handler_t)NULL,
154: (user_opcode_handler_t)NULL,
155: (user_opcode_handler_t)NULL,
156: (user_opcode_handler_t)NULL,
157: (user_opcode_handler_t)NULL,
158: (user_opcode_handler_t)NULL,
159: (user_opcode_handler_t)NULL,
160: (user_opcode_handler_t)NULL,
161: (user_opcode_handler_t)NULL,
162: (user_opcode_handler_t)NULL,
163: (user_opcode_handler_t)NULL,
164: (user_opcode_handler_t)NULL,
165: (user_opcode_handler_t)NULL,
166: (user_opcode_handler_t)NULL,
167: (user_opcode_handler_t)NULL,
168: (user_opcode_handler_t)NULL,
169: (user_opcode_handler_t)NULL,
170: (user_opcode_handler_t)NULL,
171: (user_opcode_handler_t)NULL,
172: (user_opcode_handler_t)NULL,
173: (user_opcode_handler_t)NULL,
174: (user_opcode_handler_t)NULL,
175: (user_opcode_handler_t)NULL,
176: (user_opcode_handler_t)NULL,
177: (user_opcode_handler_t)NULL,
178: (user_opcode_handler_t)NULL,
179: (user_opcode_handler_t)NULL,
180: (user_opcode_handler_t)NULL,
181: (user_opcode_handler_t)NULL,
182: (user_opcode_handler_t)NULL,
183: (user_opcode_handler_t)NULL,
184: (user_opcode_handler_t)NULL,
185: (user_opcode_handler_t)NULL,
186: (user_opcode_handler_t)NULL,
187: (user_opcode_handler_t)NULL,
188: (user_opcode_handler_t)NULL,
189: (user_opcode_handler_t)NULL,
190: (user_opcode_handler_t)NULL,
191: (user_opcode_handler_t)NULL,
192: (user_opcode_handler_t)NULL,
193: (user_opcode_handler_t)NULL,
194: (user_opcode_handler_t)NULL,
195: (user_opcode_handler_t)NULL,
196: (user_opcode_handler_t)NULL,
197: (user_opcode_handler_t)NULL,
198: (user_opcode_handler_t)NULL,
199: (user_opcode_handler_t)NULL,
200: (user_opcode_handler_t)NULL,
201: (user_opcode_handler_t)NULL,
202: (user_opcode_handler_t)NULL,
203: (user_opcode_handler_t)NULL,
204: (user_opcode_handler_t)NULL,
205: (user_opcode_handler_t)NULL,
206: (user_opcode_handler_t)NULL,
207: (user_opcode_handler_t)NULL,
208: (user_opcode_handler_t)NULL,
209: (user_opcode_handler_t)NULL,
210: (user_opcode_handler_t)NULL,
211: (user_opcode_handler_t)NULL,
212: (user_opcode_handler_t)NULL,
213: (user_opcode_handler_t)NULL,
214: (user_opcode_handler_t)NULL,
215: (user_opcode_handler_t)NULL,
216: (user_opcode_handler_t)NULL,
217: (user_opcode_handler_t)NULL,
218: (user_opcode_handler_t)NULL,
219: (user_opcode_handler_t)NULL,
220: (user_opcode_handler_t)NULL,
221: (user_opcode_handler_t)NULL,
222: (user_opcode_handler_t)NULL,
223: (user_opcode_handler_t)NULL,
224: (user_opcode_handler_t)NULL,
225: (user_opcode_handler_t)NULL,
226: (user_opcode_handler_t)NULL,
227: (user_opcode_handler_t)NULL,
228: (user_opcode_handler_t)NULL,
229: (user_opcode_handler_t)NULL,
230: (user_opcode_handler_t)NULL,
231: (user_opcode_handler_t)NULL,
232: (user_opcode_handler_t)NULL,
233: (user_opcode_handler_t)NULL,
234: (user_opcode_handler_t)NULL,
235: (user_opcode_handler_t)NULL,
236: (user_opcode_handler_t)NULL,
237: (user_opcode_handler_t)NULL,
238: (user_opcode_handler_t)NULL,
239: (user_opcode_handler_t)NULL,
240: (user_opcode_handler_t)NULL,
241: (user_opcode_handler_t)NULL,
242: (user_opcode_handler_t)NULL,
243: (user_opcode_handler_t)NULL,
244: (user_opcode_handler_t)NULL,
245: (user_opcode_handler_t)NULL,
246: (user_opcode_handler_t)NULL,
247: (user_opcode_handler_t)NULL,
248: (user_opcode_handler_t)NULL,
249: (user_opcode_handler_t)NULL,
250: (user_opcode_handler_t)NULL,
251: (user_opcode_handler_t)NULL,
252: (user_opcode_handler_t)NULL,
253: (user_opcode_handler_t)NULL,
254: (user_opcode_handler_t)NULL,
255: (user_opcode_handler_t)NULL,
256: (user_opcode_handler_t)NULL,
257: (user_opcode_handler_t)NULL,
258: (user_opcode_handler_t)NULL,
259: (user_opcode_handler_t)NULL,
260: (user_opcode_handler_t)NULL,
261: (user_opcode_handler_t)NULL,
262: (user_opcode_handler_t)NULL,
263: (user_opcode_handler_t)NULL,
264: (user_opcode_handler_t)NULL,
265: (user_opcode_handler_t)NULL,
266: (user_opcode_handler_t)NULL,
267: (user_opcode_handler_t)NULL,
268: (user_opcode_handler_t)NULL,
269: (user_opcode_handler_t)NULL,
270: (user_opcode_handler_t)NULL,
271: (user_opcode_handler_t)NULL,
272: (user_opcode_handler_t)NULL,
273: (user_opcode_handler_t)NULL,
274: (user_opcode_handler_t)NULL,
275: (user_opcode_handler_t)NULL,
276: (user_opcode_handler_t)NULL,
277: (user_opcode_handler_t)NULL,
278: (user_opcode_handler_t)NULL,
279: (user_opcode_handler_t)NULL,
280: (user_opcode_handler_t)NULL
281: };
282:
283: static zend_uchar zend_user_opcodes[256] = {0,
284: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
285: 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
286: 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
287: 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,
288: 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
289: 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,
290: 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
291: 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,
292: 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,
293: 145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,
294: 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,
295: 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,
296: 193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,
297: 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,
298: 225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,
299: 241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
300: };
1.1 misho 301:
302: static opcode_handler_t zend_vm_get_opcode_handler(zend_uchar opcode, zend_op* op);
303:
304:
1.1.1.2 misho 305: #undef OPLINE
306: #undef DCL_OPLINE
307: #undef USE_OPLINE
308: #undef LOAD_OPLINE
309: #undef SAVE_OPLINE
310: #define OPLINE EX(opline)
311: #define DCL_OPLINE
312: #define USE_OPLINE zend_op *opline = EX(opline);
313: #define LOAD_OPLINE()
314: #define SAVE_OPLINE()
315: #undef CHECK_EXCEPTION
316: #undef HANDLE_EXCEPTION
317: #undef HANDLE_EXCEPTION_LEAVE
318: #define CHECK_EXCEPTION() LOAD_OPLINE()
319: #define HANDLE_EXCEPTION() LOAD_OPLINE(); ZEND_VM_CONTINUE()
320: #define HANDLE_EXCEPTION_LEAVE() LOAD_OPLINE(); ZEND_VM_LEAVE()
321: #define LOAD_REGS()
322: #define ZEND_VM_CONTINUE() return 0
323: #define ZEND_VM_RETURN() return 1
324: #define ZEND_VM_ENTER() return 2
325: #define ZEND_VM_LEAVE() return 3
1.1 misho 326: #define ZEND_VM_DISPATCH(opcode, opline) return zend_vm_get_opcode_handler(opcode, opline)(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
327:
328: #define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL execute_data TSRMLS_CC
329: #undef EX
330: #define EX(element) execute_data->element
331:
1.1.1.2 misho 332: #undef EX_CV
333: #define EX_CV(var) EX(CVs)[var]
334: #undef EX_CVs
335: #define EX_CVs() EX(CVs)
336: #undef EX_T
337: #define EX_T(offset) (*(temp_variable *)((char *) EX(Ts) + offset))
338: #undef EX_Ts
339: #define EX_Ts() EX(Ts)
340:
1.1 misho 341:
342: ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)
343: {
1.1.1.2 misho 344: DCL_OPLINE
1.1 misho 345: zend_execute_data *execute_data;
346: zend_bool nested = 0;
347: zend_bool original_in_execution = EG(in_execution);
348:
349:
350: if (EG(exception)) {
351: return;
352: }
353:
354: EG(in_execution) = 1;
355:
356: zend_vm_enter:
357: /* Initialize execute_data */
358: execute_data = (zend_execute_data *)zend_vm_stack_alloc(
359: ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) +
360: ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)) +
361: ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * op_array->T TSRMLS_CC);
362:
363: EX(CVs) = (zval***)((char*)execute_data + ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)));
364: memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
365: EX(Ts) = (temp_variable *)(((char*)EX(CVs)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2)));
366: EX(fbc) = NULL;
367: EX(called_scope) = NULL;
368: EX(object) = NULL;
369: EX(old_error_reporting) = NULL;
370: EX(op_array) = op_array;
371: EX(symbol_table) = EG(active_symbol_table);
372: EX(prev_execute_data) = EG(current_execute_data);
373: EG(current_execute_data) = execute_data;
374: EX(nested) = nested;
375: nested = 1;
376:
1.1.1.2 misho 377: LOAD_REGS();
378:
379: if (!op_array->run_time_cache && op_array->last_cache_slot) {
380: op_array->run_time_cache = ecalloc(op_array->last_cache_slot, sizeof(void*));
1.1 misho 381: }
382:
383: if (op_array->this_var != -1 && EG(This)) {
384: Z_ADDREF_P(EG(This)); /* For $this pointer */
385: if (!EG(active_symbol_table)) {
1.1.1.2 misho 386: EX_CV(op_array->this_var) = (zval**)EX_CVs() + (op_array->last_var + op_array->this_var);
387: *EX_CV(op_array->this_var) = EG(This);
1.1 misho 388: } else {
1.1.1.2 misho 389: if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), (void**)&EX_CV(op_array->this_var))==FAILURE) {
1.1 misho 390: Z_DELREF_P(EG(This));
391: }
392: }
393: }
394:
1.1.1.2 misho 395: EX(opline) = UNEXPECTED((op_array->fn_flags & ZEND_ACC_INTERACTIVE) != 0) && EG(start_op) ? EG(start_op) : op_array->opcodes;
1.1 misho 396: EG(opline_ptr) = &EX(opline);
1.1.1.2 misho 397: LOAD_OPLINE();
1.1 misho 398:
399: EX(function_state).function = (zend_function *) op_array;
400: EX(function_state).arguments = NULL;
1.1.1.2 misho 401:
1.1 misho 402: while (1) {
403: int ret;
404: #ifdef ZEND_WIN32
405: if (EG(timed_out)) {
406: zend_timeout(0);
407: }
408: #endif
409:
1.1.1.2 misho 410: if ((ret = OPLINE->handler(execute_data TSRMLS_CC)) > 0) {
1.1 misho 411: switch (ret) {
412: case 1:
413: EG(in_execution) = original_in_execution;
414: return;
415: case 2:
416: op_array = EG(active_op_array);
417: goto zend_vm_enter;
418: case 3:
419: execute_data = EG(current_execute_data);
420: default:
421: break;
422: }
423: }
424:
425: }
426: zend_error_noreturn(E_ERROR, "Arrived at end of main loop which shouldn't happen");
427: }
428:
429: static int ZEND_FASTCALL ZEND_JMP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
430: {
1.1.1.2 misho 431: USE_OPLINE
432:
1.1 misho 433: #if DEBUG_ZEND>=2
1.1.1.2 misho 434: printf("Jumping to %d\n", opline->op1.opline_num);
1.1 misho 435: #endif
1.1.1.2 misho 436: ZEND_VM_SET_OPCODE(opline->op1.jmp_addr);
1.1 misho 437: ZEND_VM_CONTINUE(); /* CHECK_ME */
438: }
439:
440: static int ZEND_FASTCALL ZEND_INIT_STRING_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
441: {
1.1.1.2 misho 442: USE_OPLINE
443: zval *tmp = &EX_T(opline->result.var).tmp_var;
1.1 misho 444:
1.1.1.2 misho 445: SAVE_OPLINE();
1.1 misho 446: tmp->value.str.val = emalloc(1);
447: tmp->value.str.val[0] = 0;
448: tmp->value.str.len = 0;
449: Z_SET_REFCOUNT_P(tmp, 1);
450: tmp->type = IS_STRING;
451: Z_UNSET_ISREF_P(tmp);
1.1.1.2 misho 452: /*CHECK_EXCEPTION();*/
1.1 misho 453: ZEND_VM_NEXT_OPCODE();
454: }
455:
456: static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
457: {
458: zend_bool nested;
459: zend_op_array *op_array = EX(op_array);
460:
461: EG(current_execute_data) = EX(prev_execute_data);
462: EG(opline_ptr) = NULL;
463: if (!EG(active_symbol_table)) {
1.1.1.2 misho 464: zval ***cv = EX_CVs();
465: zval ***end = cv + op_array->last_var;
1.1 misho 466: while (cv != end) {
467: if (*cv) {
468: zval_ptr_dtor(*cv);
469: }
470: cv++;
471: }
472: }
473:
474: if ((op_array->fn_flags & ZEND_ACC_CLOSURE) && op_array->prototype) {
475: zval_ptr_dtor((zval**)&op_array->prototype);
476: }
477:
478: nested = EX(nested);
479:
480: zend_vm_stack_free(execute_data TSRMLS_CC);
481:
482: if (nested) {
483: execute_data = EG(current_execute_data);
1.1.1.2 misho 484: }
485: if (nested) {
486: USE_OPLINE
1.1 misho 487:
1.1.1.2 misho 488: LOAD_REGS();
489: LOAD_OPLINE();
490: if (UNEXPECTED(opline->opcode == ZEND_INCLUDE_OR_EVAL)) {
1.1 misho 491:
492: EX(function_state).function = (zend_function *) EX(op_array);
493: EX(function_state).arguments = NULL;
494: EX(object) = EX(current_object);
495:
496: EG(opline_ptr) = &EX(opline);
497: EG(active_op_array) = EX(op_array);
498: EG(return_value_ptr_ptr) = EX(original_return_value);
499: destroy_op_array(op_array TSRMLS_CC);
500: efree(op_array);
1.1.1.2 misho 501: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 502: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 503: HANDLE_EXCEPTION_LEAVE();
504: } else if (RETURN_VALUE_USED(opline)) {
505: if (!EX_T(opline->result.var).var.ptr) { /* there was no return statement */
506: zval *retval;
507:
508: ALLOC_ZVAL(retval);
509: ZVAL_BOOL(retval, 1);
510: INIT_PZVAL(retval);
511: EX_T(opline->result.var).var.ptr = retval;
512: }
1.1 misho 513: }
514:
1.1.1.2 misho 515: ZEND_VM_INC_OPCODE();
1.1 misho 516: ZEND_VM_LEAVE();
517: } else {
518:
519: EG(opline_ptr) = &EX(opline);
520: EG(active_op_array) = EX(op_array);
521: EG(return_value_ptr_ptr) = EX(original_return_value);
522: if (EG(active_symbol_table)) {
523: if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
524: zend_hash_destroy(EG(active_symbol_table));
525: FREE_HASHTABLE(EG(active_symbol_table));
526: } else {
527: /* clean before putting into the cache, since clean
528: could call dtors, which could use cached hash */
529: zend_hash_clean(EG(active_symbol_table));
530: *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
531: }
532: }
533: EG(active_symbol_table) = EX(symbol_table);
534:
535: EX(function_state).function = (zend_function *) EX(op_array);
536: EX(function_state).arguments = NULL;
537:
538: if (EG(This)) {
1.1.1.2 misho 539: if (UNEXPECTED(EG(exception) != NULL) && IS_CTOR_CALL(EX(called_scope))) {
1.1 misho 540: if (IS_CTOR_USED(EX(called_scope))) {
541: Z_DELREF_P(EG(This));
542: }
543: if (Z_REFCOUNT_P(EG(This)) == 1) {
544: zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
545: }
546: }
547: zval_ptr_dtor(&EG(This));
548: }
549: EG(This) = EX(current_this);
550: EG(scope) = EX(current_scope);
551: EG(called_scope) = EX(current_called_scope);
552:
553: EX(object) = EX(current_object);
554: EX(called_scope) = DECODE_CTOR(EX(called_scope));
555:
556: zend_vm_stack_clear_multiple(TSRMLS_C);
557:
1.1.1.2 misho 558: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 559: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 560: if (RETURN_VALUE_USED(opline) && EX_T(opline->result.var).var.ptr) {
561: zval_ptr_dtor(&EX_T(opline->result.var).var.ptr);
1.1 misho 562: }
1.1.1.2 misho 563: HANDLE_EXCEPTION_LEAVE();
1.1 misho 564: }
565:
1.1.1.2 misho 566: ZEND_VM_INC_OPCODE();
1.1 misho 567: ZEND_VM_LEAVE();
568: }
569: }
570: ZEND_VM_RETURN();
571: }
572:
573: static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
574: {
1.1.1.2 misho 575: USE_OPLINE
1.1 misho 576: zend_bool should_change_scope = 0;
1.1.1.2 misho 577: zend_function *fbc = EX(function_state).function;
1.1 misho 578:
1.1.1.2 misho 579: SAVE_OPLINE();
580: if (UNEXPECTED((fbc->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_DEPRECATED)) != 0)) {
581: if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_ABSTRACT) != 0)) {
582: zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", fbc->common.scope->name, fbc->common.function_name);
583: CHECK_EXCEPTION();
1.1 misho 584: ZEND_VM_NEXT_OPCODE(); /* Never reached */
585: }
1.1.1.2 misho 586: if (UNEXPECTED((fbc->common.fn_flags & ZEND_ACC_DEPRECATED) != 0)) {
1.1 misho 587: zend_error(E_DEPRECATED, "Function %s%s%s() is deprecated",
1.1.1.2 misho 588: fbc->common.scope ? fbc->common.scope->name : "",
589: fbc->common.scope ? "::" : "",
590: fbc->common.function_name);
1.1 misho 591: }
592: }
1.1.1.2 misho 593: if (fbc->common.scope &&
594: !(fbc->common.fn_flags & ZEND_ACC_STATIC) &&
1.1 misho 595: !EX(object)) {
596:
1.1.1.2 misho 597: if (fbc->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1 misho 598: /* FIXME: output identifiers properly */
1.1.1.2 misho 599: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically", fbc->common.scope->name, fbc->common.function_name);
1.1 misho 600: } else {
601: /* FIXME: output identifiers properly */
602: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 603: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically", fbc->common.scope->name, fbc->common.function_name);
1.1 misho 604: }
605: }
606:
1.1.1.2 misho 607: if (fbc->type == ZEND_USER_FUNCTION || fbc->common.scope) {
1.1 misho 608: should_change_scope = 1;
609: EX(current_this) = EG(This);
610: EX(current_scope) = EG(scope);
611: EX(current_called_scope) = EG(called_scope);
612: EG(This) = EX(object);
1.1.1.2 misho 613: EG(scope) = (fbc->type == ZEND_USER_FUNCTION || !EX(object)) ? fbc->common.scope : NULL;
1.1 misho 614: EG(called_scope) = EX(called_scope);
615: }
616:
617: zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
618: EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
1.1.1.2 misho 619: LOAD_OPLINE();
620:
621: if (fbc->type == ZEND_INTERNAL_FUNCTION) {
622: temp_variable *ret = &EX_T(opline->result.var);
1.1 misho 623:
1.1.1.2 misho 624: if (fbc->common.arg_info) {
1.1 misho 625: zend_uint i=0;
626: zval **p = (zval**)EX(function_state).arguments;
627: ulong arg_count = opline->extended_value;
628:
629: while (arg_count>0) {
1.1.1.2 misho 630: zend_verify_arg_type(fbc, ++i, *(p-arg_count), 0 TSRMLS_CC);
1.1 misho 631: arg_count--;
632: }
633: }
1.1.1.2 misho 634:
1.1.1.3 misho 635: if (EXPECTED(EG(exception) == NULL)) {
636: MAKE_STD_ZVAL(ret->var.ptr);
637: ZVAL_NULL(ret->var.ptr);
638: ret->var.ptr_ptr = &ret->var.ptr;
639: ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
1.1 misho 640:
1.1.1.3 misho 641: if (!zend_execute_internal) {
642: /* saves one function call if zend_execute_internal is not used */
643: fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
644: } else {
645: zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
646: }
647:
648: if (!RETURN_VALUE_USED(opline)) {
649: zval_ptr_dtor(&ret->var.ptr);
650: }
651: } else if (RETURN_VALUE_USED(opline)) {
652: EX_T(opline->result.var).var.ptr = NULL;
1.1 misho 653: }
1.1.1.2 misho 654: } else if (fbc->type == ZEND_USER_FUNCTION) {
1.1 misho 655: EX(original_return_value) = EG(return_value_ptr_ptr);
656: EG(active_symbol_table) = NULL;
1.1.1.2 misho 657: EG(active_op_array) = &fbc->op_array;
1.1 misho 658: EG(return_value_ptr_ptr) = NULL;
659: if (RETURN_VALUE_USED(opline)) {
1.1.1.2 misho 660: temp_variable *ret = &EX_T(opline->result.var);
661:
662: ret->var.ptr = NULL;
663: EG(return_value_ptr_ptr) = &ret->var.ptr;
664: ret->var.ptr_ptr = &ret->var.ptr;
665: ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
1.1 misho 666: }
667:
1.1.1.2 misho 668: if (EXPECTED(zend_execute == execute)) {
669: if (EXPECTED(EG(exception) == NULL)) {
670: ZEND_VM_ENTER();
671: }
1.1 misho 672: } else {
673: zend_execute(EG(active_op_array) TSRMLS_CC);
674: }
675:
676: EG(opline_ptr) = &EX(opline);
677: EG(active_op_array) = EX(op_array);
678: EG(return_value_ptr_ptr) = EX(original_return_value);
679: if (EG(active_symbol_table)) {
680: if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
681: zend_hash_destroy(EG(active_symbol_table));
682: FREE_HASHTABLE(EG(active_symbol_table));
683: } else {
684: /* clean before putting into the cache, since clean
685: could call dtors, which could use cached hash */
686: zend_hash_clean(EG(active_symbol_table));
687: *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
688: }
689: }
690: EG(active_symbol_table) = EX(symbol_table);
691: } else { /* ZEND_OVERLOADED_FUNCTION */
1.1.1.2 misho 692: MAKE_STD_ZVAL(EX_T(opline->result.var).var.ptr);
693: ZVAL_NULL(EX_T(opline->result.var).var.ptr);
1.1 misho 694:
695: /* Not sure what should be done here if it's a static method */
1.1.1.2 misho 696: if (EXPECTED(EX(object) != NULL)) {
697: Z_OBJ_HT_P(EX(object))->call_method(fbc->common.function_name, opline->extended_value, EX_T(opline->result.var).var.ptr, &EX_T(opline->result.var).var.ptr, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
1.1 misho 698: } else {
699: zend_error_noreturn(E_ERROR, "Cannot call overloaded function for non-object");
700: }
701:
1.1.1.2 misho 702: if (fbc->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) {
703: efree((char*)fbc->common.function_name);
1.1 misho 704: }
1.1.1.2 misho 705: efree(fbc);
1.1 misho 706:
707: if (!RETURN_VALUE_USED(opline)) {
1.1.1.2 misho 708: zval_ptr_dtor(&EX_T(opline->result.var).var.ptr);
1.1 misho 709: } else {
1.1.1.2 misho 710: Z_UNSET_ISREF_P(EX_T(opline->result.var).var.ptr);
711: Z_SET_REFCOUNT_P(EX_T(opline->result.var).var.ptr, 1);
712: EX_T(opline->result.var).var.fcall_returned_reference = 0;
713: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 714: }
715: }
716:
717: EX(function_state).function = (zend_function *) EX(op_array);
718: EX(function_state).arguments = NULL;
719:
720: if (should_change_scope) {
721: if (EG(This)) {
1.1.1.2 misho 722: if (UNEXPECTED(EG(exception) != NULL) && IS_CTOR_CALL(EX(called_scope))) {
1.1 misho 723: if (IS_CTOR_USED(EX(called_scope))) {
724: Z_DELREF_P(EG(This));
725: }
726: if (Z_REFCOUNT_P(EG(This)) == 1) {
727: zend_object_store_ctor_failed(EG(This) TSRMLS_CC);
728: }
729: }
730: zval_ptr_dtor(&EG(This));
731: }
732: EG(This) = EX(current_this);
733: EG(scope) = EX(current_scope);
734: EG(called_scope) = EX(current_called_scope);
735: }
736:
737: EX(object) = EX(current_object);
738: EX(called_scope) = DECODE_CTOR(EX(called_scope));
739:
740: zend_vm_stack_clear_multiple(TSRMLS_C);
741:
1.1.1.2 misho 742: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 743: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 744: if (RETURN_VALUE_USED(opline) && EX_T(opline->result.var).var.ptr) {
745: zval_ptr_dtor(&EX_T(opline->result.var).var.ptr);
1.1 misho 746: }
1.1.1.2 misho 747: HANDLE_EXCEPTION();
1.1 misho 748: }
749:
750: ZEND_VM_NEXT_OPCODE();
751: }
752:
753: static int ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
754: {
755: EX(function_state).function = EX(fbc);
756: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
757: }
758:
759: static int ZEND_FASTCALL ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
760: {
1.1.1.2 misho 761: USE_OPLINE
762: zend_uint arg_num = opline->op1.num;
1.1 misho 763: zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
764:
1.1.1.2 misho 765: SAVE_OPLINE();
766: if (UNEXPECTED(param == NULL)) {
1.1 misho 767: if (zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL, opline->extended_value TSRMLS_CC)) {
1.1.1.2 misho 768: const char *space;
769: const char *class_name;
770: zend_execute_data *ptr;
771:
772: if (EG(active_op_array)->scope) {
773: class_name = EG(active_op_array)->scope->name;
774: space = "::";
775: } else {
776: class_name = space = "";
777: }
778: ptr = EX(prev_execute_data);
779:
1.1 misho 780: if(ptr && ptr->op_array) {
1.1.1.2 misho 781: zend_error(E_WARNING, "Missing argument %u for %s%s%s(), called in %s on line %d and defined", opline->op1.num, class_name, space, get_active_function_name(TSRMLS_C), ptr->op_array->filename, ptr->opline->lineno);
1.1 misho 782: } else {
1.1.1.2 misho 783: zend_error(E_WARNING, "Missing argument %u for %s%s%s()", opline->op1.num, class_name, space, get_active_function_name(TSRMLS_C));
1.1 misho 784: }
785: }
786: } else {
787: zval **var_ptr;
788:
789: zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param, opline->extended_value TSRMLS_CC);
1.1.1.2 misho 790: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->result.var TSRMLS_CC);
1.1 misho 791: Z_DELREF_PP(var_ptr);
792: *var_ptr = *param;
793: Z_ADDREF_PP(var_ptr);
794: }
795:
1.1.1.2 misho 796: CHECK_EXCEPTION();
1.1 misho 797: ZEND_VM_NEXT_OPCODE();
798: }
799:
800: static int ZEND_FASTCALL ZEND_NEW_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
801: {
1.1.1.2 misho 802: USE_OPLINE
1.1 misho 803: zval *object_zval;
804: zend_function *constructor;
805:
1.1.1.2 misho 806: SAVE_OPLINE();
807: if (UNEXPECTED((EX_T(opline->op1.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) != 0)) {
808: if (EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {
809: zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", EX_T(opline->op1.var).class_entry->name);
810: } else if ((EX_T(opline->op1.var).class_entry->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
811: zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", EX_T(opline->op1.var).class_entry->name);
1.1 misho 812: } else {
1.1.1.2 misho 813: zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", EX_T(opline->op1.var).class_entry->name);
1.1 misho 814: }
815: }
816: ALLOC_ZVAL(object_zval);
1.1.1.2 misho 817: object_init_ex(object_zval, EX_T(opline->op1.var).class_entry);
1.1 misho 818: INIT_PZVAL(object_zval);
819:
820: constructor = Z_OBJ_HT_P(object_zval)->get_constructor(object_zval TSRMLS_CC);
821:
822: if (constructor == NULL) {
823: if (RETURN_VALUE_USED(opline)) {
1.1.1.2 misho 824: AI_SET_PTR(&EX_T(opline->result.var), object_zval);
1.1 misho 825: } else {
826: zval_ptr_dtor(&object_zval);
827: }
1.1.1.2 misho 828: ZEND_VM_JMP(EX(op_array)->opcodes + opline->op2.opline_num);
1.1 misho 829: } else {
830: if (RETURN_VALUE_USED(opline)) {
831: PZVAL_LOCK(object_zval);
1.1.1.2 misho 832: AI_SET_PTR(&EX_T(opline->result.var), object_zval);
1.1 misho 833: }
834:
835: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), ENCODE_CTOR(EX(called_scope), RETURN_VALUE_USED(opline)));
836:
837: /* We are not handling overloaded classes right now */
838: EX(object) = object_zval;
839: EX(fbc) = constructor;
1.1.1.2 misho 840: EX(called_scope) = EX_T(opline->op1.var).class_entry;
1.1 misho 841:
1.1.1.2 misho 842: CHECK_EXCEPTION();
1.1 misho 843: ZEND_VM_NEXT_OPCODE();
844: }
845: }
846:
847: static int ZEND_FASTCALL ZEND_BEGIN_SILENCE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
848: {
1.1.1.2 misho 849: USE_OPLINE
1.1 misho 850:
1.1.1.2 misho 851: SAVE_OPLINE();
852: Z_LVAL(EX_T(opline->result.var).tmp_var) = EG(error_reporting);
853: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_LONG; /* shouldn't be necessary */
1.1 misho 854: if (EX(old_error_reporting) == NULL) {
1.1.1.2 misho 855: EX(old_error_reporting) = &EX_T(opline->result.var).tmp_var;
1.1 misho 856: }
857:
858: if (EG(error_reporting)) {
1.1.1.2 misho 859: do {
860: EG(error_reporting) = 0;
861: if (!EG(error_reporting_ini_entry)) {
862: if (UNEXPECTED(zend_hash_find(EG(ini_directives), "error_reporting", sizeof("error_reporting"), (void **) &EG(error_reporting_ini_entry)) == FAILURE)) {
863: break;
864: }
865: }
866: if (!EG(error_reporting_ini_entry)->modified) {
867: if (!EG(modified_ini_directives)) {
868: ALLOC_HASHTABLE(EG(modified_ini_directives));
869: zend_hash_init(EG(modified_ini_directives), 8, NULL, NULL, 0);
870: }
871: if (EXPECTED(zend_hash_add(EG(modified_ini_directives), "error_reporting", sizeof("error_reporting"), &EG(error_reporting_ini_entry), sizeof(zend_ini_entry*), NULL) == SUCCESS)) {
872: EG(error_reporting_ini_entry)->orig_value = EG(error_reporting_ini_entry)->value;
873: EG(error_reporting_ini_entry)->orig_value_length = EG(error_reporting_ini_entry)->value_length;
874: EG(error_reporting_ini_entry)->orig_modifiable = EG(error_reporting_ini_entry)->modifiable;
875: EG(error_reporting_ini_entry)->modified = 1;
876: }
877: } else if (EG(error_reporting_ini_entry)->value != EG(error_reporting_ini_entry)->orig_value) {
878: efree(EG(error_reporting_ini_entry)->value);
879: }
880: EG(error_reporting_ini_entry)->value = estrndup("0", sizeof("0")-1);
881: EG(error_reporting_ini_entry)->value_length = sizeof("0")-1;
882: } while (0);
1.1 misho 883: }
1.1.1.2 misho 884: CHECK_EXCEPTION();
1.1 misho 885: ZEND_VM_NEXT_OPCODE();
886: }
887:
888: static int ZEND_FASTCALL ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
889: {
1.1.1.2 misho 890: SAVE_OPLINE();
1.1 misho 891: zend_error_noreturn(E_ERROR, "Cannot call abstract method %s::%s()", EG(scope)->name, EX(op_array)->function_name);
892: ZEND_VM_NEXT_OPCODE(); /* Never reached */
893: }
894:
895: static int ZEND_FASTCALL ZEND_EXT_STMT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
896: {
1.1.1.2 misho 897: SAVE_OPLINE();
1.1 misho 898: if (!EG(no_extensions)) {
899: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_statement_handler, EX(op_array) TSRMLS_CC);
900: }
1.1.1.2 misho 901: CHECK_EXCEPTION();
1.1 misho 902: ZEND_VM_NEXT_OPCODE();
903: }
904:
905: static int ZEND_FASTCALL ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
906: {
1.1.1.2 misho 907: SAVE_OPLINE();
1.1 misho 908: if (!EG(no_extensions)) {
909: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_begin_handler, EX(op_array) TSRMLS_CC);
910: }
1.1.1.2 misho 911: CHECK_EXCEPTION();
1.1 misho 912: ZEND_VM_NEXT_OPCODE();
913: }
914:
915: static int ZEND_FASTCALL ZEND_EXT_FCALL_END_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
916: {
1.1.1.2 misho 917: SAVE_OPLINE();
1.1 misho 918: if (!EG(no_extensions)) {
919: zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_fcall_end_handler, EX(op_array) TSRMLS_CC);
920: }
1.1.1.2 misho 921: CHECK_EXCEPTION();
1.1 misho 922: ZEND_VM_NEXT_OPCODE();
923: }
924:
925: static int ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
926: {
1.1.1.2 misho 927: USE_OPLINE
1.1 misho 928:
1.1.1.2 misho 929: SAVE_OPLINE();
930: EX_T(opline->result.var).class_entry = do_bind_class(EX(op_array), opline, EG(class_table), 0 TSRMLS_CC);
931: CHECK_EXCEPTION();
1.1 misho 932: ZEND_VM_NEXT_OPCODE();
933: }
934:
935: static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
936: {
1.1.1.2 misho 937: USE_OPLINE
1.1 misho 938:
1.1.1.2 misho 939: SAVE_OPLINE();
940: EX_T(opline->result.var).class_entry = do_bind_inherited_class(EX(op_array), opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
941: CHECK_EXCEPTION();
1.1 misho 942: ZEND_VM_NEXT_OPCODE();
943: }
944:
945: static int ZEND_FASTCALL ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
946: {
1.1.1.2 misho 947: USE_OPLINE
1.1 misho 948: zend_class_entry **pce, **pce_orig;
949:
1.1.1.2 misho 950: SAVE_OPLINE();
951: if (zend_hash_quick_find(EG(class_table), Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void**)&pce) == FAILURE ||
952: (zend_hash_quick_find(EG(class_table), Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), Z_HASH_P(opline->op1.zv), (void**)&pce_orig) == SUCCESS &&
1.1 misho 953: *pce != *pce_orig)) {
1.1.1.2 misho 954: do_bind_inherited_class(EX(op_array), opline, EG(class_table), EX_T(opline->extended_value).class_entry, 0 TSRMLS_CC);
1.1 misho 955: }
1.1.1.2 misho 956: CHECK_EXCEPTION();
1.1 misho 957: ZEND_VM_NEXT_OPCODE();
958: }
959:
960: static int ZEND_FASTCALL ZEND_DECLARE_FUNCTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
961: {
1.1.1.2 misho 962: USE_OPLINE
963:
964: SAVE_OPLINE();
965: do_bind_function(EX(op_array), opline, EG(function_table), 0);
966: CHECK_EXCEPTION();
967: ZEND_VM_NEXT_OPCODE();
968: }
969:
970: static int ZEND_FASTCALL ZEND_TICKS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
971: {
972: USE_OPLINE
973:
974: SAVE_OPLINE();
975: if (++EG(ticks_count)>=opline->extended_value) {
976: EG(ticks_count)=0;
977: if (zend_ticks_function) {
978: zend_ticks_function(opline->extended_value);
979: }
980: }
981: CHECK_EXCEPTION();
1.1 misho 982: ZEND_VM_NEXT_OPCODE();
983: }
984:
985: static int ZEND_FASTCALL ZEND_EXT_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
986: {
987: ZEND_VM_NEXT_OPCODE();
988: }
989:
990: static int ZEND_FASTCALL ZEND_NOP_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
991: {
992: ZEND_VM_NEXT_OPCODE();
993: }
994:
1.1.1.2 misho 995: static int ZEND_FASTCALL ZEND_ADD_TRAIT_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
996: {
997: USE_OPLINE
998: zend_class_entry *ce = EX_T(opline->op1.var).class_entry;
999: zend_class_entry *trait;
1000:
1001: SAVE_OPLINE();
1002: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1003: trait = CACHED_PTR(opline->op2.literal->cache_slot);
1004: } else {
1005: trait = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv),
1006: Z_STRLEN_P(opline->op2.zv),
1007: opline->op2.literal + 1,
1008: opline->extended_value TSRMLS_CC);
1009: if (UNEXPECTED(trait == NULL)) {
1010: CHECK_EXCEPTION();
1011: ZEND_VM_NEXT_OPCODE();
1012: }
1013: if (!((trait->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT)) {
1014: zend_error_noreturn(E_ERROR, "%s cannot use %s - it is not a trait", ce->name, trait->name);
1015: }
1016: CACHE_PTR(opline->op2.literal->cache_slot, trait);
1017: }
1018:
1019: zend_do_implement_trait(ce, trait TSRMLS_CC);
1020:
1021: CHECK_EXCEPTION();
1022: ZEND_VM_NEXT_OPCODE();
1023: }
1024:
1025: static int ZEND_FASTCALL ZEND_BIND_TRAITS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1026: {
1027: USE_OPLINE
1028: zend_class_entry *ce = EX_T(opline->op1.var).class_entry;
1029:
1030: SAVE_OPLINE();
1031: zend_do_bind_traits(ce TSRMLS_CC);
1032: CHECK_EXCEPTION();
1033: ZEND_VM_NEXT_OPCODE();
1034: }
1035:
1.1 misho 1036: static int ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1037: {
1038: zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes;
1039: int i;
1.1.1.2 misho 1040: zend_uint catch_op_num = 0;
1.1 misho 1041: int catched = 0;
1042: zval restored_error_reporting;
1043:
1.1.1.2 misho 1044: void **stack_frame = (void**)(((char*)EX_Ts()) +
1.1 misho 1045: (ZEND_MM_ALIGNED_SIZE(sizeof(temp_variable)) * EX(op_array)->T));
1046:
1047: while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
1048: zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
1049: zval_ptr_dtor(&stack_zval_p);
1050: }
1051:
1052: for (i=0; i<EG(active_op_array)->last_try_catch; i++) {
1053: if (EG(active_op_array)->try_catch_array[i].try_op > op_num) {
1054: /* further blocks will not be relevant... */
1055: break;
1.1.1.2 misho 1056: } else if (op_num < EG(active_op_array)->try_catch_array[i].catch_op) {
1.1 misho 1057: catch_op_num = EX(op_array)->try_catch_array[i].catch_op;
1058: catched = 1;
1059: }
1060: }
1061:
1062: while (EX(fbc)) {
1063: EX(called_scope) = (zend_class_entry*)zend_ptr_stack_pop(&EG(arg_types_stack));
1064: if (EX(object)) {
1065: if (IS_CTOR_CALL(EX(called_scope))) {
1066: if (IS_CTOR_USED(EX(called_scope))) {
1067: Z_DELREF_P(EX(object));
1068: }
1069: if (Z_REFCOUNT_P(EX(object)) == 1) {
1070: zend_object_store_ctor_failed(EX(object) TSRMLS_CC);
1071: }
1072: }
1073: zval_ptr_dtor(&EX(object));
1074: }
1075: EX(called_scope) = DECODE_CTOR(EX(called_scope));
1076: zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
1077: }
1078:
1079: for (i=0; i<EX(op_array)->last_brk_cont; i++) {
1080: if (EX(op_array)->brk_cont_array[i].start < 0) {
1081: continue;
1082: } else if (EX(op_array)->brk_cont_array[i].start > op_num) {
1083: /* further blocks will not be relevant... */
1084: break;
1085: } else if (op_num < EX(op_array)->brk_cont_array[i].brk) {
1086: if (!catched ||
1087: catch_op_num >= EX(op_array)->brk_cont_array[i].brk) {
1088: zend_op *brk_opline = &EX(op_array)->opcodes[EX(op_array)->brk_cont_array[i].brk];
1089:
1090: switch (brk_opline->opcode) {
1091: case ZEND_SWITCH_FREE:
1.1.1.2 misho 1092: if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
1093: zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
1.1 misho 1094: }
1095: break;
1096: case ZEND_FREE:
1.1.1.2 misho 1097: if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
1098: zendi_zval_dtor(EX_T(brk_opline->op1.var).tmp_var);
1.1 misho 1099: }
1100: break;
1101: }
1102: }
1103: }
1104: }
1105:
1106: /* restore previous error_reporting value */
1107: if (!EG(error_reporting) && EX(old_error_reporting) != NULL && Z_LVAL_P(EX(old_error_reporting)) != 0) {
1108: Z_TYPE(restored_error_reporting) = IS_LONG;
1109: Z_LVAL(restored_error_reporting) = Z_LVAL_P(EX(old_error_reporting));
1110: convert_to_string(&restored_error_reporting);
1111: 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);
1112: zendi_zval_dtor(restored_error_reporting);
1113: }
1114: EX(old_error_reporting) = NULL;
1115:
1116: if (!catched) {
1117: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1118: } else {
1119: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[catch_op_num]);
1120: ZEND_VM_CONTINUE();
1121: }
1122: }
1123:
1124: static int ZEND_FASTCALL ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1125: {
1.1.1.2 misho 1126: USE_OPLINE
1127:
1128: SAVE_OPLINE();
1129: zend_verify_abstract_class(EX_T(opline->op1.var).class_entry TSRMLS_CC);
1130: CHECK_EXCEPTION();
1.1 misho 1131: ZEND_VM_NEXT_OPCODE();
1132: }
1133:
1134: static int ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1135: {
1.1.1.2 misho 1136: USE_OPLINE
1137: int ret;
1138:
1139: SAVE_OPLINE();
1140: ret = zend_user_opcode_handlers[opline->opcode](ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_INTERNAL);
1141: LOAD_OPLINE();
1.1 misho 1142:
1143: switch (ret) {
1144: case ZEND_USER_OPCODE_CONTINUE:
1145: ZEND_VM_CONTINUE();
1146: case ZEND_USER_OPCODE_RETURN:
1147: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1148: case ZEND_USER_OPCODE_ENTER:
1149: ZEND_VM_ENTER();
1150: case ZEND_USER_OPCODE_LEAVE:
1151: ZEND_VM_LEAVE();
1152: case ZEND_USER_OPCODE_DISPATCH:
1.1.1.2 misho 1153: ZEND_VM_DISPATCH(opline->opcode, opline);
1.1 misho 1154: default:
1.1.1.2 misho 1155: ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline);
1.1 misho 1156: }
1157: }
1158:
1159: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1160: {
1.1.1.2 misho 1161: USE_OPLINE
1.1 misho 1162:
1.1.1.2 misho 1163: SAVE_OPLINE();
1164: EG(exception) = NULL;
1.1 misho 1165: if (IS_CONST == IS_UNUSED) {
1.1.1.2 misho 1166: EX_T(opline->result.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1167: CHECK_EXCEPTION();
1.1 misho 1168: ZEND_VM_NEXT_OPCODE();
1169: } else {
1170:
1.1.1.2 misho 1171: zval *class_name = opline->op2.zv;
1.1 misho 1172:
1.1.1.2 misho 1173: if (IS_CONST == IS_CONST) {
1174: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1175: EX_T(opline->result.var).class_entry = CACHED_PTR(opline->op2.literal->cache_slot);
1176: } else {
1177: EX_T(opline->result.var).class_entry = zend_fetch_class_by_name(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1178: CACHE_PTR(opline->op2.literal->cache_slot, EX_T(opline->result.var).class_entry);
1179: }
1180: } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
1181: EX_T(opline->result.var).class_entry = Z_OBJCE_P(class_name);
1.1 misho 1182: } else if (Z_TYPE_P(class_name) == IS_STRING) {
1.1.1.2 misho 1183: EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
1.1 misho 1184: } else {
1185: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1186: }
1187:
1.1.1.2 misho 1188: CHECK_EXCEPTION();
1.1 misho 1189: ZEND_VM_NEXT_OPCODE();
1190: }
1191: }
1192:
1193: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1194: {
1.1.1.2 misho 1195: USE_OPLINE
1.1 misho 1196: zval *function_name;
1197: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1198:
1199: if (IS_CONST == IS_CONST) {
1.1.1.2 misho 1200: function_name = (zval*)(opline->op2.literal+1);
1201: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1202: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
1203: } else if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(function_name), Z_STRLEN_P(function_name)+1, Z_HASH_P(function_name), (void **) &EX(fbc)) == FAILURE)) {
1204: SAVE_OPLINE();
1205: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
1206: } else {
1207: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1208: }
1.1.1.2 misho 1209: EX(object) = NULL;
1210: /*CHECK_EXCEPTION();*/
1211: ZEND_VM_NEXT_OPCODE();
1.1 misho 1212: } else {
1.1.1.2 misho 1213: char *function_name_strval, *lcname;
1214: int function_name_strlen;
1215:
1216:
1217: SAVE_OPLINE();
1218: function_name = opline->op2.zv;
1219:
1220: if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1221: function_name_strval = Z_STRVAL_P(function_name);
1222: function_name_strlen = Z_STRLEN_P(function_name);
1223: if (function_name_strval[0] == '\\') {
1224: function_name_strlen -= 1;
1225: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
1226: } else {
1227: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
1228: }
1229: if (UNEXPECTED(zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE)) {
1230: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
1231: }
1232: efree(lcname);
1.1 misho 1233:
1.1.1.2 misho 1234: EX(object) = NULL;
1235: CHECK_EXCEPTION();
1236: ZEND_VM_NEXT_OPCODE();
1237: } else if (IS_CONST != IS_CONST && IS_CONST != IS_TMP_VAR &&
1238: EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
1.1 misho 1239: Z_OBJ_HANDLER_P(function_name, get_closure) &&
1240: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1241: if (EX(object)) {
1242: Z_ADDREF_P(EX(object));
1243: }
1244: if (IS_CONST == IS_VAR && 0 &&
1245: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
1246: /* Delay closure destruction until its invocation */
1247: EX(fbc)->common.prototype = (zend_function*)function_name;
1248: } else {
1249:
1250: }
1.1.1.2 misho 1251: CHECK_EXCEPTION();
1.1 misho 1252: ZEND_VM_NEXT_OPCODE();
1.1.1.2 misho 1253: } else if (IS_CONST != IS_CONST &&
1254: EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
1255: zend_hash_num_elements(Z_ARRVAL_P(function_name)) == 2) {
1256: zend_class_entry *ce;
1257: zval **method = NULL;
1258: zval **obj = NULL;
1.1 misho 1259:
1.1.1.2 misho 1260: zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
1261: zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
1262:
1.1.1.3 misho 1263: if (!obj || !method) {
1264: zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
1265: }
1266:
1.1.1.2 misho 1267: if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
1268: zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
1269: }
1270:
1271: if (Z_TYPE_PP(method) != IS_STRING) {
1272: zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
1273: }
1274:
1275: if (Z_TYPE_PP(obj) == IS_STRING) {
1276: ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC);
1.1.1.4 misho 1277: if (UNEXPECTED(EG(exception) != NULL)) {
1278: HANDLE_EXCEPTION();
1279: }
1.1.1.2 misho 1280: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 1281: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj));
1.1.1.2 misho 1282: }
1283: EX(called_scope) = ce;
1284: EX(object) = NULL;
1285:
1286: if (ce->get_static_method) {
1287: EX(fbc) = ce->get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method) TSRMLS_CC);
1288: } else {
1289: EX(fbc) = zend_std_get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1290: }
1291: } else {
1292: EX(object) = *obj;
1293: ce = EX(called_scope) = Z_OBJCE_PP(obj);
1.1 misho 1294:
1.1.1.2 misho 1295: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1296: if (UNEXPECTED(EX(fbc) == NULL)) {
1297: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), Z_STRVAL_PP(method));
1298: }
1299:
1300: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
1301: EX(object) = NULL;
1302: } else {
1303: if (!PZVAL_IS_REF(EX(object))) {
1304: Z_ADDREF_P(EX(object)); /* For $this pointer */
1305: } else {
1306: zval *this_ptr;
1307: ALLOC_ZVAL(this_ptr);
1308: INIT_PZVAL_COPY(this_ptr, EX(object));
1309: zval_copy_ctor(this_ptr);
1310: EX(object) = this_ptr;
1311: }
1312: }
1313: }
1314:
1315: if (UNEXPECTED(EX(fbc) == NULL)) {
1316: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, Z_STRVAL_PP(method));
1317: }
1318:
1319: CHECK_EXCEPTION();
1320: ZEND_VM_NEXT_OPCODE();
1.1 misho 1321: } else {
1.1.1.2 misho 1322: zend_error_noreturn(E_ERROR, "Function name must be a string");
1.1 misho 1323: }
1324: }
1325: }
1326:
1327:
1328: static int ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1329: {
1.1.1.2 misho 1330: USE_OPLINE
1331: zend_literal *func_name;
1.1 misho 1332:
1333: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1334:
1.1.1.2 misho 1335: func_name = opline->op2.literal + 1;
1336: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1337: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
1338: } else if (zend_hash_quick_find(EG(function_table), Z_STRVAL(func_name->constant), Z_STRLEN(func_name->constant)+1, func_name->hash_value, (void **) &EX(fbc))==FAILURE) {
1339: func_name++;
1340: if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL(func_name->constant), Z_STRLEN(func_name->constant)+1, func_name->hash_value, (void **) &EX(fbc))==FAILURE)) {
1341: SAVE_OPLINE();
1342: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
1343: } else {
1344: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1345: }
1.1.1.2 misho 1346: } else {
1347: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1348: }
1349:
1350: EX(object) = NULL;
1351: ZEND_VM_NEXT_OPCODE();
1352: }
1353:
1354: static int ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1355: {
1.1.1.2 misho 1356: USE_OPLINE
1.1 misho 1357: zval *assignment_value;
1.1.1.2 misho 1358: zend_uint arg_num = opline->op1.num;
1.1 misho 1359: zval **param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
1360: zval **var_ptr;
1361:
1.1.1.2 misho 1362: SAVE_OPLINE();
1.1 misho 1363: if (param == NULL) {
1364: ALLOC_ZVAL(assignment_value);
1.1.1.2 misho 1365: *assignment_value = *opline->op2.zv;
1366: if ((Z_TYPE_P(assignment_value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT ||
1367: Z_TYPE_P(assignment_value)==IS_CONSTANT_ARRAY) {
1.1 misho 1368: Z_SET_REFCOUNT_P(assignment_value, 1);
1369: zval_update_constant(&assignment_value, 0 TSRMLS_CC);
1370: } else {
1371: zval_copy_ctor(assignment_value);
1372: }
1373: INIT_PZVAL(assignment_value);
1374: } else {
1375: assignment_value = *param;
1376: Z_ADDREF_P(assignment_value);
1377: }
1378:
1379: zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value, opline->extended_value TSRMLS_CC);
1.1.1.2 misho 1380: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->result.var TSRMLS_CC);
1.1.1.3 misho 1381: zval_ptr_dtor(var_ptr);
1.1 misho 1382: *var_ptr = assignment_value;
1383:
1.1.1.2 misho 1384: CHECK_EXCEPTION();
1.1 misho 1385: ZEND_VM_NEXT_OPCODE();
1386: }
1387:
1388: static int ZEND_FASTCALL ZEND_BRK_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1389: {
1.1.1.2 misho 1390: USE_OPLINE
1.1 misho 1391: zend_brk_cont_element *el;
1392:
1.1.1.2 misho 1393: SAVE_OPLINE();
1394: el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
1395: EX(op_array), EX_Ts() TSRMLS_CC);
1.1 misho 1396: ZEND_VM_JMP(EX(op_array)->opcodes + el->brk);
1397: }
1398:
1399: static int ZEND_FASTCALL ZEND_CONT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1400: {
1.1.1.2 misho 1401: USE_OPLINE
1.1 misho 1402: zend_brk_cont_element *el;
1403:
1.1.1.2 misho 1404: SAVE_OPLINE();
1405: el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->op1.opline_num,
1406: EX(op_array), EX_Ts() TSRMLS_CC);
1.1 misho 1407: ZEND_VM_JMP(EX(op_array)->opcodes + el->cont);
1408: }
1409:
1410: static int ZEND_FASTCALL ZEND_GOTO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1411: {
1412: zend_op *brk_opline;
1.1.1.2 misho 1413: USE_OPLINE
1.1 misho 1414: zend_brk_cont_element *el;
1415:
1.1.1.2 misho 1416: SAVE_OPLINE();
1417: el = zend_brk_cont(Z_LVAL_P(opline->op2.zv), opline->extended_value,
1418: EX(op_array), EX_Ts() TSRMLS_CC);
1.1 misho 1419:
1420: brk_opline = EX(op_array)->opcodes + el->brk;
1421:
1422: switch (brk_opline->opcode) {
1423: case ZEND_SWITCH_FREE:
1.1.1.2 misho 1424: if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
1425: zval_ptr_dtor(&EX_T(brk_opline->op1.var).var.ptr);
1.1 misho 1426: }
1427: break;
1428: case ZEND_FREE:
1.1.1.2 misho 1429: if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
1430: zendi_zval_dtor(EX_T(brk_opline->op1.var).tmp_var);
1.1 misho 1431: }
1432: break;
1433: }
1.1.1.2 misho 1434: ZEND_VM_JMP(opline->op1.jmp_addr);
1.1 misho 1435: }
1436:
1437: static int ZEND_FASTCALL ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1438: {
1.1.1.2 misho 1439: USE_OPLINE
1440: zend_class_entry *ce = EX_T(opline->op1.var).class_entry;
1441: zend_class_entry *iface;
1442:
1443: SAVE_OPLINE();
1444: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1445: iface = CACHED_PTR(opline->op2.literal->cache_slot);
1446: } else {
1447: iface = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1448: if (UNEXPECTED(iface == NULL)) {
1449: CHECK_EXCEPTION();
1450: ZEND_VM_NEXT_OPCODE();
1.1 misho 1451: }
1.1.1.3 misho 1452: CACHE_PTR(opline->op2.literal->cache_slot, iface);
1.1.1.2 misho 1453: }
1454:
1455: if (UNEXPECTED((iface->ce_flags & ZEND_ACC_INTERFACE) == 0)) {
1456: zend_error_noreturn(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);
1.1 misho 1457: }
1.1.1.2 misho 1458: zend_do_implement_interface(ce, iface TSRMLS_CC);
1.1 misho 1459:
1.1.1.2 misho 1460: CHECK_EXCEPTION();
1.1 misho 1461: ZEND_VM_NEXT_OPCODE();
1462: }
1463:
1464: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1465: {
1.1.1.2 misho 1466: USE_OPLINE
1.1 misho 1467:
1.1.1.2 misho 1468: SAVE_OPLINE();
1469: EG(exception) = NULL;
1.1 misho 1470: if (IS_TMP_VAR == IS_UNUSED) {
1.1.1.2 misho 1471: EX_T(opline->result.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1472: CHECK_EXCEPTION();
1.1 misho 1473: ZEND_VM_NEXT_OPCODE();
1474: } else {
1475: zend_free_op free_op2;
1.1.1.2 misho 1476: zval *class_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 1477:
1.1.1.2 misho 1478: if (IS_TMP_VAR == IS_CONST) {
1479: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1480: EX_T(opline->result.var).class_entry = CACHED_PTR(opline->op2.literal->cache_slot);
1481: } else {
1482: EX_T(opline->result.var).class_entry = zend_fetch_class_by_name(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1483: CACHE_PTR(opline->op2.literal->cache_slot, EX_T(opline->result.var).class_entry);
1484: }
1485: } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
1486: EX_T(opline->result.var).class_entry = Z_OBJCE_P(class_name);
1.1 misho 1487: } else if (Z_TYPE_P(class_name) == IS_STRING) {
1.1.1.2 misho 1488: EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
1.1 misho 1489: } else {
1490: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1491: }
1492:
1493: zval_dtor(free_op2.var);
1.1.1.2 misho 1494: CHECK_EXCEPTION();
1.1 misho 1495: ZEND_VM_NEXT_OPCODE();
1496: }
1497: }
1498:
1499: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1500: {
1.1.1.2 misho 1501: USE_OPLINE
1.1 misho 1502: zval *function_name;
1503: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1504:
1505: if (IS_TMP_VAR == IS_CONST) {
1.1.1.2 misho 1506: function_name = (zval*)(opline->op2.literal+1);
1507: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1508: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
1509: } else if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(function_name), Z_STRLEN_P(function_name)+1, Z_HASH_P(function_name), (void **) &EX(fbc)) == FAILURE)) {
1510: SAVE_OPLINE();
1511: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
1512: } else {
1513: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1514: }
1.1.1.2 misho 1515: EX(object) = NULL;
1516: /*CHECK_EXCEPTION();*/
1517: ZEND_VM_NEXT_OPCODE();
1.1 misho 1518: } else {
1.1.1.2 misho 1519: char *function_name_strval, *lcname;
1520: int function_name_strlen;
1521: zend_free_op free_op2;
1522:
1523: SAVE_OPLINE();
1524: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 1525:
1.1.1.2 misho 1526: if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1527: function_name_strval = Z_STRVAL_P(function_name);
1528: function_name_strlen = Z_STRLEN_P(function_name);
1529: if (function_name_strval[0] == '\\') {
1530: function_name_strlen -= 1;
1531: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
1532: } else {
1533: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
1534: }
1535: if (UNEXPECTED(zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE)) {
1536: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
1537: }
1538: efree(lcname);
1539: zval_dtor(free_op2.var);
1540: EX(object) = NULL;
1541: CHECK_EXCEPTION();
1542: ZEND_VM_NEXT_OPCODE();
1543: } else if (IS_TMP_VAR != IS_CONST && IS_TMP_VAR != IS_TMP_VAR &&
1544: EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
1.1 misho 1545: Z_OBJ_HANDLER_P(function_name, get_closure) &&
1546: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1547: if (EX(object)) {
1548: Z_ADDREF_P(EX(object));
1549: }
1550: if (IS_TMP_VAR == IS_VAR && 1 &&
1551: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
1552: /* Delay closure destruction until its invocation */
1553: EX(fbc)->common.prototype = (zend_function*)function_name;
1554: } else {
1555: zval_dtor(free_op2.var);
1556: }
1.1.1.2 misho 1557: CHECK_EXCEPTION();
1.1 misho 1558: ZEND_VM_NEXT_OPCODE();
1.1.1.2 misho 1559: } else if (IS_TMP_VAR != IS_CONST &&
1560: EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
1561: zend_hash_num_elements(Z_ARRVAL_P(function_name)) == 2) {
1562: zend_class_entry *ce;
1563: zval **method = NULL;
1564: zval **obj = NULL;
1.1 misho 1565:
1.1.1.2 misho 1566: zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
1567: zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
1.1 misho 1568:
1.1.1.3 misho 1569: if (!obj || !method) {
1570: zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
1571: }
1572:
1.1.1.2 misho 1573: if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
1574: zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
1575: }
1.1 misho 1576:
1.1.1.2 misho 1577: if (Z_TYPE_PP(method) != IS_STRING) {
1578: zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
1579: }
1.1 misho 1580:
1.1.1.2 misho 1581: if (Z_TYPE_PP(obj) == IS_STRING) {
1582: ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC);
1.1.1.4 misho 1583: if (UNEXPECTED(EG(exception) != NULL)) {
1584: HANDLE_EXCEPTION();
1585: }
1.1.1.2 misho 1586: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 1587: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj));
1.1.1.2 misho 1588: }
1589: EX(called_scope) = ce;
1590: EX(object) = NULL;
1.1 misho 1591:
1.1.1.2 misho 1592: if (ce->get_static_method) {
1593: EX(fbc) = ce->get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method) TSRMLS_CC);
1594: } else {
1595: EX(fbc) = zend_std_get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1596: }
1597: } else {
1598: EX(object) = *obj;
1599: ce = EX(called_scope) = Z_OBJCE_PP(obj);
1.1 misho 1600:
1.1.1.2 misho 1601: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1602: if (UNEXPECTED(EX(fbc) == NULL)) {
1603: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), Z_STRVAL_PP(method));
1604: }
1.1 misho 1605:
1.1.1.2 misho 1606: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
1607: EX(object) = NULL;
1608: } else {
1609: if (!PZVAL_IS_REF(EX(object))) {
1610: Z_ADDREF_P(EX(object)); /* For $this pointer */
1611: } else {
1612: zval *this_ptr;
1613: ALLOC_ZVAL(this_ptr);
1614: INIT_PZVAL_COPY(this_ptr, EX(object));
1615: zval_copy_ctor(this_ptr);
1616: EX(object) = this_ptr;
1617: }
1618: }
1619: }
1.1 misho 1620:
1.1.1.2 misho 1621: if (UNEXPECTED(EX(fbc) == NULL)) {
1622: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, Z_STRVAL_PP(method));
1623: }
1624: zval_dtor(free_op2.var);
1625: CHECK_EXCEPTION();
1626: ZEND_VM_NEXT_OPCODE();
1627: } else {
1628: zend_error_noreturn(E_ERROR, "Function name must be a string");
1629: }
1630: }
1.1 misho 1631: }
1632:
1.1.1.2 misho 1633:
1.1 misho 1634: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1635: {
1.1.1.2 misho 1636: USE_OPLINE
1.1 misho 1637:
1.1.1.2 misho 1638: SAVE_OPLINE();
1639: EG(exception) = NULL;
1.1 misho 1640: if (IS_VAR == IS_UNUSED) {
1.1.1.2 misho 1641: EX_T(opline->result.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1642: CHECK_EXCEPTION();
1.1 misho 1643: ZEND_VM_NEXT_OPCODE();
1644: } else {
1645: zend_free_op free_op2;
1.1.1.2 misho 1646: zval *class_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 1647:
1.1.1.2 misho 1648: if (IS_VAR == IS_CONST) {
1649: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1650: EX_T(opline->result.var).class_entry = CACHED_PTR(opline->op2.literal->cache_slot);
1651: } else {
1652: EX_T(opline->result.var).class_entry = zend_fetch_class_by_name(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1653: CACHE_PTR(opline->op2.literal->cache_slot, EX_T(opline->result.var).class_entry);
1654: }
1655: } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
1656: EX_T(opline->result.var).class_entry = Z_OBJCE_P(class_name);
1.1 misho 1657: } else if (Z_TYPE_P(class_name) == IS_STRING) {
1.1.1.2 misho 1658: EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
1.1 misho 1659: } else {
1660: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1661: }
1662:
1663: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 1664: CHECK_EXCEPTION();
1.1 misho 1665: ZEND_VM_NEXT_OPCODE();
1666: }
1667: }
1668:
1669: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1670: {
1.1.1.2 misho 1671: USE_OPLINE
1.1 misho 1672: zval *function_name;
1673: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1674:
1675: if (IS_VAR == IS_CONST) {
1.1.1.2 misho 1676: function_name = (zval*)(opline->op2.literal+1);
1677: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1678: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
1679: } else if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(function_name), Z_STRLEN_P(function_name)+1, Z_HASH_P(function_name), (void **) &EX(fbc)) == FAILURE)) {
1680: SAVE_OPLINE();
1681: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
1682: } else {
1683: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1684: }
1.1.1.2 misho 1685: EX(object) = NULL;
1686: /*CHECK_EXCEPTION();*/
1687: ZEND_VM_NEXT_OPCODE();
1.1 misho 1688: } else {
1.1.1.2 misho 1689: char *function_name_strval, *lcname;
1690: int function_name_strlen;
1691: zend_free_op free_op2;
1.1 misho 1692:
1.1.1.2 misho 1693: SAVE_OPLINE();
1694: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1695:
1696: if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1697: function_name_strval = Z_STRVAL_P(function_name);
1698: function_name_strlen = Z_STRLEN_P(function_name);
1699: if (function_name_strval[0] == '\\') {
1700: function_name_strlen -= 1;
1701: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
1702: } else {
1703: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
1704: }
1705: if (UNEXPECTED(zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE)) {
1706: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
1707: }
1708: efree(lcname);
1709: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1710: EX(object) = NULL;
1711: CHECK_EXCEPTION();
1712: ZEND_VM_NEXT_OPCODE();
1713: } else if (IS_VAR != IS_CONST && IS_VAR != IS_TMP_VAR &&
1714: EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
1.1 misho 1715: Z_OBJ_HANDLER_P(function_name, get_closure) &&
1716: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1717: if (EX(object)) {
1718: Z_ADDREF_P(EX(object));
1719: }
1720: if (IS_VAR == IS_VAR && (free_op2.var != NULL) &&
1721: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
1722: /* Delay closure destruction until its invocation */
1723: EX(fbc)->common.prototype = (zend_function*)function_name;
1724: } else {
1725: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1726: }
1.1.1.2 misho 1727: CHECK_EXCEPTION();
1.1 misho 1728: ZEND_VM_NEXT_OPCODE();
1.1.1.2 misho 1729: } else if (IS_VAR != IS_CONST &&
1730: EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
1731: zend_hash_num_elements(Z_ARRVAL_P(function_name)) == 2) {
1732: zend_class_entry *ce;
1733: zval **method = NULL;
1734: zval **obj = NULL;
1.1 misho 1735:
1.1.1.2 misho 1736: zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
1737: zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
1.1 misho 1738:
1.1.1.3 misho 1739: if (!obj || !method) {
1740: zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
1741: }
1742:
1.1.1.2 misho 1743: if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
1744: zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
1745: }
1.1 misho 1746:
1.1.1.2 misho 1747: if (Z_TYPE_PP(method) != IS_STRING) {
1748: zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
1749: }
1.1 misho 1750:
1.1.1.2 misho 1751: if (Z_TYPE_PP(obj) == IS_STRING) {
1752: ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC);
1.1.1.4 misho 1753: if (UNEXPECTED(EG(exception) != NULL)) {
1754: HANDLE_EXCEPTION();
1755: }
1.1.1.2 misho 1756: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 1757: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj));
1.1.1.2 misho 1758: }
1759: EX(called_scope) = ce;
1760: EX(object) = NULL;
1.1 misho 1761:
1.1.1.2 misho 1762: if (ce->get_static_method) {
1763: EX(fbc) = ce->get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method) TSRMLS_CC);
1764: } else {
1765: EX(fbc) = zend_std_get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1766: }
1767: } else {
1768: EX(object) = *obj;
1769: ce = EX(called_scope) = Z_OBJCE_PP(obj);
1.1 misho 1770:
1.1.1.2 misho 1771: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1772: if (UNEXPECTED(EX(fbc) == NULL)) {
1773: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), Z_STRVAL_PP(method));
1774: }
1.1 misho 1775:
1.1.1.2 misho 1776: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
1777: EX(object) = NULL;
1778: } else {
1779: if (!PZVAL_IS_REF(EX(object))) {
1780: Z_ADDREF_P(EX(object)); /* For $this pointer */
1781: } else {
1782: zval *this_ptr;
1783: ALLOC_ZVAL(this_ptr);
1784: INIT_PZVAL_COPY(this_ptr, EX(object));
1785: zval_copy_ctor(this_ptr);
1786: EX(object) = this_ptr;
1787: }
1788: }
1789: }
1.1 misho 1790:
1.1.1.2 misho 1791: if (UNEXPECTED(EX(fbc) == NULL)) {
1792: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, Z_STRVAL_PP(method));
1793: }
1794: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1795: CHECK_EXCEPTION();
1796: ZEND_VM_NEXT_OPCODE();
1797: } else {
1798: zend_error_noreturn(E_ERROR, "Function name must be a string");
1799: }
1800: }
1.1 misho 1801: }
1802:
1.1.1.2 misho 1803:
1.1 misho 1804: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1805: {
1.1.1.2 misho 1806: USE_OPLINE
1.1 misho 1807:
1.1.1.2 misho 1808: SAVE_OPLINE();
1809: EG(exception) = NULL;
1.1 misho 1810: if (IS_UNUSED == IS_UNUSED) {
1.1.1.2 misho 1811: EX_T(opline->result.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1812: CHECK_EXCEPTION();
1.1 misho 1813: ZEND_VM_NEXT_OPCODE();
1814: } else {
1815:
1816: zval *class_name = NULL;
1817:
1.1.1.2 misho 1818: if (IS_UNUSED == IS_CONST) {
1819: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1820: EX_T(opline->result.var).class_entry = CACHED_PTR(opline->op2.literal->cache_slot);
1821: } else {
1822: EX_T(opline->result.var).class_entry = zend_fetch_class_by_name(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1823: CACHE_PTR(opline->op2.literal->cache_slot, EX_T(opline->result.var).class_entry);
1824: }
1825: } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
1826: EX_T(opline->result.var).class_entry = Z_OBJCE_P(class_name);
1.1 misho 1827: } else if (Z_TYPE_P(class_name) == IS_STRING) {
1.1.1.2 misho 1828: EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
1.1 misho 1829: } else {
1830: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1831: }
1832:
1.1.1.2 misho 1833: CHECK_EXCEPTION();
1.1 misho 1834: ZEND_VM_NEXT_OPCODE();
1835: }
1836: }
1837:
1838: static int ZEND_FASTCALL ZEND_FETCH_CLASS_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1839: {
1.1.1.2 misho 1840: USE_OPLINE
1.1 misho 1841:
1.1.1.2 misho 1842: SAVE_OPLINE();
1843: EG(exception) = NULL;
1.1 misho 1844: if (IS_CV == IS_UNUSED) {
1.1.1.2 misho 1845: EX_T(opline->result.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);
1846: CHECK_EXCEPTION();
1.1 misho 1847: ZEND_VM_NEXT_OPCODE();
1848: } else {
1849:
1.1.1.2 misho 1850: zval *class_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 1851:
1.1.1.2 misho 1852: if (IS_CV == IS_CONST) {
1853: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1854: EX_T(opline->result.var).class_entry = CACHED_PTR(opline->op2.literal->cache_slot);
1855: } else {
1856: EX_T(opline->result.var).class_entry = zend_fetch_class_by_name(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->op2.literal + 1, opline->extended_value TSRMLS_CC);
1857: CACHE_PTR(opline->op2.literal->cache_slot, EX_T(opline->result.var).class_entry);
1858: }
1859: } else if (Z_TYPE_P(class_name) == IS_OBJECT) {
1860: EX_T(opline->result.var).class_entry = Z_OBJCE_P(class_name);
1.1 misho 1861: } else if (Z_TYPE_P(class_name) == IS_STRING) {
1.1.1.2 misho 1862: EX_T(opline->result.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), opline->extended_value TSRMLS_CC);
1.1 misho 1863: } else {
1864: zend_error_noreturn(E_ERROR, "Class name must be a valid object or a string");
1865: }
1866:
1.1.1.2 misho 1867: CHECK_EXCEPTION();
1.1 misho 1868: ZEND_VM_NEXT_OPCODE();
1869: }
1870: }
1871:
1872: static int ZEND_FASTCALL ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1873: {
1.1.1.2 misho 1874: USE_OPLINE
1.1 misho 1875: zval *function_name;
1876: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1877:
1878: if (IS_CV == IS_CONST) {
1.1.1.2 misho 1879: function_name = (zval*)(opline->op2.literal+1);
1880: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
1881: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
1882: } else if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(function_name), Z_STRLEN_P(function_name)+1, Z_HASH_P(function_name), (void **) &EX(fbc)) == FAILURE)) {
1883: SAVE_OPLINE();
1884: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", Z_STRVAL_P(opline->op2.zv));
1885: } else {
1886: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
1.1 misho 1887: }
1.1.1.2 misho 1888: EX(object) = NULL;
1889: /*CHECK_EXCEPTION();*/
1890: ZEND_VM_NEXT_OPCODE();
1.1 misho 1891: } else {
1.1.1.2 misho 1892: char *function_name_strval, *lcname;
1893: int function_name_strlen;
1894:
1895:
1896: SAVE_OPLINE();
1897: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1898:
1899: if (EXPECTED(Z_TYPE_P(function_name) == IS_STRING)) {
1900: function_name_strval = Z_STRVAL_P(function_name);
1901: function_name_strlen = Z_STRLEN_P(function_name);
1902: if (function_name_strval[0] == '\\') {
1903: function_name_strlen -= 1;
1904: lcname = zend_str_tolower_dup(function_name_strval + 1, function_name_strlen);
1905: } else {
1906: lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen);
1907: }
1908: if (UNEXPECTED(zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &EX(fbc)) == FAILURE)) {
1909: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", function_name_strval);
1910: }
1911: efree(lcname);
1.1 misho 1912:
1.1.1.2 misho 1913: EX(object) = NULL;
1914: CHECK_EXCEPTION();
1915: ZEND_VM_NEXT_OPCODE();
1916: } else if (IS_CV != IS_CONST && IS_CV != IS_TMP_VAR &&
1917: EXPECTED(Z_TYPE_P(function_name) == IS_OBJECT) &&
1.1 misho 1918: Z_OBJ_HANDLER_P(function_name, get_closure) &&
1919: Z_OBJ_HANDLER_P(function_name, get_closure)(function_name, &EX(called_scope), &EX(fbc), &EX(object) TSRMLS_CC) == SUCCESS) {
1920: if (EX(object)) {
1921: Z_ADDREF_P(EX(object));
1922: }
1923: if (IS_CV == IS_VAR && 0 &&
1924: EX(fbc)->common.fn_flags & ZEND_ACC_CLOSURE) {
1925: /* Delay closure destruction until its invocation */
1926: EX(fbc)->common.prototype = (zend_function*)function_name;
1927: } else {
1928:
1929: }
1.1.1.2 misho 1930: CHECK_EXCEPTION();
1.1 misho 1931: ZEND_VM_NEXT_OPCODE();
1.1.1.2 misho 1932: } else if (IS_CV != IS_CONST &&
1933: EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
1934: zend_hash_num_elements(Z_ARRVAL_P(function_name)) == 2) {
1935: zend_class_entry *ce;
1936: zval **method = NULL;
1937: zval **obj = NULL;
1.1 misho 1938:
1.1.1.2 misho 1939: zend_hash_index_find(Z_ARRVAL_P(function_name), 0, (void **) &obj);
1940: zend_hash_index_find(Z_ARRVAL_P(function_name), 1, (void **) &method);
1.1 misho 1941:
1.1.1.3 misho 1942: if (!obj || !method) {
1943: zend_error_noreturn(E_ERROR, "Array callback has to contain indices 0 and 1");
1944: }
1945:
1.1.1.2 misho 1946: if (Z_TYPE_PP(obj) != IS_STRING && Z_TYPE_PP(obj) != IS_OBJECT) {
1947: zend_error_noreturn(E_ERROR, "First array member is not a valid class name or object");
1948: }
1.1 misho 1949:
1.1.1.2 misho 1950: if (Z_TYPE_PP(method) != IS_STRING) {
1951: zend_error_noreturn(E_ERROR, "Second array member is not a valid method");
1952: }
1.1 misho 1953:
1.1.1.2 misho 1954: if (Z_TYPE_PP(obj) == IS_STRING) {
1955: ce = zend_fetch_class_by_name(Z_STRVAL_PP(obj), Z_STRLEN_PP(obj), NULL, 0 TSRMLS_CC);
1.1.1.4 misho 1956: if (UNEXPECTED(EG(exception) != NULL)) {
1957: HANDLE_EXCEPTION();
1958: }
1.1.1.2 misho 1959: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 1960: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_PP(obj));
1.1.1.2 misho 1961: }
1962: EX(called_scope) = ce;
1963: EX(object) = NULL;
1.1 misho 1964:
1.1.1.2 misho 1965: if (ce->get_static_method) {
1966: EX(fbc) = ce->get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method) TSRMLS_CC);
1967: } else {
1968: EX(fbc) = zend_std_get_static_method(ce, Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1969: }
1970: } else {
1971: EX(object) = *obj;
1972: ce = EX(called_scope) = Z_OBJCE_PP(obj);
1.1 misho 1973:
1.1.1.2 misho 1974: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), Z_STRVAL_PP(method), Z_STRLEN_PP(method), NULL TSRMLS_CC);
1975: if (UNEXPECTED(EX(fbc) == NULL)) {
1976: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), Z_STRVAL_PP(method));
1977: }
1.1 misho 1978:
1.1.1.2 misho 1979: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
1980: EX(object) = NULL;
1981: } else {
1982: if (!PZVAL_IS_REF(EX(object))) {
1983: Z_ADDREF_P(EX(object)); /* For $this pointer */
1984: } else {
1985: zval *this_ptr;
1986: ALLOC_ZVAL(this_ptr);
1987: INIT_PZVAL_COPY(this_ptr, EX(object));
1988: zval_copy_ctor(this_ptr);
1989: EX(object) = this_ptr;
1990: }
1991: }
1.1 misho 1992: }
1993:
1.1.1.2 misho 1994: if (UNEXPECTED(EX(fbc) == NULL)) {
1995: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, Z_STRVAL_PP(method));
1996: }
1997:
1998: CHECK_EXCEPTION();
1999: ZEND_VM_NEXT_OPCODE();
2000: } else {
2001: zend_error_noreturn(E_ERROR, "Function name must be a string");
1.1 misho 2002: }
2003: }
2004: }
2005:
2006:
2007: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2008: {
1.1.1.2 misho 2009: USE_OPLINE
1.1 misho 2010:
2011:
1.1.1.2 misho 2012: SAVE_OPLINE();
2013: bitwise_not_function(&EX_T(opline->result.var).tmp_var,
2014: opline->op1.zv TSRMLS_CC);
1.1 misho 2015:
1.1.1.2 misho 2016: CHECK_EXCEPTION();
1.1 misho 2017: ZEND_VM_NEXT_OPCODE();
2018: }
2019:
2020: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2021: {
1.1.1.2 misho 2022: USE_OPLINE
1.1 misho 2023:
2024:
1.1.1.2 misho 2025: SAVE_OPLINE();
2026: boolean_not_function(&EX_T(opline->result.var).tmp_var,
2027: opline->op1.zv TSRMLS_CC);
1.1 misho 2028:
1.1.1.2 misho 2029: CHECK_EXCEPTION();
1.1 misho 2030: ZEND_VM_NEXT_OPCODE();
2031: }
2032:
2033: static int ZEND_FASTCALL ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2034: {
1.1.1.2 misho 2035: USE_OPLINE
1.1 misho 2036:
1.1.1.2 misho 2037: zval *z;
2038:
2039: SAVE_OPLINE();
2040: z = opline->op1.zv;
1.1 misho 2041:
1.1.1.3 misho 2042: if (IS_CONST == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
2043: INIT_PZVAL(z);
1.1 misho 2044: }
1.1.1.3 misho 2045: zend_print_variable(z);
1.1 misho 2046:
1.1.1.2 misho 2047: CHECK_EXCEPTION();
1.1 misho 2048: ZEND_VM_NEXT_OPCODE();
2049: }
2050:
2051: static int ZEND_FASTCALL ZEND_PRINT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2052: {
1.1.1.2 misho 2053: USE_OPLINE
1.1 misho 2054:
1.1.1.2 misho 2055: ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
1.1 misho 2056: return ZEND_ECHO_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
2057: }
2058:
2059: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2060: {
1.1.1.2 misho 2061: USE_OPLINE
1.1 misho 2062:
1.1.1.2 misho 2063: zval *val;
1.1 misho 2064: int ret;
2065:
1.1.1.2 misho 2066: SAVE_OPLINE();
2067: val = opline->op1.zv;
2068:
2069: if (IS_CONST == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 2070: ret = Z_LVAL_P(val);
2071: } else {
2072: ret = i_zend_is_true(val);
2073:
2074: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 2075: HANDLE_EXCEPTION();
1.1 misho 2076: }
2077: }
2078: if (!ret) {
2079: #if DEBUG_ZEND>=2
1.1.1.2 misho 2080: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2081: #endif
1.1.1.2 misho 2082: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 2083: ZEND_VM_CONTINUE();
2084: }
2085:
2086: ZEND_VM_NEXT_OPCODE();
2087: }
2088:
2089: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2090: {
1.1.1.2 misho 2091: USE_OPLINE
1.1 misho 2092:
1.1.1.2 misho 2093: zval *val;
1.1 misho 2094: int ret;
2095:
1.1.1.2 misho 2096: SAVE_OPLINE();
2097: val = opline->op1.zv;
2098:
2099: if (IS_CONST == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 2100: ret = Z_LVAL_P(val);
2101: } else {
2102: ret = i_zend_is_true(val);
2103:
2104: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 2105: HANDLE_EXCEPTION();
1.1 misho 2106: }
2107: }
2108: if (ret) {
2109: #if DEBUG_ZEND>=2
1.1.1.2 misho 2110: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2111: #endif
1.1.1.2 misho 2112: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 2113: ZEND_VM_CONTINUE();
2114: }
2115:
2116: ZEND_VM_NEXT_OPCODE();
2117: }
2118:
2119: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2120: {
1.1.1.2 misho 2121: USE_OPLINE
1.1 misho 2122:
1.1.1.2 misho 2123: zval *val;
1.1 misho 2124: int retval;
2125:
1.1.1.2 misho 2126: SAVE_OPLINE();
2127: val = opline->op1.zv;
2128:
2129: if (IS_CONST == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 2130: retval = Z_LVAL_P(val);
2131: } else {
2132: retval = i_zend_is_true(val);
2133:
2134: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 2135: HANDLE_EXCEPTION();
1.1 misho 2136: }
2137: }
2138: if (EXPECTED(retval != 0)) {
2139: #if DEBUG_ZEND>=2
2140: printf("Conditional jmp on true to %d\n", opline->extended_value);
2141: #endif
2142: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
2143: ZEND_VM_CONTINUE(); /* CHECK_ME */
2144: } else {
2145: #if DEBUG_ZEND>=2
1.1.1.2 misho 2146: printf("Conditional jmp on false to %d\n", opline->op2.opline_num);
1.1 misho 2147: #endif
1.1.1.2 misho 2148: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.opline_num]);
1.1 misho 2149: ZEND_VM_CONTINUE(); /* CHECK_ME */
2150: }
2151: }
2152:
2153: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2154: {
1.1.1.2 misho 2155: USE_OPLINE
1.1 misho 2156:
1.1.1.2 misho 2157: zval *val;
1.1 misho 2158: int retval;
2159:
1.1.1.2 misho 2160: SAVE_OPLINE();
2161: val = opline->op1.zv;
2162:
2163: if (IS_CONST == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 2164: retval = Z_LVAL_P(val);
2165: } else {
2166: retval = i_zend_is_true(val);
2167:
2168: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 2169: HANDLE_EXCEPTION();
1.1 misho 2170: }
2171: }
1.1.1.2 misho 2172: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
2173: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 2174: if (!retval) {
2175: #if DEBUG_ZEND>=2
1.1.1.2 misho 2176: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2177: #endif
1.1.1.2 misho 2178: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 2179: ZEND_VM_CONTINUE();
2180: }
2181: ZEND_VM_NEXT_OPCODE();
2182: }
2183:
2184: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2185: {
1.1.1.2 misho 2186: USE_OPLINE
1.1 misho 2187:
1.1.1.2 misho 2188: zval *val;
1.1 misho 2189: int retval;
2190:
1.1.1.2 misho 2191: SAVE_OPLINE();
2192: val = opline->op1.zv;
2193:
2194: if (IS_CONST == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 2195: retval = Z_LVAL_P(val);
2196: } else {
2197: retval = i_zend_is_true(val);
2198:
2199: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 2200: HANDLE_EXCEPTION();
1.1 misho 2201: }
2202: }
1.1.1.2 misho 2203: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
2204: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 2205: if (retval) {
2206: #if DEBUG_ZEND>=2
1.1.1.2 misho 2207: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2208: #endif
1.1.1.2 misho 2209: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 2210: ZEND_VM_CONTINUE();
2211: }
2212: ZEND_VM_NEXT_OPCODE();
2213: }
2214:
2215: static int ZEND_FASTCALL ZEND_DO_FCALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2216: {
1.1.1.2 misho 2217: USE_OPLINE
1.1 misho 2218:
1.1.1.2 misho 2219: zval *fname = opline->op1.zv;
1.1 misho 2220:
2221: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
2222:
1.1.1.2 misho 2223: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
2224: EX(function_state).function = CACHED_PTR(opline->op1.literal->cache_slot);
2225: } else if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(fname), Z_STRLEN_P(fname)+1, Z_HASH_P(fname), (void **) &EX(function_state).function)==FAILURE)) {
2226: SAVE_OPLINE();
1.1 misho 2227: zend_error_noreturn(E_ERROR, "Call to undefined function %s()", fname->value.str.val);
1.1.1.2 misho 2228: } else {
2229: CACHE_PTR(opline->op1.literal->cache_slot, EX(function_state).function);
1.1 misho 2230: }
2231: EX(object) = NULL;
2232:
2233: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
2234: }
2235:
2236: static int ZEND_FASTCALL ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2237: {
1.1.1.2 misho 2238: USE_OPLINE
1.1 misho 2239: zval *retval_ptr;
2240:
2241:
1.1.1.2 misho 2242: SAVE_OPLINE();
2243: retval_ptr = opline->op1.zv;
2244:
2245: if (!EG(return_value_ptr_ptr)) {
2246: if (IS_CONST == IS_TMP_VAR) {
1.1 misho 2247:
2248: }
1.1.1.2 misho 2249: } else if (!0) { /* Not a temp var */
2250: if (IS_CONST == IS_CONST ||
2251: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
2252: zval *ret;
1.1 misho 2253:
1.1.1.2 misho 2254: ALLOC_ZVAL(ret);
2255: INIT_PZVAL_COPY(ret, retval_ptr);
2256: zval_copy_ctor(ret);
2257: *EG(return_value_ptr_ptr) = ret;
2258: } else if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
2259: retval_ptr == &EG(uninitialized_zval)) {
2260: zval *ret;
1.1 misho 2261:
1.1.1.2 misho 2262: ALLOC_INIT_ZVAL(ret);
2263: *EG(return_value_ptr_ptr) = ret;
2264: } else {
2265: *EG(return_value_ptr_ptr) = retval_ptr;
2266: Z_ADDREF_P(retval_ptr);
1.1 misho 2267: }
1.1.1.2 misho 2268: } else {
2269: zval *ret;
1.1 misho 2270:
1.1.1.2 misho 2271: ALLOC_ZVAL(ret);
2272: INIT_PZVAL_COPY(ret, retval_ptr);
2273: *EG(return_value_ptr_ptr) = ret;
2274: }
1.1 misho 2275:
1.1.1.2 misho 2276: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
2277: }
1.1 misho 2278:
1.1.1.2 misho 2279: static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2280: {
2281: USE_OPLINE
2282: zval *retval_ptr;
2283: zval **retval_ptr_ptr;
1.1 misho 2284:
2285:
1.1.1.2 misho 2286: SAVE_OPLINE();
1.1 misho 2287:
1.1.1.2 misho 2288: do {
2289: if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
2290: /* Not supposed to happen, but we'll allow it */
2291: zend_error(E_NOTICE, "Only variable references should be returned by reference");
2292:
2293: retval_ptr = opline->op1.zv;
2294: if (!EG(return_value_ptr_ptr)) {
2295: if (IS_CONST == IS_TMP_VAR) {
2296:
2297: }
2298: } else if (!0) { /* Not a temp var */
1.1 misho 2299: zval *ret;
2300:
2301: ALLOC_ZVAL(ret);
2302: INIT_PZVAL_COPY(ret, retval_ptr);
2303: zval_copy_ctor(ret);
2304: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 2305: } else {
1.1 misho 2306: zval *ret;
2307:
1.1.1.2 misho 2308: ALLOC_ZVAL(ret);
2309: INIT_PZVAL_COPY(ret, retval_ptr);
1.1 misho 2310: *EG(return_value_ptr_ptr) = ret;
2311: }
1.1.1.2 misho 2312: break;
2313: }
1.1 misho 2314:
1.1.1.2 misho 2315: retval_ptr_ptr = NULL;
2316:
2317: if (IS_CONST == IS_VAR && UNEXPECTED(retval_ptr_ptr == NULL)) {
2318: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
1.1 misho 2319: }
1.1.1.2 misho 2320:
2321: if (IS_CONST == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
2322: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
2323: EX_T(opline->op1.var).var.fcall_returned_reference) {
2324: } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
2325: zend_error(E_NOTICE, "Only variable references should be returned by reference");
2326: if (EG(return_value_ptr_ptr)) {
1.1.1.4 misho 2327: zval *ret;
2328:
2329: ALLOC_ZVAL(ret);
2330: INIT_PZVAL_COPY(ret, *retval_ptr_ptr);
2331: zval_copy_ctor(ret);
2332: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 2333: }
2334: break;
2335: }
2336: }
2337:
2338: if (EG(return_value_ptr_ptr)) {
2339: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
2340: Z_ADDREF_PP(retval_ptr_ptr);
2341:
2342: *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
2343: }
2344: } while (0);
1.1 misho 2345:
2346: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
2347: }
2348:
2349: static int ZEND_FASTCALL ZEND_THROW_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2350: {
1.1.1.2 misho 2351: USE_OPLINE
1.1 misho 2352: zval *value;
2353: zval *exception;
2354:
2355:
1.1.1.2 misho 2356: SAVE_OPLINE();
2357: value = opline->op1.zv;
1.1 misho 2358:
1.1.1.2 misho 2359: if (IS_CONST == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
1.1 misho 2360: zend_error_noreturn(E_ERROR, "Can only throw objects");
2361: }
2362: zend_exception_save(TSRMLS_C);
2363: /* Not sure if a complete copy is what we want here */
2364: ALLOC_ZVAL(exception);
2365: INIT_PZVAL_COPY(exception, value);
2366: if (!0) {
2367: zval_copy_ctor(exception);
2368: }
2369:
2370: zend_throw_exception_object(exception TSRMLS_CC);
2371: zend_exception_restore(TSRMLS_C);
2372:
1.1.1.2 misho 2373: HANDLE_EXCEPTION();
1.1 misho 2374: }
2375:
2376: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2377: {
1.1.1.2 misho 2378: USE_OPLINE
2379:
2380: SAVE_OPLINE();
1.1 misho 2381: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
1.1.1.2 misho 2382: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
2383: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.opline_num);
1.1 misho 2384: }
2385: {
2386: zval *valptr;
2387: zval *value;
2388:
2389:
1.1.1.2 misho 2390: value = opline->op1.zv;
1.1 misho 2391:
2392: ALLOC_ZVAL(valptr);
2393: INIT_PZVAL_COPY(valptr, value);
2394: if (!0) {
2395: zval_copy_ctor(valptr);
2396: }
2397: zend_vm_stack_push(valptr TSRMLS_CC);
2398:
2399: }
1.1.1.2 misho 2400: CHECK_EXCEPTION();
1.1 misho 2401: ZEND_VM_NEXT_OPCODE();
2402: }
2403:
2404: static int ZEND_FASTCALL ZEND_BOOL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2405: {
1.1.1.2 misho 2406: USE_OPLINE
1.1 misho 2407:
1.1.1.2 misho 2408: zval *retval = &EX_T(opline->result.var).tmp_var;
1.1 misho 2409:
1.1.1.2 misho 2410: SAVE_OPLINE();
1.1 misho 2411: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
1.1.1.2 misho 2412: ZVAL_BOOL(retval, i_zend_is_true(opline->op1.zv));
1.1 misho 2413:
1.1.1.2 misho 2414: CHECK_EXCEPTION();
1.1 misho 2415: ZEND_VM_NEXT_OPCODE();
2416: }
2417:
2418: static int ZEND_FASTCALL ZEND_CLONE_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2419: {
1.1.1.2 misho 2420: USE_OPLINE
1.1 misho 2421:
1.1.1.2 misho 2422: zval *obj;
1.1 misho 2423: zend_class_entry *ce;
2424: zend_function *clone;
2425: zend_object_clone_obj_t clone_call;
2426:
1.1.1.2 misho 2427: SAVE_OPLINE();
2428: obj = opline->op1.zv;
2429:
1.1 misho 2430: if (IS_CONST == IS_CONST ||
1.1.1.2 misho 2431: UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
1.1 misho 2432: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
2433: }
2434:
2435: ce = Z_OBJCE_P(obj);
2436: clone = ce ? ce->clone : NULL;
2437: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
1.1.1.2 misho 2438: if (UNEXPECTED(clone_call == NULL)) {
1.1 misho 2439: if (ce) {
2440: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
2441: } else {
2442: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
2443: }
2444: }
2445:
2446: if (ce && clone) {
2447: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
2448: /* Ensure that if we're calling a private function, we're allowed to do so.
2449: */
1.1.1.2 misho 2450: if (UNEXPECTED(ce != EG(scope))) {
1.1 misho 2451: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
2452: }
2453: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
2454: /* Ensure that if we're calling a protected function, we're allowed to do so.
2455: */
1.1.1.3 misho 2456: if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
1.1 misho 2457: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
2458: }
2459: }
2460: }
2461:
1.1.1.2 misho 2462: if (EXPECTED(EG(exception) == NULL)) {
2463: zval *retval;
2464:
2465: ALLOC_ZVAL(retval);
2466: Z_OBJVAL_P(retval) = clone_call(obj TSRMLS_CC);
2467: Z_TYPE_P(retval) = IS_OBJECT;
2468: Z_SET_REFCOUNT_P(retval, 1);
2469: Z_SET_ISREF_P(retval);
2470: if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
2471: zval_ptr_dtor(&retval);
2472: } else {
2473: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 2474: }
2475: }
2476:
1.1.1.2 misho 2477: CHECK_EXCEPTION();
1.1 misho 2478: ZEND_VM_NEXT_OPCODE();
2479: }
2480:
2481: static int ZEND_FASTCALL ZEND_CAST_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2482: {
1.1.1.2 misho 2483: USE_OPLINE
2484:
2485: zval *expr;
2486: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 2487:
1.1.1.2 misho 2488: SAVE_OPLINE();
2489: expr = opline->op1.zv;
1.1 misho 2490:
2491: if (opline->extended_value != IS_STRING) {
1.1.1.2 misho 2492: ZVAL_COPY_VALUE(result, expr);
1.1 misho 2493: if (!0) {
2494: zendi_zval_copy_ctor(*result);
2495: }
2496: }
2497: switch (opline->extended_value) {
2498: case IS_NULL:
2499: convert_to_null(result);
2500: break;
2501: case IS_BOOL:
2502: convert_to_boolean(result);
2503: break;
2504: case IS_LONG:
2505: convert_to_long(result);
2506: break;
2507: case IS_DOUBLE:
2508: convert_to_double(result);
2509: break;
2510: case IS_STRING: {
2511: zval var_copy;
2512: int use_copy;
2513:
2514: zend_make_printable_zval(expr, &var_copy, &use_copy);
2515: if (use_copy) {
1.1.1.2 misho 2516: ZVAL_COPY_VALUE(result, &var_copy);
1.1 misho 2517: if (0) {
2518:
2519: }
2520: } else {
1.1.1.2 misho 2521: ZVAL_COPY_VALUE(result, expr);
1.1 misho 2522: if (!0) {
2523: zendi_zval_copy_ctor(*result);
2524: }
2525: }
2526: break;
2527: }
2528: case IS_ARRAY:
2529: convert_to_array(result);
2530: break;
2531: case IS_OBJECT:
2532: convert_to_object(result);
2533: break;
2534: }
2535:
1.1.1.2 misho 2536: CHECK_EXCEPTION();
1.1 misho 2537: ZEND_VM_NEXT_OPCODE();
2538: }
2539:
2540: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2541: {
1.1.1.2 misho 2542: USE_OPLINE
1.1 misho 2543: zend_op_array *new_op_array=NULL;
2544:
1.1.1.2 misho 2545: zval *inc_filename;
2546: zval *tmp_inc_filename = NULL;
1.1 misho 2547: zend_bool failure_retval=0;
2548:
1.1.1.2 misho 2549: SAVE_OPLINE();
2550: inc_filename = opline->op1.zv;
2551:
1.1 misho 2552: if (inc_filename->type!=IS_STRING) {
1.1.1.2 misho 2553: MAKE_STD_ZVAL(tmp_inc_filename);
2554: ZVAL_COPY_VALUE(tmp_inc_filename, inc_filename);
2555: zval_copy_ctor(tmp_inc_filename);
2556: convert_to_string(tmp_inc_filename);
2557: inc_filename = tmp_inc_filename;
1.1 misho 2558: }
2559:
1.1.1.2 misho 2560: if (opline->extended_value != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
2561: if (opline->extended_value == ZEND_INCLUDE_ONCE || opline->extended_value == ZEND_INCLUDE) {
1.1 misho 2562: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
2563: } else {
2564: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
2565: }
2566: } else {
1.1.1.2 misho 2567: switch (opline->extended_value) {
1.1 misho 2568: case ZEND_INCLUDE_ONCE:
2569: case ZEND_REQUIRE_ONCE: {
2570: zend_file_handle file_handle;
2571: char *resolved_path;
2572:
2573: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
2574: if (resolved_path) {
2575: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
2576: } else {
2577: resolved_path = Z_STRVAL_P(inc_filename);
2578: }
2579:
2580: if (failure_retval) {
2581: /* do nothing, file already included */
2582: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
2583:
2584: if (!file_handle.opened_path) {
2585: file_handle.opened_path = estrdup(resolved_path);
2586: }
2587:
2588: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
1.1.1.2 misho 2589: new_op_array = zend_compile_file(&file_handle, (opline->extended_value==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
1.1 misho 2590: zend_destroy_file_handle(&file_handle TSRMLS_CC);
2591: } else {
2592: zend_file_handle_dtor(&file_handle TSRMLS_CC);
2593: failure_retval=1;
2594: }
2595: } else {
1.1.1.2 misho 2596: if (opline->extended_value == ZEND_INCLUDE_ONCE) {
1.1 misho 2597: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
2598: } else {
2599: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
2600: }
2601: }
2602: if (resolved_path != Z_STRVAL_P(inc_filename)) {
2603: efree(resolved_path);
2604: }
2605: }
2606: break;
2607: case ZEND_INCLUDE:
2608: case ZEND_REQUIRE:
1.1.1.2 misho 2609: new_op_array = compile_filename(opline->extended_value, inc_filename TSRMLS_CC);
1.1 misho 2610: break;
2611: case ZEND_EVAL: {
2612: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
2613:
2614: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
2615: efree(eval_desc);
2616: }
2617: break;
2618: EMPTY_SWITCH_DEFAULT_CASE()
2619: }
2620: }
1.1.1.2 misho 2621: if (tmp_inc_filename) {
2622: zval_ptr_dtor(&tmp_inc_filename);
1.1 misho 2623: }
2624:
1.1.1.2 misho 2625: if (UNEXPECTED(EG(exception) != NULL)) {
2626: HANDLE_EXCEPTION();
2627: } else if (EXPECTED(new_op_array != NULL)) {
1.1 misho 2628: EX(original_return_value) = EG(return_value_ptr_ptr);
2629: EG(active_op_array) = new_op_array;
1.1.1.2 misho 2630: if (RETURN_VALUE_USED(opline)) {
2631: EX_T(opline->result.var).var.ptr = NULL;
2632: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
2633: EG(return_value_ptr_ptr) = EX_T(opline->result.var).var.ptr_ptr;
2634: } else {
2635: EG(return_value_ptr_ptr) = NULL;
2636: }
1.1 misho 2637:
2638: EX(current_object) = EX(object);
2639:
2640: EX(function_state).function = (zend_function *) new_op_array;
2641: EX(object) = NULL;
2642:
2643: if (!EG(active_symbol_table)) {
2644: zend_rebuild_symbol_table(TSRMLS_C);
2645: }
2646:
1.1.1.2 misho 2647: if (EXPECTED(zend_execute == execute)) {
1.1 misho 2648: ZEND_VM_ENTER();
2649: } else {
2650: zend_execute(new_op_array TSRMLS_CC);
2651: }
2652:
2653: EX(function_state).function = (zend_function *) EX(op_array);
2654: EX(object) = EX(current_object);
2655:
2656: EG(opline_ptr) = &EX(opline);
2657: EG(active_op_array) = EX(op_array);
2658: EG(return_value_ptr_ptr) = EX(original_return_value);
2659: destroy_op_array(new_op_array TSRMLS_CC);
2660: efree(new_op_array);
1.1.1.2 misho 2661: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 2662: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 2663: HANDLE_EXCEPTION();
2664: } else if (RETURN_VALUE_USED(opline)) {
2665: if (!EX_T(opline->result.var).var.ptr) { /* there was no return statement */
2666: zval *retval;
2667:
2668: ALLOC_ZVAL(retval);
2669: ZVAL_BOOL(retval, 1);
2670: INIT_PZVAL(retval);
2671: EX_T(opline->result.var).var.ptr = retval;
2672: }
1.1 misho 2673: }
2674:
1.1.1.2 misho 2675: } else if (RETURN_VALUE_USED(opline)) {
2676: zval *retval;
1.1 misho 2677:
1.1.1.2 misho 2678: ALLOC_ZVAL(retval);
2679: ZVAL_BOOL(retval, failure_retval);
2680: INIT_PZVAL(retval);
2681: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 2682: }
2683: ZEND_VM_NEXT_OPCODE();
2684: }
2685:
2686: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2687: {
1.1.1.2 misho 2688: USE_OPLINE
1.1 misho 2689:
2690: zval *array_ptr, **array_ptr_ptr;
2691: HashTable *fe_ht;
2692: zend_object_iterator *iter = NULL;
2693: zend_class_entry *ce = NULL;
2694: zend_bool is_empty = 0;
2695:
1.1.1.2 misho 2696: SAVE_OPLINE();
2697:
2698: if ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
2699: (opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
1.1 misho 2700: array_ptr_ptr = NULL;
2701: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
1.1.1.2 misho 2702: MAKE_STD_ZVAL(array_ptr);
2703: ZVAL_NULL(array_ptr);
1.1 misho 2704: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
2705: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
2706: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
1.1.1.2 misho 2707: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 2708: }
2709:
2710: ce = Z_OBJCE_PP(array_ptr_ptr);
2711: if (!ce || ce->get_iterator == NULL) {
2712: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
2713: Z_ADDREF_PP(array_ptr_ptr);
2714: }
2715: array_ptr = *array_ptr_ptr;
2716: } else {
2717: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
2718: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
2719: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
2720: Z_SET_ISREF_PP(array_ptr_ptr);
2721: }
2722: }
2723: array_ptr = *array_ptr_ptr;
2724: Z_ADDREF_P(array_ptr);
2725: }
2726: } else {
1.1.1.2 misho 2727: array_ptr = opline->op1.zv;
1.1 misho 2728: if (0) { /* IS_TMP_VAR */
2729: zval *tmp;
2730:
2731: ALLOC_ZVAL(tmp);
2732: INIT_PZVAL_COPY(tmp, array_ptr);
2733: array_ptr = tmp;
2734: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
2735: ce = Z_OBJCE_P(array_ptr);
2736: if (ce && ce->get_iterator) {
2737: Z_DELREF_P(array_ptr);
2738: }
2739: }
2740: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
2741: ce = Z_OBJCE_P(array_ptr);
2742: if (!ce || !ce->get_iterator) {
2743: Z_ADDREF_P(array_ptr);
2744: }
2745: } else if (IS_CONST == IS_CONST ||
2746: ((IS_CONST == IS_CV || IS_CONST == IS_VAR) &&
2747: !Z_ISREF_P(array_ptr) &&
2748: Z_REFCOUNT_P(array_ptr) > 1)) {
2749: zval *tmp;
2750:
2751: ALLOC_ZVAL(tmp);
2752: INIT_PZVAL_COPY(tmp, array_ptr);
2753: zval_copy_ctor(tmp);
2754: array_ptr = tmp;
2755: } else {
2756: Z_ADDREF_P(array_ptr);
2757: }
2758: }
2759:
2760: if (ce && ce->get_iterator) {
2761: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
2762:
1.1.1.2 misho 2763: if (iter && EXPECTED(EG(exception) == NULL)) {
1.1 misho 2764: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
2765: } else {
2766:
2767: if (!EG(exception)) {
2768: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
2769: }
2770: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 2771: HANDLE_EXCEPTION();
1.1 misho 2772: }
2773: }
2774:
1.1.1.2 misho 2775: EX_T(opline->result.var).fe.ptr = array_ptr;
1.1 misho 2776:
2777: if (iter) {
2778: iter->index = 0;
2779: if (iter->funcs->rewind) {
2780: iter->funcs->rewind(iter TSRMLS_CC);
1.1.1.2 misho 2781: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 2782: zval_ptr_dtor(&array_ptr);
2783:
1.1.1.2 misho 2784: HANDLE_EXCEPTION();
1.1 misho 2785: }
2786: }
2787: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
1.1.1.2 misho 2788: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 2789: zval_ptr_dtor(&array_ptr);
2790:
1.1.1.2 misho 2791: HANDLE_EXCEPTION();
1.1 misho 2792: }
2793: iter->index = -1; /* will be set to 0 before using next handler */
2794: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
2795: zend_hash_internal_pointer_reset(fe_ht);
2796: if (ce) {
2797: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
2798: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
2799: char *str_key;
2800: uint str_key_len;
2801: ulong int_key;
2802: zend_uchar key_type;
2803:
2804: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
2805: if (key_type != HASH_KEY_NON_EXISTANT &&
2806: (key_type == HASH_KEY_IS_LONG ||
2807: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
2808: break;
2809: }
2810: zend_hash_move_forward(fe_ht);
2811: }
2812: }
2813: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
1.1.1.2 misho 2814: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.var).fe.fe_pos);
1.1 misho 2815: } else {
2816: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
2817: is_empty = 1;
2818: }
2819:
2820: if (is_empty) {
1.1.1.2 misho 2821: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 2822: } else {
1.1.1.2 misho 2823: CHECK_EXCEPTION();
1.1 misho 2824: ZEND_VM_NEXT_OPCODE();
2825: }
2826: }
2827:
1.1.1.2 misho 2828: static int ZEND_FASTCALL ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 2829: {
1.1.1.2 misho 2830: #if 0 || (IS_CONST != IS_UNUSED)
2831: USE_OPLINE
1.1 misho 2832:
1.1.1.2 misho 2833: SAVE_OPLINE();
2834: if (IS_CONST != IS_UNUSED) {
1.1 misho 2835:
1.1.1.2 misho 2836: zval *ptr = opline->op1.zv;
1.1 misho 2837:
1.1.1.2 misho 2838: if (Z_TYPE_P(ptr) == IS_LONG) {
2839: EG(exit_status) = Z_LVAL_P(ptr);
1.1 misho 2840: } else {
1.1.1.2 misho 2841: zend_print_variable(ptr);
1.1 misho 2842: }
2843:
2844: }
1.1.1.2 misho 2845: #endif
2846: zend_bailout();
2847: ZEND_VM_NEXT_OPCODE(); /* Never reached */
1.1 misho 2848: }
2849:
1.1.1.2 misho 2850: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 2851: {
1.1.1.2 misho 2852: USE_OPLINE
1.1 misho 2853:
1.1.1.2 misho 2854: zval *value;
1.1 misho 2855:
1.1.1.2 misho 2856: SAVE_OPLINE();
2857: value = opline->op1.zv;
2858:
2859: if (i_zend_is_true(value)) {
2860: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
2861: if (!0) {
2862: zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
1.1 misho 2863: }
2864:
1.1.1.2 misho 2865: #if DEBUG_ZEND>=2
2866: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2867: #endif
1.1.1.2 misho 2868: ZEND_VM_JMP(opline->op2.jmp_addr);
2869: }
2870:
2871: CHECK_EXCEPTION();
1.1 misho 2872: ZEND_VM_NEXT_OPCODE();
2873: }
2874:
1.1.1.2 misho 2875: static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 2876: {
1.1.1.2 misho 2877: USE_OPLINE
1.1 misho 2878:
1.1.1.2 misho 2879: zval *value, *ret;
2880:
2881: SAVE_OPLINE();
2882: value = opline->op1.zv;
1.1 misho 2883:
2884: if (i_zend_is_true(value)) {
1.1.1.2 misho 2885: if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
2886: Z_ADDREF_P(value);
2887: EX_T(opline->result.var).var.ptr = value;
2888: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
2889: } else {
2890: ALLOC_ZVAL(ret);
2891: INIT_PZVAL_COPY(ret, value);
2892: EX_T(opline->result.var).var.ptr = ret;
2893: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
2894: if (!0) {
2895: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
2896: }
2897: }
1.1 misho 2898:
2899: #if DEBUG_ZEND>=2
1.1.1.2 misho 2900: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 2901: #endif
1.1.1.2 misho 2902: ZEND_VM_JMP(opline->op2.jmp_addr);
1.1 misho 2903: }
2904:
1.1.1.2 misho 2905: CHECK_EXCEPTION();
1.1 misho 2906: ZEND_VM_NEXT_OPCODE();
2907: }
2908:
2909: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2910: {
1.1.1.2 misho 2911: USE_OPLINE
2912:
2913: zval *value;
1.1 misho 2914:
1.1.1.2 misho 2915: SAVE_OPLINE();
2916: value = opline->op1.zv;
1.1 misho 2917:
1.1.1.2 misho 2918: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
1.1 misho 2919: if (!0) {
1.1.1.2 misho 2920: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 2921: }
2922:
1.1.1.2 misho 2923: CHECK_EXCEPTION();
1.1 misho 2924: ZEND_VM_NEXT_OPCODE();
2925: }
2926:
1.1.1.2 misho 2927: static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 2928: {
1.1.1.2 misho 2929: USE_OPLINE
1.1 misho 2930:
1.1.1.2 misho 2931: zval *value, *ret;
2932:
2933: SAVE_OPLINE();
2934: value = opline->op1.zv;
2935:
2936: if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
2937: Z_ADDREF_P(value);
2938: EX_T(opline->result.var).var.ptr = value;
2939: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
2940: } else {
2941: ALLOC_ZVAL(ret);
2942: INIT_PZVAL_COPY(ret, value);
2943: EX_T(opline->result.var).var.ptr = ret;
2944: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
2945: if (!0) {
2946: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
1.1 misho 2947: }
2948: }
1.1.1.2 misho 2949:
2950: CHECK_EXCEPTION();
1.1 misho 2951: ZEND_VM_NEXT_OPCODE();
2952: }
2953:
2954: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2955: {
1.1.1.2 misho 2956: USE_OPLINE
1.1 misho 2957:
2958:
1.1.1.2 misho 2959: SAVE_OPLINE();
2960: fast_add_function(&EX_T(opline->result.var).tmp_var,
2961: opline->op1.zv,
2962: opline->op2.zv TSRMLS_CC);
1.1 misho 2963:
2964:
1.1.1.2 misho 2965: CHECK_EXCEPTION();
1.1 misho 2966: ZEND_VM_NEXT_OPCODE();
2967: }
2968:
2969: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2970: {
1.1.1.2 misho 2971: USE_OPLINE
1.1 misho 2972:
2973:
1.1.1.2 misho 2974: SAVE_OPLINE();
2975: fast_sub_function(&EX_T(opline->result.var).tmp_var,
2976: opline->op1.zv,
2977: opline->op2.zv TSRMLS_CC);
1.1 misho 2978:
2979:
1.1.1.2 misho 2980: CHECK_EXCEPTION();
1.1 misho 2981: ZEND_VM_NEXT_OPCODE();
2982: }
2983:
2984: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
2985: {
1.1.1.2 misho 2986: USE_OPLINE
1.1 misho 2987:
2988:
1.1.1.2 misho 2989: SAVE_OPLINE();
2990: fast_mul_function(&EX_T(opline->result.var).tmp_var,
2991: opline->op1.zv,
2992: opline->op2.zv TSRMLS_CC);
1.1 misho 2993:
2994:
1.1.1.2 misho 2995: CHECK_EXCEPTION();
1.1 misho 2996: ZEND_VM_NEXT_OPCODE();
2997: }
2998:
2999: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3000: {
1.1.1.2 misho 3001: USE_OPLINE
1.1 misho 3002:
3003:
1.1.1.2 misho 3004: SAVE_OPLINE();
3005: fast_div_function(&EX_T(opline->result.var).tmp_var,
3006: opline->op1.zv,
3007: opline->op2.zv TSRMLS_CC);
1.1 misho 3008:
3009:
1.1.1.2 misho 3010: CHECK_EXCEPTION();
1.1 misho 3011: ZEND_VM_NEXT_OPCODE();
3012: }
3013:
3014: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3015: {
1.1.1.2 misho 3016: USE_OPLINE
1.1 misho 3017:
3018:
1.1.1.2 misho 3019: SAVE_OPLINE();
3020: fast_mod_function(&EX_T(opline->result.var).tmp_var,
3021: opline->op1.zv,
3022: opline->op2.zv TSRMLS_CC);
1.1 misho 3023:
3024:
1.1.1.2 misho 3025: CHECK_EXCEPTION();
1.1 misho 3026: ZEND_VM_NEXT_OPCODE();
3027: }
3028:
3029: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3030: {
1.1.1.2 misho 3031: USE_OPLINE
1.1 misho 3032:
3033:
1.1.1.2 misho 3034: SAVE_OPLINE();
3035: shift_left_function(&EX_T(opline->result.var).tmp_var,
3036: opline->op1.zv,
3037: opline->op2.zv TSRMLS_CC);
1.1 misho 3038:
3039:
1.1.1.2 misho 3040: CHECK_EXCEPTION();
1.1 misho 3041: ZEND_VM_NEXT_OPCODE();
3042: }
3043:
3044: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3045: {
1.1.1.2 misho 3046: USE_OPLINE
1.1 misho 3047:
3048:
1.1.1.2 misho 3049: SAVE_OPLINE();
3050: shift_right_function(&EX_T(opline->result.var).tmp_var,
3051: opline->op1.zv,
3052: opline->op2.zv TSRMLS_CC);
1.1 misho 3053:
3054:
1.1.1.2 misho 3055: CHECK_EXCEPTION();
1.1 misho 3056: ZEND_VM_NEXT_OPCODE();
3057: }
3058:
3059: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3060: {
1.1.1.2 misho 3061: USE_OPLINE
1.1 misho 3062:
3063:
1.1.1.2 misho 3064: SAVE_OPLINE();
3065: concat_function(&EX_T(opline->result.var).tmp_var,
3066: opline->op1.zv,
3067: opline->op2.zv TSRMLS_CC);
1.1 misho 3068:
3069:
1.1.1.2 misho 3070: CHECK_EXCEPTION();
1.1 misho 3071: ZEND_VM_NEXT_OPCODE();
3072: }
3073:
3074: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3075: {
1.1.1.2 misho 3076: USE_OPLINE
1.1 misho 3077:
3078:
1.1.1.2 misho 3079: SAVE_OPLINE();
3080: is_identical_function(&EX_T(opline->result.var).tmp_var,
3081: opline->op1.zv,
3082: opline->op2.zv TSRMLS_CC);
1.1 misho 3083:
3084:
1.1.1.2 misho 3085: CHECK_EXCEPTION();
1.1 misho 3086: ZEND_VM_NEXT_OPCODE();
3087: }
3088:
3089: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3090: {
1.1.1.2 misho 3091: USE_OPLINE
1.1 misho 3092:
1.1.1.2 misho 3093: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 3094:
1.1.1.2 misho 3095: SAVE_OPLINE();
1.1 misho 3096: is_identical_function(result,
1.1.1.2 misho 3097: opline->op1.zv,
3098: opline->op2.zv TSRMLS_CC);
1.1 misho 3099: Z_LVAL_P(result) = !Z_LVAL_P(result);
3100:
3101:
1.1.1.2 misho 3102: CHECK_EXCEPTION();
1.1 misho 3103: ZEND_VM_NEXT_OPCODE();
3104: }
3105:
3106: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3107: {
1.1.1.2 misho 3108: USE_OPLINE
1.1 misho 3109:
1.1.1.2 misho 3110: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 3111:
1.1.1.2 misho 3112: SAVE_OPLINE();
3113: ZVAL_BOOL(result, fast_equal_function(result,
3114: opline->op1.zv,
3115: opline->op2.zv TSRMLS_CC));
1.1 misho 3116:
3117:
1.1.1.2 misho 3118: CHECK_EXCEPTION();
1.1 misho 3119: ZEND_VM_NEXT_OPCODE();
3120: }
3121:
3122: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3123: {
1.1.1.2 misho 3124: USE_OPLINE
1.1 misho 3125:
1.1.1.2 misho 3126: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 3127:
1.1.1.2 misho 3128: SAVE_OPLINE();
3129: ZVAL_BOOL(result, fast_not_equal_function(result,
3130: opline->op1.zv,
3131: opline->op2.zv TSRMLS_CC));
1.1 misho 3132:
3133:
1.1.1.2 misho 3134: CHECK_EXCEPTION();
1.1 misho 3135: ZEND_VM_NEXT_OPCODE();
3136: }
3137:
3138: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3139: {
1.1.1.2 misho 3140: USE_OPLINE
1.1 misho 3141:
1.1.1.2 misho 3142: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 3143:
1.1.1.2 misho 3144: SAVE_OPLINE();
3145: ZVAL_BOOL(result, fast_is_smaller_function(result,
3146: opline->op1.zv,
3147: opline->op2.zv TSRMLS_CC));
1.1 misho 3148:
3149:
1.1.1.2 misho 3150: CHECK_EXCEPTION();
1.1 misho 3151: ZEND_VM_NEXT_OPCODE();
3152: }
3153:
3154: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3155: {
1.1.1.2 misho 3156: USE_OPLINE
1.1 misho 3157:
1.1.1.2 misho 3158: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 3159:
1.1.1.2 misho 3160: SAVE_OPLINE();
3161: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
3162: opline->op1.zv,
3163: opline->op2.zv TSRMLS_CC));
1.1 misho 3164:
3165:
1.1.1.2 misho 3166: CHECK_EXCEPTION();
1.1 misho 3167: ZEND_VM_NEXT_OPCODE();
3168: }
3169:
3170: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3171: {
1.1.1.2 misho 3172: USE_OPLINE
1.1 misho 3173:
3174:
1.1.1.2 misho 3175: SAVE_OPLINE();
3176: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
3177: opline->op1.zv,
3178: opline->op2.zv TSRMLS_CC);
1.1 misho 3179:
3180:
1.1.1.2 misho 3181: CHECK_EXCEPTION();
1.1 misho 3182: ZEND_VM_NEXT_OPCODE();
3183: }
3184:
3185: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3186: {
1.1.1.2 misho 3187: USE_OPLINE
1.1 misho 3188:
3189:
1.1.1.2 misho 3190: SAVE_OPLINE();
3191: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
3192: opline->op1.zv,
3193: opline->op2.zv TSRMLS_CC);
1.1 misho 3194:
3195:
1.1.1.2 misho 3196: CHECK_EXCEPTION();
1.1 misho 3197: ZEND_VM_NEXT_OPCODE();
3198: }
3199:
3200: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3201: {
1.1.1.2 misho 3202: USE_OPLINE
1.1 misho 3203:
3204:
1.1.1.2 misho 3205: SAVE_OPLINE();
3206: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
3207: opline->op1.zv,
3208: opline->op2.zv TSRMLS_CC);
1.1 misho 3209:
3210:
1.1.1.2 misho 3211: CHECK_EXCEPTION();
1.1 misho 3212: ZEND_VM_NEXT_OPCODE();
3213: }
3214:
3215: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3216: {
1.1.1.2 misho 3217: USE_OPLINE
1.1 misho 3218:
3219:
1.1.1.2 misho 3220: SAVE_OPLINE();
3221: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
3222: opline->op1.zv,
3223: opline->op2.zv TSRMLS_CC);
1.1 misho 3224:
3225:
1.1.1.2 misho 3226: CHECK_EXCEPTION();
1.1 misho 3227: ZEND_VM_NEXT_OPCODE();
3228: }
3229:
1.1.1.2 misho 3230: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 3231: {
1.1.1.2 misho 3232: USE_OPLINE
3233: zend_free_op free_op1;
3234: zval *varname;
3235: zval **retval;
3236: zval tmp_varname;
3237: HashTable *target_symbol_table;
3238: ulong hash_value;
3239:
3240: SAVE_OPLINE();
3241: varname = opline->op1.zv;
3242:
3243: if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
3244: ZVAL_COPY_VALUE(&tmp_varname, varname);
3245: zval_copy_ctor(&tmp_varname);
3246: Z_SET_REFCOUNT(tmp_varname, 1);
3247: Z_UNSET_ISREF(tmp_varname);
3248: convert_to_string(&tmp_varname);
3249: varname = &tmp_varname;
3250: }
3251:
3252: if (IS_CONST != IS_UNUSED) {
3253: zend_class_entry *ce;
3254:
3255: if (IS_CONST == IS_CONST) {
3256: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
3257: ce = CACHED_PTR(opline->op2.literal->cache_slot);
3258: } else {
3259: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
3260: if (UNEXPECTED(ce == NULL)) {
3261: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
3262: zval_dtor(&tmp_varname);
3263: }
3264:
3265: CHECK_EXCEPTION();
3266: ZEND_VM_NEXT_OPCODE();
3267: }
3268: CACHE_PTR(opline->op2.literal->cache_slot, ce);
3269: }
3270: } else {
3271: ce = EX_T(opline->op2.var).class_entry;
3272: }
3273: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
3274:
3275: } else {
3276: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
3277: /*
3278: if (!target_symbol_table) {
3279: CHECK_EXCEPTION();
3280: ZEND_VM_NEXT_OPCODE();
3281: }
3282: */
3283: if (IS_CONST == IS_CONST) {
3284: hash_value = Z_HASH_P(varname);
3285: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
3286: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
3287: } else {
3288: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
3289: }
3290:
3291: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
3292: switch (type) {
3293: case BP_VAR_R:
3294: case BP_VAR_UNSET:
3295: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
3296: /* break missing intentionally */
3297: case BP_VAR_IS:
3298: retval = &EG(uninitialized_zval_ptr);
3299: break;
3300: case BP_VAR_RW:
3301: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
3302: /* break missing intentionally */
3303: case BP_VAR_W:
3304: Z_ADDREF_P(&EG(uninitialized_zval));
3305: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
3306: break;
3307: EMPTY_SWITCH_DEFAULT_CASE()
3308: }
3309: }
3310: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
3311: case ZEND_FETCH_GLOBAL:
3312: if (IS_CONST != IS_TMP_VAR) {
3313:
3314: }
3315: break;
3316: case ZEND_FETCH_LOCAL:
3317:
3318: break;
3319: case ZEND_FETCH_STATIC:
3320: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
3321: break;
3322: case ZEND_FETCH_GLOBAL_LOCK:
3323: if (IS_CONST == IS_VAR && !free_op1.var) {
3324: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
3325: }
3326: break;
3327: }
3328: }
1.1 misho 3329:
3330:
1.1.1.2 misho 3331: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
3332: zval_dtor(&tmp_varname);
3333: }
3334: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
3335: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
3336: }
3337: PZVAL_LOCK(*retval);
3338: switch (type) {
3339: case BP_VAR_R:
3340: case BP_VAR_IS:
3341: AI_SET_PTR(&EX_T(opline->result.var), *retval);
3342: break;
3343: case BP_VAR_UNSET: {
3344: zend_free_op free_res;
3345:
3346: PZVAL_UNLOCK(*retval, &free_res);
3347: if (retval != &EG(uninitialized_zval_ptr)) {
3348: SEPARATE_ZVAL_IF_NOT_REF(retval);
3349: }
3350: PZVAL_LOCK(*retval);
3351: FREE_OP_VAR_PTR(free_res);
1.1 misho 3352: }
1.1.1.2 misho 3353: /* break missing intentionally */
3354: default:
3355: EX_T(opline->result.var).var.ptr_ptr = retval;
3356: break;
3357: }
3358: CHECK_EXCEPTION();
3359: ZEND_VM_NEXT_OPCODE();
3360: }
3361:
3362: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3363: {
3364: return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3365: }
3366:
3367: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3368: {
3369: return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3370: }
3371:
3372: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3373: {
3374: return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3375: }
3376:
3377: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3378: {
3379: USE_OPLINE
3380:
3381: return zend_fetch_var_address_helper_SPEC_CONST_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3382: }
3383:
3384: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3385: {
3386: return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3387: }
3388:
3389: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3390: {
3391: return zend_fetch_var_address_helper_SPEC_CONST_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3392: }
3393:
3394: static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3395: {
3396: USE_OPLINE
3397:
3398: zval *container;
3399:
3400: SAVE_OPLINE();
3401: container = opline->op1.zv;
3402:
3403: if (UNEXPECTED(Z_TYPE_P(container) != IS_ARRAY)) {
3404: PZVAL_LOCK(&EG(uninitialized_zval));
3405: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 3406: } else {
3407:
1.1.1.2 misho 3408: zval *value = *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
1.1 misho 3409:
1.1.1.2 misho 3410: PZVAL_LOCK(value);
3411: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 3412:
3413: }
1.1.1.2 misho 3414: CHECK_EXCEPTION();
1.1 misho 3415: ZEND_VM_NEXT_OPCODE();
3416: }
3417:
3418: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3419: {
1.1.1.2 misho 3420: USE_OPLINE
1.1 misho 3421: zval *function_name;
3422: zend_class_entry *ce;
3423:
1.1.1.2 misho 3424: SAVE_OPLINE();
1.1 misho 3425: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
3426:
3427: if (IS_CONST == IS_CONST) {
3428: /* no function found. try a static method in class */
1.1.1.2 misho 3429: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
3430: ce = CACHED_PTR(opline->op1.literal->cache_slot);
3431: } else {
3432: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 3433: if (UNEXPECTED(EG(exception) != NULL)) {
3434: HANDLE_EXCEPTION();
3435: }
1.1.1.2 misho 3436: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 3437: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 3438: }
3439: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 3440: }
3441: EX(called_scope) = ce;
3442: } else {
1.1.1.2 misho 3443: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 3444:
1.1.1.2 misho 3445: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 3446: EX(called_scope) = EG(called_scope);
3447: } else {
3448: EX(called_scope) = ce;
3449: }
3450: }
1.1.1.2 misho 3451:
3452: if (IS_CONST == IS_CONST &&
3453: IS_CONST == IS_CONST &&
3454: CACHED_PTR(opline->op2.literal->cache_slot)) {
3455: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
3456: } else if (IS_CONST != IS_CONST &&
3457: IS_CONST == IS_CONST &&
3458: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
3459: /* do nothing */
3460: } else if (IS_CONST != IS_UNUSED) {
1.1 misho 3461: char *function_name_strval = NULL;
3462: int function_name_strlen = 0;
3463:
3464:
3465: if (IS_CONST == IS_CONST) {
1.1.1.2 misho 3466: function_name_strval = Z_STRVAL_P(opline->op2.zv);
3467: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 3468: } else {
1.1.1.2 misho 3469: function_name = opline->op2.zv;
1.1 misho 3470:
1.1.1.2 misho 3471: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 3472: zend_error_noreturn(E_ERROR, "Function name must be a string");
3473: } else {
3474: function_name_strval = Z_STRVAL_P(function_name);
3475: function_name_strlen = Z_STRLEN_P(function_name);
3476: }
3477: }
3478:
3479: if (function_name_strval) {
3480: if (ce->get_static_method) {
3481: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
3482: } else {
1.1.1.2 misho 3483: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 3484: }
1.1.1.2 misho 3485: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 3486: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
3487: }
1.1.1.2 misho 3488: if (IS_CONST == IS_CONST &&
3489: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
3490: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
3491: if (IS_CONST == IS_CONST) {
3492: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
3493: } else {
3494: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
3495: }
3496: }
1.1 misho 3497: }
3498: if (IS_CONST != IS_CONST) {
3499:
3500: }
3501: } else {
1.1.1.2 misho 3502: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 3503: zend_error_noreturn(E_ERROR, "Cannot call constructor");
3504: }
3505: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 3506: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 3507: }
3508: EX(fbc) = ce->constructor;
3509: }
3510:
3511: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
3512: EX(object) = NULL;
3513: } else {
3514: if (EG(This) &&
3515: Z_OBJ_HT_P(EG(This))->get_class_entry &&
3516: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
3517: /* We are calling method of the other (incompatible) class,
3518: but passing $this. This is done for compatibility with php-4. */
3519: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 3520: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 3521: } else {
3522: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 3523: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 3524: }
3525: }
3526: if ((EX(object) = EG(This))) {
3527: Z_ADDREF_P(EX(object));
3528: EX(called_scope) = Z_OBJCE_P(EX(object));
3529: }
3530: }
3531:
1.1.1.2 misho 3532: CHECK_EXCEPTION();
1.1 misho 3533: ZEND_VM_NEXT_OPCODE();
3534: }
3535:
3536: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3537: {
1.1.1.2 misho 3538: USE_OPLINE
1.1 misho 3539:
3540:
1.1.1.2 misho 3541: SAVE_OPLINE();
1.1 misho 3542: if (IS_CONST==IS_VAR) {
1.1.1.2 misho 3543: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 3544: }
1.1.1.2 misho 3545: is_equal_function(&EX_T(opline->result.var).tmp_var,
3546: opline->op1.zv,
3547: opline->op2.zv TSRMLS_CC);
1.1 misho 3548:
1.1.1.2 misho 3549: CHECK_EXCEPTION();
1.1 misho 3550: ZEND_VM_NEXT_OPCODE();
3551: }
3552:
3553: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3554: {
1.1.1.2 misho 3555: USE_OPLINE
1.1 misho 3556:
1.1.1.2 misho 3557: SAVE_OPLINE();
1.1 misho 3558: if (IS_CONST == IS_UNUSED) {
1.1.1.2 misho 3559: zend_constant *c;
3560: zval *retval;
3561:
3562: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
3563: c = CACHED_PTR(opline->op2.literal->cache_slot);
3564: } else if ((c = zend_quick_get_constant(opline->op2.literal + 1, opline->extended_value TSRMLS_CC)) == NULL) {
1.1 misho 3565: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
1.1.1.2 misho 3566: char *actual = (char *)zend_memrchr(Z_STRVAL_P(opline->op2.zv), '\\', Z_STRLEN_P(opline->op2.zv));
1.1 misho 3567: if(!actual) {
1.1.1.2 misho 3568: actual = Z_STRVAL_P(opline->op2.zv);
1.1 misho 3569: } else {
3570: actual++;
3571: }
3572: /* non-qualified constant - allow text substitution */
3573: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
1.1.1.2 misho 3574: ZVAL_STRINGL(&EX_T(opline->result.var).tmp_var, actual, Z_STRLEN_P(opline->op2.zv)-(actual - Z_STRVAL_P(opline->op2.zv)), 1);
3575: CHECK_EXCEPTION();
3576: ZEND_VM_NEXT_OPCODE();
1.1 misho 3577: } else {
1.1.1.2 misho 3578: zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 3579: }
1.1.1.2 misho 3580: } else {
3581: CACHE_PTR(opline->op2.literal->cache_slot, c);
1.1 misho 3582: }
1.1.1.2 misho 3583: retval = &EX_T(opline->result.var).tmp_var;
3584: ZVAL_COPY_VALUE(retval, &c->value);
3585: zval_copy_ctor(retval);
3586: CHECK_EXCEPTION();
1.1 misho 3587: ZEND_VM_NEXT_OPCODE();
3588: } else {
3589: /* class constant */
3590: zend_class_entry *ce;
3591: zval **value;
3592:
3593: if (IS_CONST == IS_CONST) {
1.1.1.2 misho 3594: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
3595: value = CACHED_PTR(opline->op2.literal->cache_slot);
3596: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
3597: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
3598: CHECK_EXCEPTION();
3599: ZEND_VM_NEXT_OPCODE();
3600: } else if (CACHED_PTR(opline->op1.literal->cache_slot)) {
3601: ce = CACHED_PTR(opline->op1.literal->cache_slot);
3602: } else {
3603: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 3604: if (UNEXPECTED(EG(exception) != NULL)) {
3605: HANDLE_EXCEPTION();
3606: }
1.1.1.2 misho 3607: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 3608: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 3609: }
3610: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 3611: }
3612: } else {
1.1.1.2 misho 3613: ce = EX_T(opline->op1.var).class_entry;
3614: if ((value = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce)) != NULL) {
3615: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
3616: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
3617: CHECK_EXCEPTION();
3618: ZEND_VM_NEXT_OPCODE();
3619: }
1.1 misho 3620: }
3621:
1.1.1.2 misho 3622: if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) {
1.1 misho 3623: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
3624: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
3625: zend_class_entry *old_scope = EG(scope);
3626:
3627: EG(scope) = ce;
3628: zval_update_constant(value, (void *) 1 TSRMLS_CC);
3629: EG(scope) = old_scope;
3630: }
1.1.1.2 misho 3631: if (IS_CONST == IS_CONST) {
3632: CACHE_PTR(opline->op2.literal->cache_slot, value);
3633: } else {
3634: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, value);
3635: }
3636: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
3637: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 3638: } else {
1.1.1.2 misho 3639: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 3640: }
3641:
1.1.1.2 misho 3642: CHECK_EXCEPTION();
1.1 misho 3643: ZEND_VM_NEXT_OPCODE();
3644: }
3645: }
3646:
3647: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3648: {
1.1.1.2 misho 3649: USE_OPLINE
1.1 misho 3650:
3651: zval *expr_ptr;
3652:
1.1.1.2 misho 3653: SAVE_OPLINE();
3654: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
3655: zval **expr_ptr_ptr = NULL;
1.1 misho 3656:
1.1.1.2 misho 3657: if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
3658: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
3659: }
3660: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 3661: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 3662: Z_ADDREF_P(expr_ptr);
1.1 misho 3663: } else {
1.1.1.2 misho 3664: expr_ptr=opline->op1.zv;
3665: if (0) { /* temporary variable */
3666: zval *new_expr;
1.1 misho 3667:
1.1.1.2 misho 3668: ALLOC_ZVAL(new_expr);
3669: INIT_PZVAL_COPY(new_expr, expr_ptr);
3670: expr_ptr = new_expr;
3671: } else if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 3672: zval *new_expr;
3673:
3674: ALLOC_ZVAL(new_expr);
3675: INIT_PZVAL_COPY(new_expr, expr_ptr);
3676: expr_ptr = new_expr;
3677: zendi_zval_copy_ctor(*expr_ptr);
3678: } else {
3679: Z_ADDREF_P(expr_ptr);
3680: }
3681: }
1.1.1.2 misho 3682:
3683: if (IS_CONST != IS_UNUSED) {
3684:
3685: zval *offset = opline->op2.zv;
3686: ulong hval;
3687:
1.1 misho 3688: switch (Z_TYPE_P(offset)) {
3689: case IS_DOUBLE:
1.1.1.2 misho 3690: hval = zend_dval_to_lval(Z_DVAL_P(offset));
3691: goto num_index;
1.1 misho 3692: case IS_LONG:
3693: case IS_BOOL:
1.1.1.2 misho 3694: hval = Z_LVAL_P(offset);
3695: num_index:
3696: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 3697: break;
3698: case IS_STRING:
1.1.1.2 misho 3699: if (IS_CONST == IS_CONST) {
3700: hval = Z_HASH_P(offset);
3701: } else {
3702: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
3703: if (IS_INTERNED(Z_STRVAL_P(offset))) {
3704: hval = INTERNED_HASH(Z_STRVAL_P(offset));
3705: } else {
3706: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
3707: }
3708: }
3709: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 3710: break;
3711: case IS_NULL:
1.1.1.2 misho 3712: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 3713: break;
3714: default:
3715: zend_error(E_WARNING, "Illegal offset type");
3716: zval_ptr_dtor(&expr_ptr);
3717: /* do nothing */
3718: break;
3719: }
3720:
3721: } else {
1.1.1.2 misho 3722: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 3723: }
1.1.1.2 misho 3724: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
1.1 misho 3725:
3726: } else {
3727:
3728: }
1.1.1.2 misho 3729: CHECK_EXCEPTION();
1.1 misho 3730: ZEND_VM_NEXT_OPCODE();
3731: }
3732:
3733: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3734: {
1.1.1.2 misho 3735: USE_OPLINE
1.1 misho 3736:
1.1.1.2 misho 3737: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 3738: if (IS_CONST == IS_UNUSED) {
3739: ZEND_VM_NEXT_OPCODE();
3740: #if 0 || IS_CONST != IS_UNUSED
3741: } else {
3742: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
3743: #endif
3744: }
3745: }
3746:
1.1.1.2 misho 3747: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3748: {
3749: USE_OPLINE
3750: zval tmp, *varname;
3751: HashTable *target_symbol_table;
3752:
3753:
3754: SAVE_OPLINE();
3755: if (IS_CONST == IS_CV &&
3756: IS_CONST == IS_UNUSED &&
3757: (opline->extended_value & ZEND_QUICK_SET)) {
3758: if (EG(active_symbol_table)) {
3759: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
3760:
3761: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
3762: EX_CV(opline->op1.var) = NULL;
3763: } else if (EX_CV(opline->op1.var)) {
3764: zval_ptr_dtor(EX_CV(opline->op1.var));
3765: EX_CV(opline->op1.var) = NULL;
3766: }
3767: CHECK_EXCEPTION();
3768: ZEND_VM_NEXT_OPCODE();
3769: }
3770:
3771: varname = opline->op1.zv;
3772:
3773: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
3774: ZVAL_COPY_VALUE(&tmp, varname);
3775: zval_copy_ctor(&tmp);
3776: convert_to_string(&tmp);
3777: varname = &tmp;
3778: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
3779: Z_ADDREF_P(varname);
3780: }
3781:
3782: if (IS_CONST != IS_UNUSED) {
3783: zend_class_entry *ce;
3784:
3785: if (IS_CONST == IS_CONST) {
3786: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
3787: ce = CACHED_PTR(opline->op2.literal->cache_slot);
3788: } else {
3789: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 3790: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 3791: if (IS_CONST != IS_CONST && varname == &tmp) {
3792: zval_dtor(&tmp);
3793: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
3794: zval_ptr_dtor(&varname);
3795: }
3796:
1.1.1.4 misho 3797: HANDLE_EXCEPTION();
3798: }
3799: if (UNEXPECTED(ce == NULL)) {
3800: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 3801: }
3802: CACHE_PTR(opline->op2.literal->cache_slot, ce);
3803: }
3804: } else {
3805: ce = EX_T(opline->op2.var).class_entry;
3806: }
3807: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
3808: } else {
3809: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
3810:
3811: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
3812: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
3813: }
3814:
3815: if (IS_CONST != IS_CONST && varname == &tmp) {
3816: zval_dtor(&tmp);
3817: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
3818: zval_ptr_dtor(&varname);
3819: }
3820:
3821: CHECK_EXCEPTION();
3822: ZEND_VM_NEXT_OPCODE();
3823: }
3824:
3825: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3826: {
3827: USE_OPLINE
3828: zval **value;
3829: zend_bool isset = 1;
3830:
3831: SAVE_OPLINE();
3832: if (IS_CONST == IS_CV &&
3833: IS_CONST == IS_UNUSED &&
3834: (opline->extended_value & ZEND_QUICK_SET)) {
3835: if (EX_CV(opline->op1.var)) {
3836: value = EX_CV(opline->op1.var);
3837: } else if (EG(active_symbol_table)) {
3838: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
3839:
3840: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
3841: isset = 0;
3842: }
3843: } else {
3844: isset = 0;
3845: }
3846: } else {
3847: HashTable *target_symbol_table;
3848:
3849: zval tmp, *varname = opline->op1.zv;
3850:
3851: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
3852: ZVAL_COPY_VALUE(&tmp, varname);
3853: zval_copy_ctor(&tmp);
3854: convert_to_string(&tmp);
3855: varname = &tmp;
3856: }
3857:
3858: if (IS_CONST != IS_UNUSED) {
3859: zend_class_entry *ce;
3860:
3861: if (IS_CONST == IS_CONST) {
3862: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
3863: ce = CACHED_PTR(opline->op2.literal->cache_slot);
3864: } else {
3865: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
3866: if (UNEXPECTED(ce == NULL)) {
3867: CHECK_EXCEPTION();
3868: ZEND_VM_NEXT_OPCODE();
3869: }
3870: CACHE_PTR(opline->op2.literal->cache_slot, ce);
3871: }
3872: } else {
3873: ce = EX_T(opline->op2.var).class_entry;
3874: }
3875: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
3876: if (!value) {
3877: isset = 0;
3878: }
3879: } else {
3880: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
3881: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
3882: isset = 0;
3883: }
3884: }
3885:
3886: if (IS_CONST != IS_CONST && varname == &tmp) {
3887: zval_dtor(&tmp);
3888: }
3889:
3890: }
3891:
3892: if (opline->extended_value & ZEND_ISSET) {
3893: if (isset && Z_TYPE_PP(value) != IS_NULL) {
3894: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
3895: } else {
3896: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
3897: }
3898: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
3899: if (!isset || !i_zend_is_true(*value)) {
3900: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
3901: } else {
3902: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
3903: }
3904: }
3905:
3906: CHECK_EXCEPTION();
3907: ZEND_VM_NEXT_OPCODE();
3908: }
3909:
1.1 misho 3910: static int ZEND_FASTCALL ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3911: {
1.1.1.2 misho 3912: USE_OPLINE
1.1 misho 3913:
1.1.1.2 misho 3914: zval *name;
3915: zval *val;
1.1 misho 3916: zend_constant c;
3917:
1.1.1.2 misho 3918: SAVE_OPLINE();
3919: name = opline->op1.zv;
3920: val = opline->op2.zv;
3921:
1.1 misho 3922: if ((Z_TYPE_P(val) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT || Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
1.1.1.2 misho 3923: zval tmp;
1.1 misho 3924: zval *tmp_ptr = &tmp;
3925:
1.1.1.2 misho 3926: ZVAL_COPY_VALUE(&tmp, val);
1.1 misho 3927: if (Z_TYPE_P(val) == IS_CONSTANT_ARRAY) {
3928: zval_copy_ctor(&tmp);
3929: }
3930: INIT_PZVAL(&tmp);
3931: zval_update_constant(&tmp_ptr, NULL TSRMLS_CC);
3932: c.value = *tmp_ptr;
3933: } else {
1.1.1.2 misho 3934: INIT_PZVAL_COPY(&c.value, val);
1.1 misho 3935: zval_copy_ctor(&c.value);
3936: }
3937: c.flags = CONST_CS; /* non persistent, case sensetive */
1.1.1.2 misho 3938: c.name = IS_INTERNED(Z_STRVAL_P(name)) ? Z_STRVAL_P(name) : zend_strndup(Z_STRVAL_P(name), Z_STRLEN_P(name));
1.1 misho 3939: c.name_len = Z_STRLEN_P(name)+1;
3940: c.module_number = PHP_USER_CONSTANT;
3941:
3942: if (zend_register_constant(&c TSRMLS_CC) == FAILURE) {
3943: }
3944:
3945:
1.1.1.2 misho 3946: CHECK_EXCEPTION();
1.1 misho 3947: ZEND_VM_NEXT_OPCODE();
3948: }
3949:
3950: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3951: {
1.1.1.2 misho 3952: USE_OPLINE
1.1 misho 3953: zend_free_op free_op2;
3954:
1.1.1.2 misho 3955: SAVE_OPLINE();
3956: fast_add_function(&EX_T(opline->result.var).tmp_var,
3957: opline->op1.zv,
3958: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 3959:
3960: zval_dtor(free_op2.var);
1.1.1.2 misho 3961: CHECK_EXCEPTION();
1.1 misho 3962: ZEND_VM_NEXT_OPCODE();
3963: }
3964:
3965: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3966: {
1.1.1.2 misho 3967: USE_OPLINE
1.1 misho 3968: zend_free_op free_op2;
3969:
1.1.1.2 misho 3970: SAVE_OPLINE();
3971: fast_sub_function(&EX_T(opline->result.var).tmp_var,
3972: opline->op1.zv,
3973: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 3974:
3975: zval_dtor(free_op2.var);
1.1.1.2 misho 3976: CHECK_EXCEPTION();
1.1 misho 3977: ZEND_VM_NEXT_OPCODE();
3978: }
3979:
3980: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3981: {
1.1.1.2 misho 3982: USE_OPLINE
1.1 misho 3983: zend_free_op free_op2;
3984:
1.1.1.2 misho 3985: SAVE_OPLINE();
3986: fast_mul_function(&EX_T(opline->result.var).tmp_var,
3987: opline->op1.zv,
3988: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 3989:
3990: zval_dtor(free_op2.var);
1.1.1.2 misho 3991: CHECK_EXCEPTION();
1.1 misho 3992: ZEND_VM_NEXT_OPCODE();
3993: }
3994:
3995: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
3996: {
1.1.1.2 misho 3997: USE_OPLINE
1.1 misho 3998: zend_free_op free_op2;
3999:
1.1.1.2 misho 4000: SAVE_OPLINE();
4001: fast_div_function(&EX_T(opline->result.var).tmp_var,
4002: opline->op1.zv,
4003: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4004:
4005: zval_dtor(free_op2.var);
1.1.1.2 misho 4006: CHECK_EXCEPTION();
1.1 misho 4007: ZEND_VM_NEXT_OPCODE();
4008: }
4009:
4010: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4011: {
1.1.1.2 misho 4012: USE_OPLINE
1.1 misho 4013: zend_free_op free_op2;
4014:
1.1.1.2 misho 4015: SAVE_OPLINE();
4016: fast_mod_function(&EX_T(opline->result.var).tmp_var,
4017: opline->op1.zv,
4018: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4019:
4020: zval_dtor(free_op2.var);
1.1.1.2 misho 4021: CHECK_EXCEPTION();
1.1 misho 4022: ZEND_VM_NEXT_OPCODE();
4023: }
4024:
4025: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4026: {
1.1.1.2 misho 4027: USE_OPLINE
1.1 misho 4028: zend_free_op free_op2;
4029:
1.1.1.2 misho 4030: SAVE_OPLINE();
4031: shift_left_function(&EX_T(opline->result.var).tmp_var,
4032: opline->op1.zv,
4033: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4034:
4035: zval_dtor(free_op2.var);
1.1.1.2 misho 4036: CHECK_EXCEPTION();
1.1 misho 4037: ZEND_VM_NEXT_OPCODE();
4038: }
4039:
4040: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4041: {
1.1.1.2 misho 4042: USE_OPLINE
1.1 misho 4043: zend_free_op free_op2;
4044:
1.1.1.2 misho 4045: SAVE_OPLINE();
4046: shift_right_function(&EX_T(opline->result.var).tmp_var,
4047: opline->op1.zv,
4048: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4049:
4050: zval_dtor(free_op2.var);
1.1.1.2 misho 4051: CHECK_EXCEPTION();
1.1 misho 4052: ZEND_VM_NEXT_OPCODE();
4053: }
4054:
4055: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4056: {
1.1.1.2 misho 4057: USE_OPLINE
1.1 misho 4058: zend_free_op free_op2;
4059:
1.1.1.2 misho 4060: SAVE_OPLINE();
4061: concat_function(&EX_T(opline->result.var).tmp_var,
4062: opline->op1.zv,
4063: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4064:
4065: zval_dtor(free_op2.var);
1.1.1.2 misho 4066: CHECK_EXCEPTION();
1.1 misho 4067: ZEND_VM_NEXT_OPCODE();
4068: }
4069:
4070: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4071: {
1.1.1.2 misho 4072: USE_OPLINE
1.1 misho 4073: zend_free_op free_op2;
4074:
1.1.1.2 misho 4075: SAVE_OPLINE();
4076: is_identical_function(&EX_T(opline->result.var).tmp_var,
4077: opline->op1.zv,
4078: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4079:
4080: zval_dtor(free_op2.var);
1.1.1.2 misho 4081: CHECK_EXCEPTION();
1.1 misho 4082: ZEND_VM_NEXT_OPCODE();
4083: }
4084:
4085: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4086: {
1.1.1.2 misho 4087: USE_OPLINE
1.1 misho 4088: zend_free_op free_op2;
1.1.1.2 misho 4089: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4090:
1.1.1.2 misho 4091: SAVE_OPLINE();
1.1 misho 4092: is_identical_function(result,
1.1.1.2 misho 4093: opline->op1.zv,
4094: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4095: Z_LVAL_P(result) = !Z_LVAL_P(result);
4096:
4097: zval_dtor(free_op2.var);
1.1.1.2 misho 4098: CHECK_EXCEPTION();
1.1 misho 4099: ZEND_VM_NEXT_OPCODE();
4100: }
4101:
4102: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4103: {
1.1.1.2 misho 4104: USE_OPLINE
1.1 misho 4105: zend_free_op free_op2;
1.1.1.2 misho 4106: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4107:
1.1.1.2 misho 4108: SAVE_OPLINE();
4109: ZVAL_BOOL(result, fast_equal_function(result,
4110: opline->op1.zv,
4111: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4112:
4113: zval_dtor(free_op2.var);
1.1.1.2 misho 4114: CHECK_EXCEPTION();
1.1 misho 4115: ZEND_VM_NEXT_OPCODE();
4116: }
4117:
4118: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4119: {
1.1.1.2 misho 4120: USE_OPLINE
1.1 misho 4121: zend_free_op free_op2;
1.1.1.2 misho 4122: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4123:
1.1.1.2 misho 4124: SAVE_OPLINE();
4125: ZVAL_BOOL(result, fast_not_equal_function(result,
4126: opline->op1.zv,
4127: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4128:
4129: zval_dtor(free_op2.var);
1.1.1.2 misho 4130: CHECK_EXCEPTION();
1.1 misho 4131: ZEND_VM_NEXT_OPCODE();
4132: }
4133:
4134: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4135: {
1.1.1.2 misho 4136: USE_OPLINE
1.1 misho 4137: zend_free_op free_op2;
1.1.1.2 misho 4138: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4139:
1.1.1.2 misho 4140: SAVE_OPLINE();
4141: ZVAL_BOOL(result, fast_is_smaller_function(result,
4142: opline->op1.zv,
4143: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4144:
4145: zval_dtor(free_op2.var);
1.1.1.2 misho 4146: CHECK_EXCEPTION();
1.1 misho 4147: ZEND_VM_NEXT_OPCODE();
4148: }
4149:
4150: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4151: {
1.1.1.2 misho 4152: USE_OPLINE
1.1 misho 4153: zend_free_op free_op2;
1.1.1.2 misho 4154: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4155:
1.1.1.2 misho 4156: SAVE_OPLINE();
4157: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
4158: opline->op1.zv,
4159: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4160:
4161: zval_dtor(free_op2.var);
1.1.1.2 misho 4162: CHECK_EXCEPTION();
1.1 misho 4163: ZEND_VM_NEXT_OPCODE();
4164: }
4165:
4166: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4167: {
1.1.1.2 misho 4168: USE_OPLINE
1.1 misho 4169: zend_free_op free_op2;
4170:
1.1.1.2 misho 4171: SAVE_OPLINE();
4172: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
4173: opline->op1.zv,
4174: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4175:
4176: zval_dtor(free_op2.var);
1.1.1.2 misho 4177: CHECK_EXCEPTION();
1.1 misho 4178: ZEND_VM_NEXT_OPCODE();
4179: }
4180:
4181: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4182: {
1.1.1.2 misho 4183: USE_OPLINE
1.1 misho 4184: zend_free_op free_op2;
4185:
1.1.1.2 misho 4186: SAVE_OPLINE();
4187: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
4188: opline->op1.zv,
4189: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4190:
4191: zval_dtor(free_op2.var);
1.1.1.2 misho 4192: CHECK_EXCEPTION();
1.1 misho 4193: ZEND_VM_NEXT_OPCODE();
4194: }
4195:
4196: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4197: {
1.1.1.2 misho 4198: USE_OPLINE
1.1 misho 4199: zend_free_op free_op2;
4200:
1.1.1.2 misho 4201: SAVE_OPLINE();
4202: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
4203: opline->op1.zv,
4204: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4205:
4206: zval_dtor(free_op2.var);
1.1.1.2 misho 4207: CHECK_EXCEPTION();
1.1 misho 4208: ZEND_VM_NEXT_OPCODE();
4209: }
4210:
4211: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4212: {
1.1.1.2 misho 4213: USE_OPLINE
1.1 misho 4214: zend_free_op free_op2;
4215:
1.1.1.2 misho 4216: SAVE_OPLINE();
4217: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
4218: opline->op1.zv,
4219: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4220:
4221: zval_dtor(free_op2.var);
1.1.1.2 misho 4222: CHECK_EXCEPTION();
1.1 misho 4223: ZEND_VM_NEXT_OPCODE();
4224: }
4225:
4226: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4227: {
1.1.1.2 misho 4228: USE_OPLINE
1.1 misho 4229: zval *function_name;
4230: zend_class_entry *ce;
4231:
1.1.1.2 misho 4232: SAVE_OPLINE();
1.1 misho 4233: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
4234:
4235: if (IS_CONST == IS_CONST) {
4236: /* no function found. try a static method in class */
1.1.1.2 misho 4237: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
4238: ce = CACHED_PTR(opline->op1.literal->cache_slot);
4239: } else {
4240: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 4241: if (UNEXPECTED(EG(exception) != NULL)) {
4242: HANDLE_EXCEPTION();
4243: }
1.1.1.2 misho 4244: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 4245: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 4246: }
4247: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 4248: }
4249: EX(called_scope) = ce;
4250: } else {
1.1.1.2 misho 4251: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 4252:
1.1.1.2 misho 4253: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 4254: EX(called_scope) = EG(called_scope);
4255: } else {
4256: EX(called_scope) = ce;
4257: }
4258: }
1.1.1.2 misho 4259:
4260: if (IS_CONST == IS_CONST &&
4261: IS_TMP_VAR == IS_CONST &&
4262: CACHED_PTR(opline->op2.literal->cache_slot)) {
4263: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
4264: } else if (IS_CONST != IS_CONST &&
4265: IS_TMP_VAR == IS_CONST &&
4266: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
4267: /* do nothing */
4268: } else if (IS_TMP_VAR != IS_UNUSED) {
1.1 misho 4269: char *function_name_strval = NULL;
4270: int function_name_strlen = 0;
4271: zend_free_op free_op2;
4272:
4273: if (IS_TMP_VAR == IS_CONST) {
1.1.1.2 misho 4274: function_name_strval = Z_STRVAL_P(opline->op2.zv);
4275: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 4276: } else {
1.1.1.2 misho 4277: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 4278:
1.1.1.2 misho 4279: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 4280: zend_error_noreturn(E_ERROR, "Function name must be a string");
4281: } else {
4282: function_name_strval = Z_STRVAL_P(function_name);
4283: function_name_strlen = Z_STRLEN_P(function_name);
4284: }
4285: }
4286:
4287: if (function_name_strval) {
4288: if (ce->get_static_method) {
4289: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
4290: } else {
1.1.1.2 misho 4291: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 4292: }
1.1.1.2 misho 4293: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 4294: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
4295: }
1.1.1.2 misho 4296: if (IS_TMP_VAR == IS_CONST &&
4297: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
4298: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
4299: if (IS_CONST == IS_CONST) {
4300: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
4301: } else {
4302: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
4303: }
4304: }
1.1 misho 4305: }
4306: if (IS_TMP_VAR != IS_CONST) {
4307: zval_dtor(free_op2.var);
4308: }
4309: } else {
1.1.1.2 misho 4310: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 4311: zend_error_noreturn(E_ERROR, "Cannot call constructor");
4312: }
4313: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 4314: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 4315: }
4316: EX(fbc) = ce->constructor;
4317: }
4318:
4319: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
4320: EX(object) = NULL;
4321: } else {
4322: if (EG(This) &&
4323: Z_OBJ_HT_P(EG(This))->get_class_entry &&
4324: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
4325: /* We are calling method of the other (incompatible) class,
4326: but passing $this. This is done for compatibility with php-4. */
4327: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 4328: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 4329: } else {
4330: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 4331: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 4332: }
4333: }
4334: if ((EX(object) = EG(This))) {
4335: Z_ADDREF_P(EX(object));
4336: EX(called_scope) = Z_OBJCE_P(EX(object));
4337: }
4338: }
4339:
1.1.1.2 misho 4340: CHECK_EXCEPTION();
1.1 misho 4341: ZEND_VM_NEXT_OPCODE();
4342: }
4343:
4344: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4345: {
1.1.1.2 misho 4346: USE_OPLINE
1.1 misho 4347: zend_free_op free_op2;
4348:
1.1.1.2 misho 4349: SAVE_OPLINE();
1.1 misho 4350: if (IS_CONST==IS_VAR) {
1.1.1.2 misho 4351: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 4352: }
1.1.1.2 misho 4353: is_equal_function(&EX_T(opline->result.var).tmp_var,
4354: opline->op1.zv,
4355: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4356:
4357: zval_dtor(free_op2.var);
1.1.1.2 misho 4358: CHECK_EXCEPTION();
1.1 misho 4359: ZEND_VM_NEXT_OPCODE();
4360: }
4361:
4362: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4363: {
1.1.1.2 misho 4364: USE_OPLINE
4365:
1.1 misho 4366: zval *expr_ptr;
4367:
1.1.1.2 misho 4368: SAVE_OPLINE();
4369: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
4370: zval **expr_ptr_ptr = NULL;
1.1 misho 4371:
1.1.1.2 misho 4372: if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
4373: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
4374: }
4375: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 4376: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 4377: Z_ADDREF_P(expr_ptr);
1.1 misho 4378: } else {
1.1.1.2 misho 4379: expr_ptr=opline->op1.zv;
4380: if (0) { /* temporary variable */
4381: zval *new_expr;
1.1 misho 4382:
1.1.1.2 misho 4383: ALLOC_ZVAL(new_expr);
4384: INIT_PZVAL_COPY(new_expr, expr_ptr);
4385: expr_ptr = new_expr;
4386: } else if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 4387: zval *new_expr;
4388:
4389: ALLOC_ZVAL(new_expr);
4390: INIT_PZVAL_COPY(new_expr, expr_ptr);
4391: expr_ptr = new_expr;
4392: zendi_zval_copy_ctor(*expr_ptr);
4393: } else {
4394: Z_ADDREF_P(expr_ptr);
4395: }
4396: }
1.1.1.2 misho 4397:
4398: if (IS_TMP_VAR != IS_UNUSED) {
4399: zend_free_op free_op2;
4400: zval *offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
4401: ulong hval;
4402:
1.1 misho 4403: switch (Z_TYPE_P(offset)) {
4404: case IS_DOUBLE:
1.1.1.2 misho 4405: hval = zend_dval_to_lval(Z_DVAL_P(offset));
4406: goto num_index;
1.1 misho 4407: case IS_LONG:
4408: case IS_BOOL:
1.1.1.2 misho 4409: hval = Z_LVAL_P(offset);
4410: num_index:
4411: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 4412: break;
4413: case IS_STRING:
1.1.1.2 misho 4414: if (IS_TMP_VAR == IS_CONST) {
4415: hval = Z_HASH_P(offset);
4416: } else {
4417: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
4418: if (IS_INTERNED(Z_STRVAL_P(offset))) {
4419: hval = INTERNED_HASH(Z_STRVAL_P(offset));
4420: } else {
4421: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
4422: }
4423: }
4424: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 4425: break;
4426: case IS_NULL:
1.1.1.2 misho 4427: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 4428: break;
4429: default:
4430: zend_error(E_WARNING, "Illegal offset type");
4431: zval_ptr_dtor(&expr_ptr);
4432: /* do nothing */
4433: break;
4434: }
4435: zval_dtor(free_op2.var);
4436: } else {
1.1.1.2 misho 4437: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 4438: }
1.1.1.2 misho 4439: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
1.1 misho 4440:
4441: } else {
4442:
4443: }
1.1.1.2 misho 4444: CHECK_EXCEPTION();
1.1 misho 4445: ZEND_VM_NEXT_OPCODE();
4446: }
4447:
4448: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4449: {
1.1.1.2 misho 4450: USE_OPLINE
1.1 misho 4451:
1.1.1.2 misho 4452: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 4453: if (IS_CONST == IS_UNUSED) {
4454: ZEND_VM_NEXT_OPCODE();
4455: #if 0 || IS_CONST != IS_UNUSED
4456: } else {
4457: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4458: #endif
4459: }
4460: }
4461:
4462: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4463: {
1.1.1.2 misho 4464: USE_OPLINE
1.1 misho 4465: zend_free_op free_op2;
4466:
1.1.1.2 misho 4467: SAVE_OPLINE();
4468: fast_add_function(&EX_T(opline->result.var).tmp_var,
4469: opline->op1.zv,
4470: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4471:
4472: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4473: CHECK_EXCEPTION();
1.1 misho 4474: ZEND_VM_NEXT_OPCODE();
4475: }
4476:
4477: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4478: {
1.1.1.2 misho 4479: USE_OPLINE
1.1 misho 4480: zend_free_op free_op2;
4481:
1.1.1.2 misho 4482: SAVE_OPLINE();
4483: fast_sub_function(&EX_T(opline->result.var).tmp_var,
4484: opline->op1.zv,
4485: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4486:
4487: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4488: CHECK_EXCEPTION();
1.1 misho 4489: ZEND_VM_NEXT_OPCODE();
4490: }
4491:
4492: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4493: {
1.1.1.2 misho 4494: USE_OPLINE
1.1 misho 4495: zend_free_op free_op2;
4496:
1.1.1.2 misho 4497: SAVE_OPLINE();
4498: fast_mul_function(&EX_T(opline->result.var).tmp_var,
4499: opline->op1.zv,
4500: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4501:
4502: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4503: CHECK_EXCEPTION();
1.1 misho 4504: ZEND_VM_NEXT_OPCODE();
4505: }
4506:
4507: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4508: {
1.1.1.2 misho 4509: USE_OPLINE
1.1 misho 4510: zend_free_op free_op2;
4511:
1.1.1.2 misho 4512: SAVE_OPLINE();
4513: fast_div_function(&EX_T(opline->result.var).tmp_var,
4514: opline->op1.zv,
4515: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4516:
4517: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4518: CHECK_EXCEPTION();
1.1 misho 4519: ZEND_VM_NEXT_OPCODE();
4520: }
4521:
4522: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4523: {
1.1.1.2 misho 4524: USE_OPLINE
1.1 misho 4525: zend_free_op free_op2;
4526:
1.1.1.2 misho 4527: SAVE_OPLINE();
4528: fast_mod_function(&EX_T(opline->result.var).tmp_var,
4529: opline->op1.zv,
4530: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4531:
4532: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4533: CHECK_EXCEPTION();
1.1 misho 4534: ZEND_VM_NEXT_OPCODE();
4535: }
4536:
4537: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4538: {
1.1.1.2 misho 4539: USE_OPLINE
1.1 misho 4540: zend_free_op free_op2;
4541:
1.1.1.2 misho 4542: SAVE_OPLINE();
4543: shift_left_function(&EX_T(opline->result.var).tmp_var,
4544: opline->op1.zv,
4545: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4546:
4547: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4548: CHECK_EXCEPTION();
1.1 misho 4549: ZEND_VM_NEXT_OPCODE();
4550: }
4551:
4552: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4553: {
1.1.1.2 misho 4554: USE_OPLINE
1.1 misho 4555: zend_free_op free_op2;
4556:
1.1.1.2 misho 4557: SAVE_OPLINE();
4558: shift_right_function(&EX_T(opline->result.var).tmp_var,
4559: opline->op1.zv,
4560: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4561:
4562: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4563: CHECK_EXCEPTION();
1.1 misho 4564: ZEND_VM_NEXT_OPCODE();
4565: }
4566:
4567: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4568: {
1.1.1.2 misho 4569: USE_OPLINE
1.1 misho 4570: zend_free_op free_op2;
4571:
1.1.1.2 misho 4572: SAVE_OPLINE();
4573: concat_function(&EX_T(opline->result.var).tmp_var,
4574: opline->op1.zv,
4575: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4576:
4577: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4578: CHECK_EXCEPTION();
1.1 misho 4579: ZEND_VM_NEXT_OPCODE();
4580: }
4581:
4582: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4583: {
1.1.1.2 misho 4584: USE_OPLINE
1.1 misho 4585: zend_free_op free_op2;
4586:
1.1.1.2 misho 4587: SAVE_OPLINE();
4588: is_identical_function(&EX_T(opline->result.var).tmp_var,
4589: opline->op1.zv,
4590: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4591:
4592: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4593: CHECK_EXCEPTION();
1.1 misho 4594: ZEND_VM_NEXT_OPCODE();
4595: }
4596:
4597: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4598: {
1.1.1.2 misho 4599: USE_OPLINE
1.1 misho 4600: zend_free_op free_op2;
1.1.1.2 misho 4601: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4602:
1.1.1.2 misho 4603: SAVE_OPLINE();
1.1 misho 4604: is_identical_function(result,
1.1.1.2 misho 4605: opline->op1.zv,
4606: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4607: Z_LVAL_P(result) = !Z_LVAL_P(result);
4608:
4609: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4610: CHECK_EXCEPTION();
1.1 misho 4611: ZEND_VM_NEXT_OPCODE();
4612: }
4613:
4614: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4615: {
1.1.1.2 misho 4616: USE_OPLINE
1.1 misho 4617: zend_free_op free_op2;
1.1.1.2 misho 4618: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4619:
1.1.1.2 misho 4620: SAVE_OPLINE();
4621: ZVAL_BOOL(result, fast_equal_function(result,
4622: opline->op1.zv,
4623: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4624:
4625: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4626: CHECK_EXCEPTION();
1.1 misho 4627: ZEND_VM_NEXT_OPCODE();
4628: }
4629:
4630: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4631: {
1.1.1.2 misho 4632: USE_OPLINE
1.1 misho 4633: zend_free_op free_op2;
1.1.1.2 misho 4634: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4635:
1.1.1.2 misho 4636: SAVE_OPLINE();
4637: ZVAL_BOOL(result, fast_not_equal_function(result,
4638: opline->op1.zv,
4639: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4640:
4641: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4642: CHECK_EXCEPTION();
1.1 misho 4643: ZEND_VM_NEXT_OPCODE();
4644: }
4645:
4646: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4647: {
1.1.1.2 misho 4648: USE_OPLINE
1.1 misho 4649: zend_free_op free_op2;
1.1.1.2 misho 4650: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4651:
1.1.1.2 misho 4652: SAVE_OPLINE();
4653: ZVAL_BOOL(result, fast_is_smaller_function(result,
4654: opline->op1.zv,
4655: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4656:
4657: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4658: CHECK_EXCEPTION();
1.1 misho 4659: ZEND_VM_NEXT_OPCODE();
4660: }
4661:
4662: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4663: {
1.1.1.2 misho 4664: USE_OPLINE
1.1 misho 4665: zend_free_op free_op2;
1.1.1.2 misho 4666: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 4667:
1.1.1.2 misho 4668: SAVE_OPLINE();
4669: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
4670: opline->op1.zv,
4671: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 4672:
4673: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4674: CHECK_EXCEPTION();
1.1 misho 4675: ZEND_VM_NEXT_OPCODE();
4676: }
4677:
4678: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4679: {
1.1.1.2 misho 4680: USE_OPLINE
1.1 misho 4681: zend_free_op free_op2;
4682:
1.1.1.2 misho 4683: SAVE_OPLINE();
4684: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
4685: opline->op1.zv,
4686: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4687:
4688: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4689: CHECK_EXCEPTION();
1.1 misho 4690: ZEND_VM_NEXT_OPCODE();
4691: }
4692:
4693: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4694: {
1.1.1.2 misho 4695: USE_OPLINE
1.1 misho 4696: zend_free_op free_op2;
4697:
1.1.1.2 misho 4698: SAVE_OPLINE();
4699: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
4700: opline->op1.zv,
4701: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4702:
4703: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4704: CHECK_EXCEPTION();
1.1 misho 4705: ZEND_VM_NEXT_OPCODE();
4706: }
4707:
4708: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4709: {
1.1.1.2 misho 4710: USE_OPLINE
1.1 misho 4711: zend_free_op free_op2;
4712:
1.1.1.2 misho 4713: SAVE_OPLINE();
4714: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
4715: opline->op1.zv,
4716: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4717:
4718: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4719: CHECK_EXCEPTION();
1.1 misho 4720: ZEND_VM_NEXT_OPCODE();
4721: }
4722:
4723: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4724: {
1.1.1.2 misho 4725: USE_OPLINE
1.1 misho 4726: zend_free_op free_op2;
4727:
1.1.1.2 misho 4728: SAVE_OPLINE();
4729: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
4730: opline->op1.zv,
4731: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 4732:
4733: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 4734: CHECK_EXCEPTION();
1.1 misho 4735: ZEND_VM_NEXT_OPCODE();
4736: }
4737:
1.1.1.2 misho 4738: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 4739: {
1.1.1.2 misho 4740: USE_OPLINE
4741: zend_free_op free_op1;
4742: zval *varname;
4743: zval **retval;
4744: zval tmp_varname;
4745: HashTable *target_symbol_table;
4746: ulong hash_value;
1.1 misho 4747:
1.1.1.2 misho 4748: SAVE_OPLINE();
4749: varname = opline->op1.zv;
1.1 misho 4750:
1.1.1.2 misho 4751: if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
4752: ZVAL_COPY_VALUE(&tmp_varname, varname);
4753: zval_copy_ctor(&tmp_varname);
4754: Z_SET_REFCOUNT(tmp_varname, 1);
4755: Z_UNSET_ISREF(tmp_varname);
4756: convert_to_string(&tmp_varname);
4757: varname = &tmp_varname;
1.1 misho 4758: }
4759:
1.1.1.2 misho 4760: if (IS_VAR != IS_UNUSED) {
4761: zend_class_entry *ce;
1.1 misho 4762:
1.1.1.2 misho 4763: if (IS_VAR == IS_CONST) {
4764: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
4765: ce = CACHED_PTR(opline->op2.literal->cache_slot);
1.1 misho 4766: } else {
1.1.1.2 misho 4767: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
4768: if (UNEXPECTED(ce == NULL)) {
4769: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
4770: zval_dtor(&tmp_varname);
4771: }
1.1 misho 4772:
1.1.1.2 misho 4773: CHECK_EXCEPTION();
4774: ZEND_VM_NEXT_OPCODE();
4775: }
4776: CACHE_PTR(opline->op2.literal->cache_slot, ce);
1.1 misho 4777: }
1.1.1.2 misho 4778: } else {
4779: ce = EX_T(opline->op2.var).class_entry;
1.1 misho 4780: }
1.1.1.2 misho 4781: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
1.1 misho 4782:
4783: } else {
1.1.1.2 misho 4784: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
4785: /*
4786: if (!target_symbol_table) {
4787: CHECK_EXCEPTION();
4788: ZEND_VM_NEXT_OPCODE();
1.1 misho 4789: }
1.1.1.2 misho 4790: */
4791: if (IS_CONST == IS_CONST) {
4792: hash_value = Z_HASH_P(varname);
4793: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
4794: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
4795: } else {
4796: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
1.1 misho 4797: }
4798:
1.1.1.2 misho 4799: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
4800: switch (type) {
4801: case BP_VAR_R:
4802: case BP_VAR_UNSET:
4803: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
4804: /* break missing intentionally */
4805: case BP_VAR_IS:
4806: retval = &EG(uninitialized_zval_ptr);
4807: break;
4808: case BP_VAR_RW:
4809: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
4810: /* break missing intentionally */
4811: case BP_VAR_W:
4812: Z_ADDREF_P(&EG(uninitialized_zval));
4813: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
4814: break;
4815: EMPTY_SWITCH_DEFAULT_CASE()
1.1 misho 4816: }
4817: }
1.1.1.2 misho 4818: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
4819: case ZEND_FETCH_GLOBAL:
4820: if (IS_CONST != IS_TMP_VAR) {
1.1 misho 4821:
1.1.1.2 misho 4822: }
4823: break;
4824: case ZEND_FETCH_LOCAL:
1.1 misho 4825:
1.1.1.2 misho 4826: break;
4827: case ZEND_FETCH_STATIC:
4828: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
4829: break;
4830: case ZEND_FETCH_GLOBAL_LOCK:
4831: if (IS_CONST == IS_VAR && !free_op1.var) {
4832: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
4833: }
4834: break;
1.1 misho 4835: }
4836: }
4837:
4838:
1.1.1.2 misho 4839: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
4840: zval_dtor(&tmp_varname);
4841: }
4842: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
4843: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
4844: }
4845: PZVAL_LOCK(*retval);
4846: switch (type) {
4847: case BP_VAR_R:
4848: case BP_VAR_IS:
4849: AI_SET_PTR(&EX_T(opline->result.var), *retval);
4850: break;
4851: case BP_VAR_UNSET: {
4852: zend_free_op free_res;
4853:
4854: PZVAL_UNLOCK(*retval, &free_res);
4855: if (retval != &EG(uninitialized_zval_ptr)) {
4856: SEPARATE_ZVAL_IF_NOT_REF(retval);
4857: }
4858: PZVAL_LOCK(*retval);
4859: FREE_OP_VAR_PTR(free_res);
4860: }
4861: /* break missing intentionally */
4862: default:
4863: EX_T(opline->result.var).var.ptr_ptr = retval;
4864: break;
1.1 misho 4865: }
1.1.1.2 misho 4866: CHECK_EXCEPTION();
1.1 misho 4867: ZEND_VM_NEXT_OPCODE();
4868: }
4869:
1.1.1.2 misho 4870: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 4871: {
1.1.1.2 misho 4872: return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4873: }
1.1 misho 4874:
1.1.1.2 misho 4875: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4876: {
4877: return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4878: }
1.1 misho 4879:
1.1.1.2 misho 4880: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4881: {
4882: return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4883: }
1.1 misho 4884:
1.1.1.2 misho 4885: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4886: {
4887: USE_OPLINE
1.1 misho 4888:
1.1.1.2 misho 4889: return zend_fetch_var_address_helper_SPEC_CONST_VAR(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 4890: }
4891:
1.1.1.2 misho 4892: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 4893: {
1.1.1.2 misho 4894: return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
4895: }
1.1 misho 4896:
1.1.1.2 misho 4897: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
4898: {
4899: return zend_fetch_var_address_helper_SPEC_CONST_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 4900: }
4901:
1.1.1.2 misho 4902: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 4903: {
1.1.1.2 misho 4904: USE_OPLINE
1.1 misho 4905: zval *function_name;
4906: zend_class_entry *ce;
4907:
1.1.1.2 misho 4908: SAVE_OPLINE();
1.1 misho 4909: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
4910:
4911: if (IS_CONST == IS_CONST) {
4912: /* no function found. try a static method in class */
1.1.1.2 misho 4913: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
4914: ce = CACHED_PTR(opline->op1.literal->cache_slot);
4915: } else {
4916: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 4917: if (UNEXPECTED(EG(exception) != NULL)) {
4918: HANDLE_EXCEPTION();
4919: }
1.1.1.2 misho 4920: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 4921: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 4922: }
4923: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 4924: }
4925: EX(called_scope) = ce;
4926: } else {
1.1.1.2 misho 4927: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 4928:
1.1.1.2 misho 4929: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 4930: EX(called_scope) = EG(called_scope);
4931: } else {
4932: EX(called_scope) = ce;
4933: }
4934: }
1.1.1.2 misho 4935:
4936: if (IS_CONST == IS_CONST &&
4937: IS_VAR == IS_CONST &&
4938: CACHED_PTR(opline->op2.literal->cache_slot)) {
4939: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
4940: } else if (IS_CONST != IS_CONST &&
4941: IS_VAR == IS_CONST &&
4942: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
4943: /* do nothing */
4944: } else if (IS_VAR != IS_UNUSED) {
1.1 misho 4945: char *function_name_strval = NULL;
4946: int function_name_strlen = 0;
1.1.1.2 misho 4947: zend_free_op free_op2;
1.1 misho 4948:
1.1.1.2 misho 4949: if (IS_VAR == IS_CONST) {
4950: function_name_strval = Z_STRVAL_P(opline->op2.zv);
4951: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 4952: } else {
1.1.1.2 misho 4953: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 4954:
1.1.1.2 misho 4955: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 4956: zend_error_noreturn(E_ERROR, "Function name must be a string");
4957: } else {
4958: function_name_strval = Z_STRVAL_P(function_name);
4959: function_name_strlen = Z_STRLEN_P(function_name);
4960: }
4961: }
4962:
4963: if (function_name_strval) {
4964: if (ce->get_static_method) {
4965: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
4966: } else {
1.1.1.2 misho 4967: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 4968: }
1.1.1.2 misho 4969: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 4970: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
4971: }
1.1.1.2 misho 4972: if (IS_VAR == IS_CONST &&
4973: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
4974: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
4975: if (IS_CONST == IS_CONST) {
4976: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
4977: } else {
4978: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
4979: }
4980: }
1.1 misho 4981: }
1.1.1.2 misho 4982: if (IS_VAR != IS_CONST) {
4983: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 4984: }
4985: } else {
1.1.1.2 misho 4986: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 4987: zend_error_noreturn(E_ERROR, "Cannot call constructor");
4988: }
4989: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 4990: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 4991: }
4992: EX(fbc) = ce->constructor;
4993: }
4994:
4995: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
4996: EX(object) = NULL;
4997: } else {
4998: if (EG(This) &&
4999: Z_OBJ_HT_P(EG(This))->get_class_entry &&
5000: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
5001: /* We are calling method of the other (incompatible) class,
5002: but passing $this. This is done for compatibility with php-4. */
5003: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 5004: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 5005: } else {
5006: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 5007: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 5008: }
5009: }
5010: if ((EX(object) = EG(This))) {
5011: Z_ADDREF_P(EX(object));
5012: EX(called_scope) = Z_OBJCE_P(EX(object));
5013: }
5014: }
5015:
1.1.1.2 misho 5016: CHECK_EXCEPTION();
1.1 misho 5017: ZEND_VM_NEXT_OPCODE();
5018: }
5019:
1.1.1.2 misho 5020: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
5021: {
5022: USE_OPLINE
5023: zend_free_op free_op2;
5024:
5025: SAVE_OPLINE();
5026: if (IS_CONST==IS_VAR) {
5027: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
5028: }
5029: is_equal_function(&EX_T(opline->result.var).tmp_var,
5030: opline->op1.zv,
5031: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
5032:
5033: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
5034: CHECK_EXCEPTION();
5035: ZEND_VM_NEXT_OPCODE();
5036: }
5037:
5038: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5039: {
1.1.1.2 misho 5040: USE_OPLINE
1.1 misho 5041:
5042: zval *expr_ptr;
5043:
1.1.1.2 misho 5044: SAVE_OPLINE();
5045: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
5046: zval **expr_ptr_ptr = NULL;
1.1 misho 5047:
1.1.1.2 misho 5048: if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
5049: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
5050: }
5051: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 5052: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 5053: Z_ADDREF_P(expr_ptr);
1.1 misho 5054: } else {
1.1.1.2 misho 5055: expr_ptr=opline->op1.zv;
5056: if (0) { /* temporary variable */
5057: zval *new_expr;
1.1 misho 5058:
1.1.1.2 misho 5059: ALLOC_ZVAL(new_expr);
5060: INIT_PZVAL_COPY(new_expr, expr_ptr);
5061: expr_ptr = new_expr;
5062: } else if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 5063: zval *new_expr;
5064:
5065: ALLOC_ZVAL(new_expr);
5066: INIT_PZVAL_COPY(new_expr, expr_ptr);
5067: expr_ptr = new_expr;
5068: zendi_zval_copy_ctor(*expr_ptr);
5069: } else {
5070: Z_ADDREF_P(expr_ptr);
5071: }
5072: }
1.1.1.2 misho 5073:
5074: if (IS_VAR != IS_UNUSED) {
5075: zend_free_op free_op2;
5076: zval *offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
5077: ulong hval;
5078:
1.1 misho 5079: switch (Z_TYPE_P(offset)) {
5080: case IS_DOUBLE:
1.1.1.2 misho 5081: hval = zend_dval_to_lval(Z_DVAL_P(offset));
5082: goto num_index;
1.1 misho 5083: case IS_LONG:
5084: case IS_BOOL:
1.1.1.2 misho 5085: hval = Z_LVAL_P(offset);
5086: num_index:
5087: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5088: break;
5089: case IS_STRING:
1.1.1.2 misho 5090: if (IS_VAR == IS_CONST) {
5091: hval = Z_HASH_P(offset);
5092: } else {
5093: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
5094: if (IS_INTERNED(Z_STRVAL_P(offset))) {
5095: hval = INTERNED_HASH(Z_STRVAL_P(offset));
5096: } else {
5097: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
5098: }
5099: }
5100: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5101: break;
5102: case IS_NULL:
1.1.1.2 misho 5103: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5104: break;
5105: default:
5106: zend_error(E_WARNING, "Illegal offset type");
5107: zval_ptr_dtor(&expr_ptr);
5108: /* do nothing */
5109: break;
5110: }
1.1.1.2 misho 5111: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 5112: } else {
1.1.1.2 misho 5113: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5114: }
1.1.1.2 misho 5115: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
1.1 misho 5116:
5117: } else {
5118:
5119: }
1.1.1.2 misho 5120: CHECK_EXCEPTION();
1.1 misho 5121: ZEND_VM_NEXT_OPCODE();
5122: }
5123:
1.1.1.2 misho 5124: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5125: {
1.1.1.2 misho 5126: USE_OPLINE
1.1 misho 5127:
1.1.1.2 misho 5128: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 5129: if (IS_CONST == IS_UNUSED) {
5130: ZEND_VM_NEXT_OPCODE();
5131: #if 0 || IS_CONST != IS_UNUSED
5132: } else {
1.1.1.2 misho 5133: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5134: #endif
5135: }
5136: }
5137:
1.1.1.2 misho 5138: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5139: {
1.1.1.2 misho 5140: USE_OPLINE
5141: zval tmp, *varname;
5142: HashTable *target_symbol_table;
1.1 misho 5143:
5144:
1.1.1.2 misho 5145: SAVE_OPLINE();
5146: if (IS_CONST == IS_CV &&
5147: IS_VAR == IS_UNUSED &&
5148: (opline->extended_value & ZEND_QUICK_SET)) {
5149: if (EG(active_symbol_table)) {
5150: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
1.1 misho 5151:
1.1.1.2 misho 5152: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
5153: EX_CV(opline->op1.var) = NULL;
5154: } else if (EX_CV(opline->op1.var)) {
5155: zval_ptr_dtor(EX_CV(opline->op1.var));
5156: EX_CV(opline->op1.var) = NULL;
5157: }
5158: CHECK_EXCEPTION();
5159: ZEND_VM_NEXT_OPCODE();
5160: }
1.1 misho 5161:
1.1.1.2 misho 5162: varname = opline->op1.zv;
1.1 misho 5163:
1.1.1.2 misho 5164: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
5165: ZVAL_COPY_VALUE(&tmp, varname);
5166: zval_copy_ctor(&tmp);
5167: convert_to_string(&tmp);
5168: varname = &tmp;
5169: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5170: Z_ADDREF_P(varname);
5171: }
1.1 misho 5172:
1.1.1.2 misho 5173: if (IS_VAR != IS_UNUSED) {
5174: zend_class_entry *ce;
1.1 misho 5175:
1.1.1.2 misho 5176: if (IS_VAR == IS_CONST) {
5177: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
5178: ce = CACHED_PTR(opline->op2.literal->cache_slot);
5179: } else {
5180: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 5181: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 5182: if (IS_CONST != IS_CONST && varname == &tmp) {
5183: zval_dtor(&tmp);
5184: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5185: zval_ptr_dtor(&varname);
5186: }
1.1 misho 5187:
1.1.1.4 misho 5188: HANDLE_EXCEPTION();
5189: }
5190: if (UNEXPECTED(ce == NULL)) {
5191: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 5192: }
5193: CACHE_PTR(opline->op2.literal->cache_slot, ce);
5194: }
5195: } else {
5196: ce = EX_T(opline->op2.var).class_entry;
5197: }
5198: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
5199: } else {
5200: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
1.1 misho 5201:
1.1.1.2 misho 5202: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
5203: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
5204: }
1.1 misho 5205:
1.1.1.2 misho 5206: if (IS_CONST != IS_CONST && varname == &tmp) {
5207: zval_dtor(&tmp);
5208: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5209: zval_ptr_dtor(&varname);
5210: }
1.1 misho 5211:
1.1.1.2 misho 5212: CHECK_EXCEPTION();
1.1 misho 5213: ZEND_VM_NEXT_OPCODE();
5214: }
5215:
1.1.1.2 misho 5216: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5217: {
1.1.1.2 misho 5218: USE_OPLINE
5219: zval **value;
5220: zend_bool isset = 1;
1.1 misho 5221:
1.1.1.2 misho 5222: SAVE_OPLINE();
5223: if (IS_CONST == IS_CV &&
5224: IS_VAR == IS_UNUSED &&
5225: (opline->extended_value & ZEND_QUICK_SET)) {
5226: if (EX_CV(opline->op1.var)) {
5227: value = EX_CV(opline->op1.var);
5228: } else if (EG(active_symbol_table)) {
5229: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
1.1 misho 5230:
1.1.1.2 misho 5231: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
5232: isset = 0;
5233: }
5234: } else {
5235: isset = 0;
5236: }
5237: } else {
5238: HashTable *target_symbol_table;
1.1 misho 5239:
1.1.1.2 misho 5240: zval tmp, *varname = opline->op1.zv;
1.1 misho 5241:
1.1.1.2 misho 5242: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
5243: ZVAL_COPY_VALUE(&tmp, varname);
5244: zval_copy_ctor(&tmp);
5245: convert_to_string(&tmp);
5246: varname = &tmp;
5247: }
1.1 misho 5248:
1.1.1.2 misho 5249: if (IS_VAR != IS_UNUSED) {
5250: zend_class_entry *ce;
1.1 misho 5251:
1.1.1.2 misho 5252: if (IS_VAR == IS_CONST) {
5253: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
5254: ce = CACHED_PTR(opline->op2.literal->cache_slot);
5255: } else {
5256: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
5257: if (UNEXPECTED(ce == NULL)) {
5258: CHECK_EXCEPTION();
5259: ZEND_VM_NEXT_OPCODE();
5260: }
5261: CACHE_PTR(opline->op2.literal->cache_slot, ce);
5262: }
5263: } else {
5264: ce = EX_T(opline->op2.var).class_entry;
5265: }
5266: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
5267: if (!value) {
5268: isset = 0;
5269: }
5270: } else {
5271: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
5272: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
5273: isset = 0;
5274: }
5275: }
1.1 misho 5276:
1.1.1.2 misho 5277: if (IS_CONST != IS_CONST && varname == &tmp) {
5278: zval_dtor(&tmp);
5279: }
1.1 misho 5280:
1.1.1.2 misho 5281: }
1.1 misho 5282:
1.1.1.2 misho 5283: if (opline->extended_value & ZEND_ISSET) {
5284: if (isset && Z_TYPE_PP(value) != IS_NULL) {
5285: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
5286: } else {
5287: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
5288: }
5289: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
5290: if (!isset || !i_zend_is_true(*value)) {
5291: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
5292: } else {
5293: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
5294: }
5295: }
1.1 misho 5296:
1.1.1.2 misho 5297: CHECK_EXCEPTION();
1.1 misho 5298: ZEND_VM_NEXT_OPCODE();
5299: }
5300:
1.1.1.2 misho 5301: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5302: {
1.1.1.2 misho 5303: USE_OPLINE
5304: zend_free_op free_op1;
5305: zval *varname;
5306: zval **retval;
5307: zval tmp_varname;
5308: HashTable *target_symbol_table;
5309: ulong hash_value;
1.1 misho 5310:
1.1.1.2 misho 5311: SAVE_OPLINE();
5312: varname = opline->op1.zv;
1.1 misho 5313:
1.1.1.2 misho 5314: if (IS_CONST != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
5315: ZVAL_COPY_VALUE(&tmp_varname, varname);
5316: zval_copy_ctor(&tmp_varname);
5317: Z_SET_REFCOUNT(tmp_varname, 1);
5318: Z_UNSET_ISREF(tmp_varname);
5319: convert_to_string(&tmp_varname);
5320: varname = &tmp_varname;
5321: }
1.1 misho 5322:
1.1.1.2 misho 5323: if (IS_UNUSED != IS_UNUSED) {
5324: zend_class_entry *ce;
1.1 misho 5325:
1.1.1.2 misho 5326: if (IS_UNUSED == IS_CONST) {
5327: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
5328: ce = CACHED_PTR(opline->op2.literal->cache_slot);
5329: } else {
5330: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
5331: if (UNEXPECTED(ce == NULL)) {
5332: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
5333: zval_dtor(&tmp_varname);
5334: }
1.1 misho 5335:
1.1.1.2 misho 5336: CHECK_EXCEPTION();
5337: ZEND_VM_NEXT_OPCODE();
5338: }
5339: CACHE_PTR(opline->op2.literal->cache_slot, ce);
5340: }
5341: } else {
5342: ce = EX_T(opline->op2.var).class_entry;
5343: }
5344: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
1.1 misho 5345:
1.1.1.2 misho 5346: } else {
5347: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
5348: /*
5349: if (!target_symbol_table) {
5350: CHECK_EXCEPTION();
5351: ZEND_VM_NEXT_OPCODE();
5352: }
5353: */
5354: if (IS_CONST == IS_CONST) {
5355: hash_value = Z_HASH_P(varname);
5356: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
5357: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
5358: } else {
5359: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
5360: }
1.1 misho 5361:
1.1.1.2 misho 5362: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
5363: switch (type) {
5364: case BP_VAR_R:
5365: case BP_VAR_UNSET:
5366: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
5367: /* break missing intentionally */
5368: case BP_VAR_IS:
5369: retval = &EG(uninitialized_zval_ptr);
5370: break;
5371: case BP_VAR_RW:
5372: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
5373: /* break missing intentionally */
5374: case BP_VAR_W:
5375: Z_ADDREF_P(&EG(uninitialized_zval));
5376: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
5377: break;
5378: EMPTY_SWITCH_DEFAULT_CASE()
5379: }
5380: }
5381: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
5382: case ZEND_FETCH_GLOBAL:
5383: if (IS_CONST != IS_TMP_VAR) {
1.1 misho 5384:
1.1.1.2 misho 5385: }
5386: break;
5387: case ZEND_FETCH_LOCAL:
1.1 misho 5388:
1.1.1.2 misho 5389: break;
5390: case ZEND_FETCH_STATIC:
5391: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
5392: break;
5393: case ZEND_FETCH_GLOBAL_LOCK:
5394: if (IS_CONST == IS_VAR && !free_op1.var) {
5395: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
5396: }
5397: break;
5398: }
5399: }
1.1 misho 5400:
5401:
1.1.1.2 misho 5402: if (IS_CONST != IS_CONST && varname == &tmp_varname) {
5403: zval_dtor(&tmp_varname);
5404: }
5405: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
5406: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
5407: }
5408: PZVAL_LOCK(*retval);
5409: switch (type) {
5410: case BP_VAR_R:
5411: case BP_VAR_IS:
5412: AI_SET_PTR(&EX_T(opline->result.var), *retval);
5413: break;
5414: case BP_VAR_UNSET: {
5415: zend_free_op free_res;
5416:
5417: PZVAL_UNLOCK(*retval, &free_res);
5418: if (retval != &EG(uninitialized_zval_ptr)) {
5419: SEPARATE_ZVAL_IF_NOT_REF(retval);
5420: }
5421: PZVAL_LOCK(*retval);
5422: FREE_OP_VAR_PTR(free_res);
5423: }
5424: /* break missing intentionally */
5425: default:
5426: EX_T(opline->result.var).var.ptr_ptr = retval;
5427: break;
5428: }
5429: CHECK_EXCEPTION();
1.1 misho 5430: ZEND_VM_NEXT_OPCODE();
5431: }
5432:
1.1.1.2 misho 5433: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5434: {
1.1.1.2 misho 5435: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5436: }
5437:
1.1.1.2 misho 5438: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5439: {
1.1.1.2 misho 5440: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5441: }
5442:
1.1.1.2 misho 5443: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5444: {
1.1.1.2 misho 5445: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5446: }
5447:
1.1.1.2 misho 5448: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5449: {
1.1.1.2 misho 5450: USE_OPLINE
1.1 misho 5451:
1.1.1.2 misho 5452: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5453: }
5454:
1.1.1.2 misho 5455: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5456: {
1.1.1.2 misho 5457: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5458: }
5459:
1.1.1.2 misho 5460: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5461: {
1.1.1.2 misho 5462: return zend_fetch_var_address_helper_SPEC_CONST_UNUSED(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5463: }
5464:
1.1.1.2 misho 5465: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5466: {
1.1.1.2 misho 5467: USE_OPLINE
1.1 misho 5468: zval *function_name;
5469: zend_class_entry *ce;
5470:
1.1.1.2 misho 5471: SAVE_OPLINE();
1.1 misho 5472: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
5473:
5474: if (IS_CONST == IS_CONST) {
5475: /* no function found. try a static method in class */
1.1.1.2 misho 5476: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
5477: ce = CACHED_PTR(opline->op1.literal->cache_slot);
5478: } else {
5479: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 5480: if (UNEXPECTED(EG(exception) != NULL)) {
5481: HANDLE_EXCEPTION();
5482: }
1.1.1.2 misho 5483: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 5484: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 5485: }
5486: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 5487: }
5488: EX(called_scope) = ce;
5489: } else {
1.1.1.2 misho 5490: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 5491:
1.1.1.2 misho 5492: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 5493: EX(called_scope) = EG(called_scope);
5494: } else {
5495: EX(called_scope) = ce;
5496: }
5497: }
1.1.1.2 misho 5498:
5499: if (IS_CONST == IS_CONST &&
5500: IS_UNUSED == IS_CONST &&
5501: CACHED_PTR(opline->op2.literal->cache_slot)) {
5502: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
5503: } else if (IS_CONST != IS_CONST &&
5504: IS_UNUSED == IS_CONST &&
5505: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
5506: /* do nothing */
5507: } else if (IS_UNUSED != IS_UNUSED) {
1.1 misho 5508: char *function_name_strval = NULL;
5509: int function_name_strlen = 0;
5510:
5511:
1.1.1.2 misho 5512: if (IS_UNUSED == IS_CONST) {
5513: function_name_strval = Z_STRVAL_P(opline->op2.zv);
5514: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 5515: } else {
1.1.1.2 misho 5516: function_name = NULL;
1.1 misho 5517:
1.1.1.2 misho 5518: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 5519: zend_error_noreturn(E_ERROR, "Function name must be a string");
5520: } else {
5521: function_name_strval = Z_STRVAL_P(function_name);
5522: function_name_strlen = Z_STRLEN_P(function_name);
5523: }
5524: }
5525:
5526: if (function_name_strval) {
5527: if (ce->get_static_method) {
5528: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
5529: } else {
1.1.1.2 misho 5530: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_UNUSED == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 5531: }
1.1.1.2 misho 5532: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 5533: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
5534: }
1.1.1.2 misho 5535: if (IS_UNUSED == IS_CONST &&
5536: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
5537: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
5538: if (IS_CONST == IS_CONST) {
5539: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
5540: } else {
5541: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
5542: }
5543: }
1.1 misho 5544: }
1.1.1.2 misho 5545: if (IS_UNUSED != IS_CONST) {
1.1 misho 5546:
5547: }
5548: } else {
1.1.1.2 misho 5549: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 5550: zend_error_noreturn(E_ERROR, "Cannot call constructor");
5551: }
5552: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 5553: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 5554: }
5555: EX(fbc) = ce->constructor;
5556: }
5557:
5558: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
5559: EX(object) = NULL;
5560: } else {
5561: if (EG(This) &&
5562: Z_OBJ_HT_P(EG(This))->get_class_entry &&
5563: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
5564: /* We are calling method of the other (incompatible) class,
5565: but passing $this. This is done for compatibility with php-4. */
5566: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 5567: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 5568: } else {
5569: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 5570: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 5571: }
5572: }
5573: if ((EX(object) = EG(This))) {
5574: Z_ADDREF_P(EX(object));
5575: EX(called_scope) = Z_OBJCE_P(EX(object));
5576: }
5577: }
5578:
1.1.1.2 misho 5579: CHECK_EXCEPTION();
1.1 misho 5580: ZEND_VM_NEXT_OPCODE();
5581: }
5582:
1.1.1.2 misho 5583: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5584: {
1.1.1.2 misho 5585: USE_OPLINE
1.1 misho 5586:
5587: zval *expr_ptr;
5588:
1.1.1.2 misho 5589: SAVE_OPLINE();
5590: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
5591: zval **expr_ptr_ptr = NULL;
1.1 misho 5592:
1.1.1.2 misho 5593: if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
5594: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
5595: }
5596: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 5597: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 5598: Z_ADDREF_P(expr_ptr);
1.1 misho 5599: } else {
1.1.1.2 misho 5600: expr_ptr=opline->op1.zv;
5601: if (0) { /* temporary variable */
5602: zval *new_expr;
1.1 misho 5603:
1.1.1.2 misho 5604: ALLOC_ZVAL(new_expr);
5605: INIT_PZVAL_COPY(new_expr, expr_ptr);
5606: expr_ptr = new_expr;
5607: } else if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 5608: zval *new_expr;
5609:
5610: ALLOC_ZVAL(new_expr);
5611: INIT_PZVAL_COPY(new_expr, expr_ptr);
5612: expr_ptr = new_expr;
5613: zendi_zval_copy_ctor(*expr_ptr);
5614: } else {
5615: Z_ADDREF_P(expr_ptr);
5616: }
5617: }
1.1.1.2 misho 5618:
5619: if (IS_UNUSED != IS_UNUSED) {
5620:
5621: zval *offset = NULL;
5622: ulong hval;
5623:
1.1 misho 5624: switch (Z_TYPE_P(offset)) {
5625: case IS_DOUBLE:
1.1.1.2 misho 5626: hval = zend_dval_to_lval(Z_DVAL_P(offset));
5627: goto num_index;
1.1 misho 5628: case IS_LONG:
5629: case IS_BOOL:
1.1.1.2 misho 5630: hval = Z_LVAL_P(offset);
5631: num_index:
5632: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5633: break;
5634: case IS_STRING:
1.1.1.2 misho 5635: if (IS_UNUSED == IS_CONST) {
5636: hval = Z_HASH_P(offset);
5637: } else {
5638: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
5639: if (IS_INTERNED(Z_STRVAL_P(offset))) {
5640: hval = INTERNED_HASH(Z_STRVAL_P(offset));
5641: } else {
5642: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
5643: }
5644: }
5645: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5646: break;
5647: case IS_NULL:
1.1.1.2 misho 5648: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5649: break;
5650: default:
5651: zend_error(E_WARNING, "Illegal offset type");
5652: zval_ptr_dtor(&expr_ptr);
5653: /* do nothing */
5654: break;
5655: }
5656:
5657: } else {
1.1.1.2 misho 5658: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 5659: }
1.1.1.2 misho 5660: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
1.1 misho 5661:
5662: } else {
5663:
5664: }
1.1.1.2 misho 5665: CHECK_EXCEPTION();
1.1 misho 5666: ZEND_VM_NEXT_OPCODE();
5667: }
5668:
1.1.1.2 misho 5669: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5670: {
1.1.1.2 misho 5671: USE_OPLINE
1.1 misho 5672:
1.1.1.2 misho 5673: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 5674: if (IS_CONST == IS_UNUSED) {
5675: ZEND_VM_NEXT_OPCODE();
5676: #if 0 || IS_CONST != IS_UNUSED
5677: } else {
1.1.1.2 misho 5678: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 5679: #endif
5680: }
5681: }
5682:
1.1.1.2 misho 5683: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5684: {
1.1.1.2 misho 5685: USE_OPLINE
5686: zval tmp, *varname;
5687: HashTable *target_symbol_table;
1.1 misho 5688:
5689:
1.1.1.2 misho 5690: SAVE_OPLINE();
5691: if (IS_CONST == IS_CV &&
5692: IS_UNUSED == IS_UNUSED &&
5693: (opline->extended_value & ZEND_QUICK_SET)) {
5694: if (EG(active_symbol_table)) {
5695: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
1.1 misho 5696:
1.1.1.2 misho 5697: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
5698: EX_CV(opline->op1.var) = NULL;
5699: } else if (EX_CV(opline->op1.var)) {
5700: zval_ptr_dtor(EX_CV(opline->op1.var));
5701: EX_CV(opline->op1.var) = NULL;
5702: }
5703: CHECK_EXCEPTION();
5704: ZEND_VM_NEXT_OPCODE();
5705: }
1.1 misho 5706:
1.1.1.2 misho 5707: varname = opline->op1.zv;
1.1 misho 5708:
1.1.1.2 misho 5709: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
5710: ZVAL_COPY_VALUE(&tmp, varname);
5711: zval_copy_ctor(&tmp);
5712: convert_to_string(&tmp);
5713: varname = &tmp;
5714: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5715: Z_ADDREF_P(varname);
5716: }
5717:
5718: if (IS_UNUSED != IS_UNUSED) {
5719: zend_class_entry *ce;
5720:
5721: if (IS_UNUSED == IS_CONST) {
5722: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
5723: ce = CACHED_PTR(opline->op2.literal->cache_slot);
5724: } else {
5725: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 5726: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 5727: if (IS_CONST != IS_CONST && varname == &tmp) {
5728: zval_dtor(&tmp);
5729: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5730: zval_ptr_dtor(&varname);
5731: }
5732:
1.1.1.4 misho 5733: HANDLE_EXCEPTION();
5734: }
5735: if (UNEXPECTED(ce == NULL)) {
5736: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 5737: }
5738: CACHE_PTR(opline->op2.literal->cache_slot, ce);
5739: }
1.1 misho 5740: } else {
1.1.1.2 misho 5741: ce = EX_T(opline->op2.var).class_entry;
1.1 misho 5742: }
1.1.1.2 misho 5743: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
1.1 misho 5744: } else {
1.1.1.2 misho 5745: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
5746:
5747: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
5748: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
1.1 misho 5749: }
5750:
1.1.1.2 misho 5751: if (IS_CONST != IS_CONST && varname == &tmp) {
5752: zval_dtor(&tmp);
5753: } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
5754: zval_ptr_dtor(&varname);
5755: }
5756:
5757: CHECK_EXCEPTION();
1.1 misho 5758: ZEND_VM_NEXT_OPCODE();
5759: }
5760:
1.1.1.2 misho 5761: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5762: {
1.1.1.2 misho 5763: USE_OPLINE
5764: zval **value;
5765: zend_bool isset = 1;
1.1 misho 5766:
1.1.1.2 misho 5767: SAVE_OPLINE();
5768: if (IS_CONST == IS_CV &&
5769: IS_UNUSED == IS_UNUSED &&
5770: (opline->extended_value & ZEND_QUICK_SET)) {
5771: if (EX_CV(opline->op1.var)) {
5772: value = EX_CV(opline->op1.var);
5773: } else if (EG(active_symbol_table)) {
5774: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
1.1 misho 5775:
1.1.1.2 misho 5776: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
5777: isset = 0;
5778: }
5779: } else {
5780: isset = 0;
5781: }
5782: } else {
5783: HashTable *target_symbol_table;
1.1 misho 5784:
1.1.1.2 misho 5785: zval tmp, *varname = opline->op1.zv;
1.1 misho 5786:
1.1.1.2 misho 5787: if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
5788: ZVAL_COPY_VALUE(&tmp, varname);
5789: zval_copy_ctor(&tmp);
5790: convert_to_string(&tmp);
5791: varname = &tmp;
1.1 misho 5792: }
5793:
1.1.1.2 misho 5794: if (IS_UNUSED != IS_UNUSED) {
5795: zend_class_entry *ce;
5796:
5797: if (IS_UNUSED == IS_CONST) {
5798: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
5799: ce = CACHED_PTR(opline->op2.literal->cache_slot);
5800: } else {
5801: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
5802: if (UNEXPECTED(ce == NULL)) {
5803: CHECK_EXCEPTION();
5804: ZEND_VM_NEXT_OPCODE();
1.1 misho 5805: }
1.1.1.2 misho 5806: CACHE_PTR(opline->op2.literal->cache_slot, ce);
1.1 misho 5807: }
1.1.1.2 misho 5808: } else {
5809: ce = EX_T(opline->op2.var).class_entry;
5810: }
5811: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CONST == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
5812: if (!value) {
5813: isset = 0;
5814: }
5815: } else {
5816: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
5817: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
5818: isset = 0;
5819: }
1.1 misho 5820: }
5821:
1.1.1.2 misho 5822: if (IS_CONST != IS_CONST && varname == &tmp) {
5823: zval_dtor(&tmp);
5824: }
1.1 misho 5825:
5826: }
1.1.1.2 misho 5827:
5828: if (opline->extended_value & ZEND_ISSET) {
5829: if (isset && Z_TYPE_PP(value) != IS_NULL) {
5830: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
5831: } else {
5832: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
5833: }
5834: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
5835: if (!isset || !i_zend_is_true(*value)) {
5836: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
5837: } else {
5838: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
1.1 misho 5839: }
5840: }
1.1.1.2 misho 5841:
5842: CHECK_EXCEPTION();
1.1 misho 5843: ZEND_VM_NEXT_OPCODE();
5844: }
5845:
1.1.1.2 misho 5846: static int ZEND_FASTCALL ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5847: {
1.1.1.2 misho 5848: USE_OPLINE
5849: zend_function *op_array;
5850:
5851: SAVE_OPLINE();
5852:
5853: if (UNEXPECTED(zend_hash_quick_find(EG(function_table), Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), Z_HASH_P(opline->op1.zv), (void *) &op_array) == FAILURE) ||
5854: UNEXPECTED(op_array->type != ZEND_USER_FUNCTION)) {
5855: zend_error_noreturn(E_ERROR, "Base lambda function for closure not found");
5856: }
5857:
5858: zend_create_closure(&EX_T(opline->result.var).tmp_var, op_array, EG(scope), EG(This) TSRMLS_CC);
5859:
5860: CHECK_EXCEPTION();
5861: ZEND_VM_NEXT_OPCODE();
1.1 misho 5862: }
5863:
1.1.1.2 misho 5864: static int ZEND_FASTCALL ZEND_ADD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5865: {
1.1.1.2 misho 5866: USE_OPLINE
5867:
5868:
5869: SAVE_OPLINE();
5870: fast_add_function(&EX_T(opline->result.var).tmp_var,
5871: opline->op1.zv,
5872: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5873:
5874:
5875: CHECK_EXCEPTION();
5876: ZEND_VM_NEXT_OPCODE();
1.1 misho 5877: }
5878:
1.1.1.2 misho 5879: static int ZEND_FASTCALL ZEND_SUB_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5880: {
1.1.1.2 misho 5881: USE_OPLINE
5882:
5883:
5884: SAVE_OPLINE();
5885: fast_sub_function(&EX_T(opline->result.var).tmp_var,
5886: opline->op1.zv,
5887: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5888:
5889:
5890: CHECK_EXCEPTION();
5891: ZEND_VM_NEXT_OPCODE();
1.1 misho 5892: }
5893:
1.1.1.2 misho 5894: static int ZEND_FASTCALL ZEND_MUL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5895: {
1.1.1.2 misho 5896: USE_OPLINE
5897:
5898:
5899: SAVE_OPLINE();
5900: fast_mul_function(&EX_T(opline->result.var).tmp_var,
5901: opline->op1.zv,
5902: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5903:
5904:
5905: CHECK_EXCEPTION();
5906: ZEND_VM_NEXT_OPCODE();
1.1 misho 5907: }
5908:
1.1.1.2 misho 5909: static int ZEND_FASTCALL ZEND_DIV_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5910: {
1.1.1.2 misho 5911: USE_OPLINE
5912:
5913:
5914: SAVE_OPLINE();
5915: fast_div_function(&EX_T(opline->result.var).tmp_var,
5916: opline->op1.zv,
5917: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5918:
5919:
5920: CHECK_EXCEPTION();
5921: ZEND_VM_NEXT_OPCODE();
1.1 misho 5922: }
5923:
1.1.1.2 misho 5924: static int ZEND_FASTCALL ZEND_MOD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5925: {
1.1.1.2 misho 5926: USE_OPLINE
5927:
5928:
5929: SAVE_OPLINE();
5930: fast_mod_function(&EX_T(opline->result.var).tmp_var,
5931: opline->op1.zv,
5932: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5933:
5934:
5935: CHECK_EXCEPTION();
5936: ZEND_VM_NEXT_OPCODE();
1.1 misho 5937: }
5938:
1.1.1.2 misho 5939: static int ZEND_FASTCALL ZEND_SL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5940: {
1.1.1.2 misho 5941: USE_OPLINE
5942:
5943:
5944: SAVE_OPLINE();
5945: shift_left_function(&EX_T(opline->result.var).tmp_var,
5946: opline->op1.zv,
5947: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 5948:
5949:
1.1.1.2 misho 5950: CHECK_EXCEPTION();
1.1 misho 5951: ZEND_VM_NEXT_OPCODE();
5952: }
5953:
1.1.1.2 misho 5954: static int ZEND_FASTCALL ZEND_SR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5955: {
1.1.1.2 misho 5956: USE_OPLINE
1.1 misho 5957:
5958:
1.1.1.2 misho 5959: SAVE_OPLINE();
5960: shift_right_function(&EX_T(opline->result.var).tmp_var,
5961: opline->op1.zv,
5962: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5963:
5964:
5965: CHECK_EXCEPTION();
1.1 misho 5966: ZEND_VM_NEXT_OPCODE();
5967: }
5968:
1.1.1.2 misho 5969: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5970: {
1.1.1.2 misho 5971: USE_OPLINE
1.1 misho 5972:
1.1.1.2 misho 5973:
5974: SAVE_OPLINE();
5975: concat_function(&EX_T(opline->result.var).tmp_var,
5976: opline->op1.zv,
5977: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5978:
5979:
5980: CHECK_EXCEPTION();
5981: ZEND_VM_NEXT_OPCODE();
1.1 misho 5982: }
5983:
1.1.1.2 misho 5984: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 5985: {
1.1.1.2 misho 5986: USE_OPLINE
1.1 misho 5987:
1.1.1.2 misho 5988:
5989: SAVE_OPLINE();
5990: is_identical_function(&EX_T(opline->result.var).tmp_var,
5991: opline->op1.zv,
5992: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
5993:
5994:
5995: CHECK_EXCEPTION();
1.1 misho 5996: ZEND_VM_NEXT_OPCODE();
5997: }
5998:
1.1.1.2 misho 5999: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6000: {
1.1.1.2 misho 6001: USE_OPLINE
1.1 misho 6002:
1.1.1.2 misho 6003: zval *result = &EX_T(opline->result.var).tmp_var;
6004:
6005: SAVE_OPLINE();
6006: is_identical_function(result,
6007: opline->op1.zv,
6008: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
6009: Z_LVAL_P(result) = !Z_LVAL_P(result);
6010:
6011:
6012: CHECK_EXCEPTION();
1.1 misho 6013: ZEND_VM_NEXT_OPCODE();
6014: }
6015:
1.1.1.2 misho 6016: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6017: {
1.1.1.2 misho 6018: USE_OPLINE
6019:
6020: zval *result = &EX_T(opline->result.var).tmp_var;
6021:
6022: SAVE_OPLINE();
6023: ZVAL_BOOL(result, fast_equal_function(result,
6024: opline->op1.zv,
6025: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
6026:
6027:
6028: CHECK_EXCEPTION();
1.1 misho 6029: ZEND_VM_NEXT_OPCODE();
6030: }
6031:
1.1.1.2 misho 6032: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6033: {
1.1.1.2 misho 6034: USE_OPLINE
1.1 misho 6035:
1.1.1.2 misho 6036: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 6037:
1.1.1.2 misho 6038: SAVE_OPLINE();
6039: ZVAL_BOOL(result, fast_not_equal_function(result,
6040: opline->op1.zv,
6041: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 6042:
6043:
1.1.1.2 misho 6044: CHECK_EXCEPTION();
6045: ZEND_VM_NEXT_OPCODE();
6046: }
1.1 misho 6047:
1.1.1.2 misho 6048: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6049: {
6050: USE_OPLINE
1.1 misho 6051:
1.1.1.2 misho 6052: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 6053:
1.1.1.2 misho 6054: SAVE_OPLINE();
6055: ZVAL_BOOL(result, fast_is_smaller_function(result,
6056: opline->op1.zv,
6057: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 6058:
6059:
1.1.1.2 misho 6060: CHECK_EXCEPTION();
6061: ZEND_VM_NEXT_OPCODE();
6062: }
1.1 misho 6063:
1.1.1.2 misho 6064: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6065: {
6066: USE_OPLINE
1.1 misho 6067:
1.1.1.2 misho 6068: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 6069:
1.1.1.2 misho 6070: SAVE_OPLINE();
6071: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
6072: opline->op1.zv,
6073: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 6074:
1.1.1.2 misho 6075:
6076: CHECK_EXCEPTION();
6077: ZEND_VM_NEXT_OPCODE();
1.1 misho 6078: }
6079:
1.1.1.2 misho 6080: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6081: {
1.1.1.2 misho 6082: USE_OPLINE
1.1 misho 6083:
6084:
1.1.1.2 misho 6085: SAVE_OPLINE();
6086: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
6087: opline->op1.zv,
6088: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 6089:
6090:
1.1.1.2 misho 6091: CHECK_EXCEPTION();
1.1 misho 6092: ZEND_VM_NEXT_OPCODE();
6093: }
6094:
1.1.1.2 misho 6095: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6096: {
1.1.1.2 misho 6097: USE_OPLINE
1.1 misho 6098:
6099:
1.1.1.2 misho 6100: SAVE_OPLINE();
6101: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
6102: opline->op1.zv,
6103: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 6104:
1.1.1.2 misho 6105:
6106: CHECK_EXCEPTION();
1.1 misho 6107: ZEND_VM_NEXT_OPCODE();
6108: }
6109:
1.1.1.2 misho 6110: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6111: {
1.1.1.2 misho 6112: USE_OPLINE
1.1 misho 6113:
6114:
1.1.1.2 misho 6115: SAVE_OPLINE();
6116: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
6117: opline->op1.zv,
6118: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
6119:
6120:
6121: CHECK_EXCEPTION();
1.1 misho 6122: ZEND_VM_NEXT_OPCODE();
6123: }
6124:
1.1.1.2 misho 6125: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6126: {
1.1.1.2 misho 6127: USE_OPLINE
6128:
6129:
6130: SAVE_OPLINE();
6131: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
6132: opline->op1.zv,
6133: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
6134:
6135:
6136: CHECK_EXCEPTION();
6137: ZEND_VM_NEXT_OPCODE();
6138: }
6139:
6140: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6141: {
6142: USE_OPLINE
6143: zval *function_name;
1.1 misho 6144: zend_class_entry *ce;
6145:
1.1.1.2 misho 6146: SAVE_OPLINE();
6147: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
1.1 misho 6148:
1.1.1.2 misho 6149: if (IS_CONST == IS_CONST) {
6150: /* no function found. try a static method in class */
6151: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
6152: ce = CACHED_PTR(opline->op1.literal->cache_slot);
1.1 misho 6153: } else {
1.1.1.2 misho 6154: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 6155: if (UNEXPECTED(EG(exception) != NULL)) {
6156: HANDLE_EXCEPTION();
6157: }
1.1.1.2 misho 6158: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 6159: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 6160: }
6161: CACHE_PTR(opline->op1.literal->cache_slot, ce);
6162: }
6163: EX(called_scope) = ce;
6164: } else {
6165: ce = EX_T(opline->op1.var).class_entry;
6166:
6167: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
6168: EX(called_scope) = EG(called_scope);
6169: } else {
6170: EX(called_scope) = ce;
1.1 misho 6171: }
6172: }
6173:
1.1.1.2 misho 6174: if (IS_CONST == IS_CONST &&
6175: IS_CV == IS_CONST &&
6176: CACHED_PTR(opline->op2.literal->cache_slot)) {
6177: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
6178: } else if (IS_CONST != IS_CONST &&
6179: IS_CV == IS_CONST &&
6180: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
6181: /* do nothing */
6182: } else if (IS_CV != IS_UNUSED) {
6183: char *function_name_strval = NULL;
6184: int function_name_strlen = 0;
6185:
6186:
6187: if (IS_CV == IS_CONST) {
6188: function_name_strval = Z_STRVAL_P(opline->op2.zv);
6189: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
6190: } else {
6191: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
6192:
6193: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
6194: zend_error_noreturn(E_ERROR, "Function name must be a string");
6195: } else {
6196: function_name_strval = Z_STRVAL_P(function_name);
6197: function_name_strlen = Z_STRLEN_P(function_name);
6198: }
6199: }
6200:
6201: if (function_name_strval) {
6202: if (ce->get_static_method) {
6203: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
6204: } else {
6205: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 6206: }
1.1.1.2 misho 6207: if (UNEXPECTED(EX(fbc) == NULL)) {
6208: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
6209: }
6210: if (IS_CV == IS_CONST &&
6211: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
6212: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
6213: if (IS_CONST == IS_CONST) {
6214: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
6215: } else {
6216: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
6217: }
1.1 misho 6218: }
6219: }
1.1.1.2 misho 6220: if (IS_CV != IS_CONST) {
6221:
6222: }
6223: } else {
6224: if (UNEXPECTED(ce->constructor == NULL)) {
6225: zend_error_noreturn(E_ERROR, "Cannot call constructor");
6226: }
6227: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
6228: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
6229: }
6230: EX(fbc) = ce->constructor;
1.1 misho 6231: }
6232:
1.1.1.2 misho 6233: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
6234: EX(object) = NULL;
6235: } else {
6236: if (EG(This) &&
6237: Z_OBJ_HT_P(EG(This))->get_class_entry &&
6238: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
6239: /* We are calling method of the other (incompatible) class,
6240: but passing $this. This is done for compatibility with php-4. */
6241: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
6242: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
6243: } else {
6244: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
6245: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
6246: }
6247: }
6248: if ((EX(object) = EG(This))) {
6249: Z_ADDREF_P(EX(object));
6250: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 6251: }
6252: }
6253:
1.1.1.2 misho 6254: CHECK_EXCEPTION();
1.1 misho 6255: ZEND_VM_NEXT_OPCODE();
6256: }
6257:
1.1.1.2 misho 6258: static int ZEND_FASTCALL ZEND_CATCH_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6259: {
1.1.1.2 misho 6260: USE_OPLINE
6261: zend_class_entry *ce, *catch_ce;
6262: zval *exception;
1.1 misho 6263:
1.1.1.2 misho 6264: SAVE_OPLINE();
6265: /* Check whether an exception has been thrown, if not, jump over code */
6266: zend_exception_restore(TSRMLS_C);
6267: if (EG(exception) == NULL) {
6268: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
6269: ZEND_VM_CONTINUE(); /* CHECK_ME */
1.1 misho 6270: }
1.1.1.2 misho 6271: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
6272: catch_ce = CACHED_PTR(opline->op1.literal->cache_slot);
6273: } else {
6274: catch_ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, ZEND_FETCH_CLASS_NO_AUTOLOAD TSRMLS_CC);
1.1 misho 6275:
1.1.1.2 misho 6276: CACHE_PTR(opline->op1.literal->cache_slot, catch_ce);
6277: }
6278: ce = Z_OBJCE_P(EG(exception));
6279:
6280: #ifdef HAVE_DTRACE
6281: if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) {
1.1.1.4 misho 6282: DTRACE_EXCEPTION_CAUGHT((char *)ce->name);
1.1.1.2 misho 6283: }
6284: #endif /* HAVE_DTRACE */
6285:
6286: if (ce != catch_ce) {
6287: if (!instanceof_function(ce, catch_ce TSRMLS_CC)) {
6288: if (opline->result.num) {
6289: zend_throw_exception_internal(NULL TSRMLS_CC);
6290: HANDLE_EXCEPTION();
1.1 misho 6291: }
1.1.1.2 misho 6292: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
6293: ZEND_VM_CONTINUE(); /* CHECK_ME */
1.1 misho 6294: }
6295: }
6296:
1.1.1.2 misho 6297: exception = EG(exception);
6298: if (!EG(active_symbol_table)) {
6299: if (EX_CV(opline->op2.var)) {
6300: zval_ptr_dtor(EX_CV(opline->op2.var));
6301: }
6302: EX_CV(opline->op2.var) = (zval**)EX_CVs() + (EX(op_array)->last_var + opline->op2.var);
6303: *EX_CV(opline->op2.var) = EG(exception);
6304: } else {
6305: zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.var);
6306: zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value,
6307: &EG(exception), sizeof(zval *), (void**)&EX_CV(opline->op2.var));
6308: }
6309: if (UNEXPECTED(EG(exception) != exception)) {
6310: Z_ADDREF_P(EG(exception));
6311: HANDLE_EXCEPTION();
6312: } else {
6313: EG(exception) = NULL;
6314: ZEND_VM_NEXT_OPCODE();
6315: }
1.1 misho 6316: }
6317:
1.1.1.2 misho 6318: static int ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6319: {
1.1.1.2 misho 6320: USE_OPLINE
1.1 misho 6321:
1.1.1.2 misho 6322:
6323: SAVE_OPLINE();
6324: if (IS_CONST==IS_VAR) {
6325: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 6326: }
1.1.1.2 misho 6327: is_equal_function(&EX_T(opline->result.var).tmp_var,
6328: opline->op1.zv,
6329: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 6330:
1.1.1.2 misho 6331: CHECK_EXCEPTION();
6332: ZEND_VM_NEXT_OPCODE();
6333: }
1.1 misho 6334:
1.1.1.2 misho 6335: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6336: {
6337: USE_OPLINE
6338:
6339: zval *expr_ptr;
6340:
6341: SAVE_OPLINE();
6342: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
6343: zval **expr_ptr_ptr = NULL;
6344:
6345: if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
6346: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
1.1 misho 6347: }
1.1.1.2 misho 6348: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
6349: expr_ptr = *expr_ptr_ptr;
6350: Z_ADDREF_P(expr_ptr);
1.1 misho 6351: } else {
1.1.1.2 misho 6352: expr_ptr=opline->op1.zv;
6353: if (0) { /* temporary variable */
6354: zval *new_expr;
1.1 misho 6355:
1.1.1.2 misho 6356: ALLOC_ZVAL(new_expr);
6357: INIT_PZVAL_COPY(new_expr, expr_ptr);
6358: expr_ptr = new_expr;
6359: } else if (IS_CONST == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
6360: zval *new_expr;
1.1 misho 6361:
1.1.1.2 misho 6362: ALLOC_ZVAL(new_expr);
6363: INIT_PZVAL_COPY(new_expr, expr_ptr);
6364: expr_ptr = new_expr;
6365: zendi_zval_copy_ctor(*expr_ptr);
6366: } else {
6367: Z_ADDREF_P(expr_ptr);
6368: }
6369: }
1.1 misho 6370:
1.1.1.2 misho 6371: if (IS_CV != IS_UNUSED) {
1.1 misho 6372:
1.1.1.2 misho 6373: zval *offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
6374: ulong hval;
6375:
6376: switch (Z_TYPE_P(offset)) {
6377: case IS_DOUBLE:
6378: hval = zend_dval_to_lval(Z_DVAL_P(offset));
6379: goto num_index;
6380: case IS_LONG:
6381: case IS_BOOL:
6382: hval = Z_LVAL_P(offset);
6383: num_index:
6384: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
6385: break;
6386: case IS_STRING:
6387: if (IS_CV == IS_CONST) {
6388: hval = Z_HASH_P(offset);
6389: } else {
6390: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
6391: if (IS_INTERNED(Z_STRVAL_P(offset))) {
6392: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 6393: } else {
1.1.1.2 misho 6394: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 6395: }
6396: }
1.1.1.2 misho 6397: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 6398: break;
1.1.1.2 misho 6399: case IS_NULL:
6400: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 6401: break;
1.1.1.2 misho 6402: default:
6403: zend_error(E_WARNING, "Illegal offset type");
6404: zval_ptr_dtor(&expr_ptr);
6405: /* do nothing */
1.1 misho 6406: break;
6407: }
1.1.1.2 misho 6408:
6409: } else {
6410: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 6411: }
1.1.1.2 misho 6412: if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && opline->extended_value) {
1.1 misho 6413:
1.1.1.2 misho 6414: } else {
1.1 misho 6415:
1.1.1.2 misho 6416: }
6417: CHECK_EXCEPTION();
6418: ZEND_VM_NEXT_OPCODE();
6419: }
1.1 misho 6420:
1.1.1.2 misho 6421: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6422: {
6423: USE_OPLINE
1.1 misho 6424:
1.1.1.2 misho 6425: array_init(&EX_T(opline->result.var).tmp_var);
6426: if (IS_CONST == IS_UNUSED) {
6427: ZEND_VM_NEXT_OPCODE();
6428: #if 0 || IS_CONST != IS_UNUSED
6429: } else {
6430: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
6431: #endif
6432: }
6433: }
1.1 misho 6434:
1.1.1.2 misho 6435: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6436: {
6437: USE_OPLINE
6438: zend_free_op free_op1;
1.1 misho 6439:
1.1.1.2 misho 6440: SAVE_OPLINE();
6441: bitwise_not_function(&EX_T(opline->result.var).tmp_var,
6442: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC) TSRMLS_CC);
6443: zval_dtor(free_op1.var);
6444: CHECK_EXCEPTION();
6445: ZEND_VM_NEXT_OPCODE();
6446: }
1.1 misho 6447:
1.1.1.2 misho 6448: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6449: {
6450: USE_OPLINE
6451: zend_free_op free_op1;
6452:
6453: SAVE_OPLINE();
6454: boolean_not_function(&EX_T(opline->result.var).tmp_var,
6455: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC) TSRMLS_CC);
6456: zval_dtor(free_op1.var);
6457: CHECK_EXCEPTION();
1.1 misho 6458: ZEND_VM_NEXT_OPCODE();
6459: }
6460:
1.1.1.2 misho 6461: static int ZEND_FASTCALL ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6462: {
1.1.1.2 misho 6463: USE_OPLINE
1.1 misho 6464: zend_free_op free_op1;
1.1.1.2 misho 6465: zval *z;
1.1 misho 6466:
1.1.1.2 misho 6467: SAVE_OPLINE();
6468: z = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6469:
1.1.1.3 misho 6470: if (IS_TMP_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
6471: INIT_PZVAL(z);
1.1 misho 6472: }
1.1.1.3 misho 6473: zend_print_variable(z);
1.1 misho 6474:
1.1.1.2 misho 6475: zval_dtor(free_op1.var);
6476: CHECK_EXCEPTION();
6477: ZEND_VM_NEXT_OPCODE();
6478: }
1.1 misho 6479:
1.1.1.2 misho 6480: static int ZEND_FASTCALL ZEND_PRINT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6481: {
6482: USE_OPLINE
1.1 misho 6483:
1.1.1.2 misho 6484: ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
6485: return ZEND_ECHO_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
6486: }
1.1 misho 6487:
1.1.1.2 misho 6488: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6489: {
6490: USE_OPLINE
6491: zend_free_op free_op1;
6492: zval *val;
6493: int ret;
1.1 misho 6494:
1.1.1.2 misho 6495: SAVE_OPLINE();
6496: val = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6497:
1.1.1.2 misho 6498: if (IS_TMP_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
6499: ret = Z_LVAL_P(val);
6500: } else {
6501: ret = i_zend_is_true(val);
6502: zval_dtor(free_op1.var);
6503: if (UNEXPECTED(EG(exception) != NULL)) {
6504: HANDLE_EXCEPTION();
1.1 misho 6505: }
6506: }
1.1.1.2 misho 6507: if (!ret) {
6508: #if DEBUG_ZEND>=2
6509: printf("Conditional jmp to %d\n", opline->op2.opline_num);
6510: #endif
6511: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
6512: ZEND_VM_CONTINUE();
1.1 misho 6513: }
1.1.1.2 misho 6514:
1.1 misho 6515: ZEND_VM_NEXT_OPCODE();
6516: }
6517:
1.1.1.2 misho 6518: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6519: {
1.1.1.2 misho 6520: USE_OPLINE
1.1 misho 6521: zend_free_op free_op1;
1.1.1.2 misho 6522: zval *val;
6523: int ret;
1.1 misho 6524:
1.1.1.2 misho 6525: SAVE_OPLINE();
6526: val = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6527:
1.1.1.2 misho 6528: if (IS_TMP_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
6529: ret = Z_LVAL_P(val);
1.1 misho 6530: } else {
1.1.1.2 misho 6531: ret = i_zend_is_true(val);
6532: zval_dtor(free_op1.var);
6533: if (UNEXPECTED(EG(exception) != NULL)) {
6534: HANDLE_EXCEPTION();
1.1 misho 6535: }
6536: }
1.1.1.2 misho 6537: if (ret) {
6538: #if DEBUG_ZEND>=2
6539: printf("Conditional jmp to %d\n", opline->op2.opline_num);
6540: #endif
6541: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
6542: ZEND_VM_CONTINUE();
6543: }
1.1 misho 6544:
1.1.1.2 misho 6545: ZEND_VM_NEXT_OPCODE();
6546: }
1.1 misho 6547:
1.1.1.2 misho 6548: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6549: {
6550: USE_OPLINE
6551: zend_free_op free_op1;
6552: zval *val;
6553: int retval;
1.1 misho 6554:
1.1.1.2 misho 6555: SAVE_OPLINE();
6556: val = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6557:
1.1.1.2 misho 6558: if (IS_TMP_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
6559: retval = Z_LVAL_P(val);
6560: } else {
6561: retval = i_zend_is_true(val);
6562: zval_dtor(free_op1.var);
6563: if (UNEXPECTED(EG(exception) != NULL)) {
6564: HANDLE_EXCEPTION();
1.1 misho 6565: }
6566: }
1.1.1.2 misho 6567: if (EXPECTED(retval != 0)) {
6568: #if DEBUG_ZEND>=2
6569: printf("Conditional jmp on true to %d\n", opline->extended_value);
6570: #endif
6571: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
6572: ZEND_VM_CONTINUE(); /* CHECK_ME */
6573: } else {
6574: #if DEBUG_ZEND>=2
6575: printf("Conditional jmp on false to %d\n", opline->op2.opline_num);
6576: #endif
6577: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.opline_num]);
6578: ZEND_VM_CONTINUE(); /* CHECK_ME */
6579: }
6580: }
1.1 misho 6581:
1.1.1.2 misho 6582: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6583: {
6584: USE_OPLINE
6585: zend_free_op free_op1;
6586: zval *val;
6587: int retval;
1.1 misho 6588:
1.1.1.2 misho 6589: SAVE_OPLINE();
6590: val = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6591:
1.1.1.2 misho 6592: if (IS_TMP_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
6593: retval = Z_LVAL_P(val);
6594: } else {
6595: retval = i_zend_is_true(val);
6596: zval_dtor(free_op1.var);
6597: if (UNEXPECTED(EG(exception) != NULL)) {
6598: HANDLE_EXCEPTION();
1.1 misho 6599: }
1.1.1.2 misho 6600: }
6601: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
6602: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
6603: if (!retval) {
6604: #if DEBUG_ZEND>=2
6605: printf("Conditional jmp to %d\n", opline->op2.opline_num);
6606: #endif
6607: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
6608: ZEND_VM_CONTINUE();
6609: }
6610: ZEND_VM_NEXT_OPCODE();
6611: }
1.1 misho 6612:
1.1.1.2 misho 6613: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6614: {
6615: USE_OPLINE
6616: zend_free_op free_op1;
6617: zval *val;
6618: int retval;
1.1 misho 6619:
1.1.1.2 misho 6620: SAVE_OPLINE();
6621: val = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6622:
1.1.1.2 misho 6623: if (IS_TMP_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
6624: retval = Z_LVAL_P(val);
1.1 misho 6625: } else {
1.1.1.2 misho 6626: retval = i_zend_is_true(val);
6627: zval_dtor(free_op1.var);
6628: if (UNEXPECTED(EG(exception) != NULL)) {
6629: HANDLE_EXCEPTION();
6630: }
1.1 misho 6631: }
1.1.1.2 misho 6632: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
6633: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
6634: if (retval) {
6635: #if DEBUG_ZEND>=2
6636: printf("Conditional jmp to %d\n", opline->op2.opline_num);
6637: #endif
6638: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
6639: ZEND_VM_CONTINUE();
6640: }
6641: ZEND_VM_NEXT_OPCODE();
6642: }
1.1 misho 6643:
1.1.1.2 misho 6644: static int ZEND_FASTCALL ZEND_FREE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6645: {
6646: USE_OPLINE
1.1 misho 6647:
1.1.1.2 misho 6648: SAVE_OPLINE();
6649: if (IS_TMP_VAR == IS_TMP_VAR) {
6650: zendi_zval_dtor(EX_T(opline->op1.var).tmp_var);
1.1 misho 6651: } else {
1.1.1.2 misho 6652: zval_ptr_dtor(&EX_T(opline->op1.var).var.ptr);
1.1 misho 6653: }
1.1.1.2 misho 6654: CHECK_EXCEPTION();
6655: ZEND_VM_NEXT_OPCODE();
1.1 misho 6656: }
6657:
1.1.1.2 misho 6658: static int ZEND_FASTCALL ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6659: {
1.1.1.2 misho 6660: USE_OPLINE
6661: zval *retval_ptr;
6662: zend_free_op free_op1;
1.1 misho 6663:
1.1.1.2 misho 6664: SAVE_OPLINE();
6665: retval_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6666:
1.1.1.2 misho 6667: if (!EG(return_value_ptr_ptr)) {
6668: if (IS_TMP_VAR == IS_TMP_VAR) {
6669: zval_dtor(free_op1.var);
6670: }
6671: } else if (!1) { /* Not a temp var */
6672: if (IS_TMP_VAR == IS_CONST ||
6673: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
6674: zval *ret;
1.1 misho 6675:
1.1.1.2 misho 6676: ALLOC_ZVAL(ret);
6677: INIT_PZVAL_COPY(ret, retval_ptr);
6678: zval_copy_ctor(ret);
6679: *EG(return_value_ptr_ptr) = ret;
6680: } else if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
6681: retval_ptr == &EG(uninitialized_zval)) {
6682: zval *ret;
1.1 misho 6683:
1.1.1.2 misho 6684: ALLOC_INIT_ZVAL(ret);
6685: *EG(return_value_ptr_ptr) = ret;
1.1 misho 6686: } else {
1.1.1.2 misho 6687: *EG(return_value_ptr_ptr) = retval_ptr;
6688: Z_ADDREF_P(retval_ptr);
1.1 misho 6689: }
1.1.1.2 misho 6690: } else {
6691: zval *ret;
1.1 misho 6692:
1.1.1.2 misho 6693: ALLOC_ZVAL(ret);
6694: INIT_PZVAL_COPY(ret, retval_ptr);
6695: *EG(return_value_ptr_ptr) = ret;
1.1 misho 6696: }
6697:
1.1.1.2 misho 6698: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
6699: }
1.1 misho 6700:
1.1.1.2 misho 6701: static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
6702: {
6703: USE_OPLINE
6704: zval *retval_ptr;
6705: zval **retval_ptr_ptr;
6706: zend_free_op free_op1;
6707:
6708: SAVE_OPLINE();
6709:
6710: do {
6711: if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
6712: /* Not supposed to happen, but we'll allow it */
6713: zend_error(E_NOTICE, "Only variable references should be returned by reference");
6714:
6715: retval_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
6716: if (!EG(return_value_ptr_ptr)) {
6717: if (IS_TMP_VAR == IS_TMP_VAR) {
6718: zval_dtor(free_op1.var);
6719: }
6720: } else if (!1) { /* Not a temp var */
6721: zval *ret;
6722:
6723: ALLOC_ZVAL(ret);
6724: INIT_PZVAL_COPY(ret, retval_ptr);
6725: zval_copy_ctor(ret);
6726: *EG(return_value_ptr_ptr) = ret;
1.1 misho 6727: } else {
1.1.1.2 misho 6728: zval *ret;
6729:
6730: ALLOC_ZVAL(ret);
6731: INIT_PZVAL_COPY(ret, retval_ptr);
6732: *EG(return_value_ptr_ptr) = ret;
1.1 misho 6733: }
6734: break;
1.1.1.2 misho 6735: }
1.1 misho 6736:
1.1.1.2 misho 6737: retval_ptr_ptr = NULL;
1.1 misho 6738:
1.1.1.2 misho 6739: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(retval_ptr_ptr == NULL)) {
6740: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
1.1 misho 6741: }
6742:
1.1.1.2 misho 6743: if (IS_TMP_VAR == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
6744: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
6745: EX_T(opline->op1.var).var.fcall_returned_reference) {
6746: } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
6747: zend_error(E_NOTICE, "Only variable references should be returned by reference");
6748: if (EG(return_value_ptr_ptr)) {
1.1.1.4 misho 6749: zval *ret;
6750:
6751: ALLOC_ZVAL(ret);
6752: INIT_PZVAL_COPY(ret, *retval_ptr_ptr);
6753: zval_copy_ctor(ret);
6754: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 6755: }
6756: break;
6757: }
6758: }
1.1 misho 6759:
1.1.1.2 misho 6760: if (EG(return_value_ptr_ptr)) {
6761: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
6762: Z_ADDREF_PP(retval_ptr_ptr);
1.1 misho 6763:
1.1.1.2 misho 6764: *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
6765: }
6766: } while (0);
1.1 misho 6767:
1.1.1.2 misho 6768: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 6769: }
6770:
1.1.1.2 misho 6771: static int ZEND_FASTCALL ZEND_THROW_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6772: {
1.1.1.2 misho 6773: USE_OPLINE
6774: zval *value;
6775: zval *exception;
1.1 misho 6776: zend_free_op free_op1;
6777:
1.1.1.2 misho 6778: SAVE_OPLINE();
6779: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
6780:
6781: if (IS_TMP_VAR == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
6782: zend_error_noreturn(E_ERROR, "Can only throw objects");
6783: }
6784: zend_exception_save(TSRMLS_C);
6785: /* Not sure if a complete copy is what we want here */
6786: ALLOC_ZVAL(exception);
6787: INIT_PZVAL_COPY(exception, value);
1.1 misho 6788: if (!1) {
1.1.1.2 misho 6789: zval_copy_ctor(exception);
1.1 misho 6790: }
6791:
1.1.1.2 misho 6792: zend_throw_exception_object(exception TSRMLS_CC);
6793: zend_exception_restore(TSRMLS_C);
6794:
6795: HANDLE_EXCEPTION();
1.1 misho 6796: }
6797:
1.1.1.2 misho 6798: static int ZEND_FASTCALL ZEND_SEND_VAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6799: {
1.1.1.2 misho 6800: USE_OPLINE
1.1 misho 6801:
1.1.1.2 misho 6802: SAVE_OPLINE();
6803: if (opline->extended_value==ZEND_DO_FCALL_BY_NAME
6804: && ARG_MUST_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
6805: zend_error_noreturn(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.opline_num);
1.1 misho 6806: }
1.1.1.2 misho 6807: {
6808: zval *valptr;
6809: zval *value;
6810: zend_free_op free_op1;
1.1 misho 6811:
1.1.1.2 misho 6812: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6813:
1.1.1.2 misho 6814: ALLOC_ZVAL(valptr);
6815: INIT_PZVAL_COPY(valptr, value);
6816: if (!1) {
6817: zval_copy_ctor(valptr);
6818: }
6819: zend_vm_stack_push(valptr TSRMLS_CC);
1.1 misho 6820:
1.1.1.2 misho 6821: }
6822: CHECK_EXCEPTION();
1.1 misho 6823: ZEND_VM_NEXT_OPCODE();
6824: }
6825:
1.1.1.2 misho 6826: static int ZEND_FASTCALL ZEND_BOOL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6827: {
1.1.1.2 misho 6828: USE_OPLINE
1.1 misho 6829: zend_free_op free_op1;
1.1.1.2 misho 6830: zval *retval = &EX_T(opline->result.var).tmp_var;
1.1 misho 6831:
1.1.1.2 misho 6832: SAVE_OPLINE();
6833: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
6834: ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC)));
1.1 misho 6835: zval_dtor(free_op1.var);
6836:
1.1.1.2 misho 6837: CHECK_EXCEPTION();
1.1 misho 6838: ZEND_VM_NEXT_OPCODE();
6839: }
6840:
1.1.1.2 misho 6841: static int ZEND_FASTCALL ZEND_CLONE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6842: {
1.1.1.2 misho 6843: USE_OPLINE
1.1 misho 6844: zend_free_op free_op1;
1.1.1.2 misho 6845: zval *obj;
6846: zend_class_entry *ce;
6847: zend_function *clone;
6848: zend_object_clone_obj_t clone_call;
1.1 misho 6849:
1.1.1.2 misho 6850: SAVE_OPLINE();
6851: obj = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6852:
1.1.1.2 misho 6853: if (IS_TMP_VAR == IS_CONST ||
6854: UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
6855: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
6856: }
1.1 misho 6857:
1.1.1.2 misho 6858: ce = Z_OBJCE_P(obj);
6859: clone = ce ? ce->clone : NULL;
6860: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
6861: if (UNEXPECTED(clone_call == NULL)) {
6862: if (ce) {
6863: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
6864: } else {
6865: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
6866: }
6867: }
1.1 misho 6868:
1.1.1.2 misho 6869: if (ce && clone) {
6870: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
6871: /* Ensure that if we're calling a private function, we're allowed to do so.
6872: */
6873: if (UNEXPECTED(ce != EG(scope))) {
6874: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
6875: }
6876: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
6877: /* Ensure that if we're calling a protected function, we're allowed to do so.
6878: */
1.1.1.3 misho 6879: if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
1.1.1.2 misho 6880: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
6881: }
6882: }
6883: }
1.1 misho 6884:
1.1.1.2 misho 6885: if (EXPECTED(EG(exception) == NULL)) {
6886: zval *retval;
1.1 misho 6887:
1.1.1.2 misho 6888: ALLOC_ZVAL(retval);
6889: Z_OBJVAL_P(retval) = clone_call(obj TSRMLS_CC);
6890: Z_TYPE_P(retval) = IS_OBJECT;
6891: Z_SET_REFCOUNT_P(retval, 1);
6892: Z_SET_ISREF_P(retval);
6893: if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
6894: zval_ptr_dtor(&retval);
6895: } else {
6896: AI_SET_PTR(&EX_T(opline->result.var), retval);
6897: }
6898: }
1.1 misho 6899:
1.1.1.2 misho 6900: CHECK_EXCEPTION();
1.1 misho 6901: ZEND_VM_NEXT_OPCODE();
6902: }
6903:
1.1.1.2 misho 6904: static int ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6905: {
1.1.1.2 misho 6906: USE_OPLINE
1.1 misho 6907: zend_free_op free_op1;
1.1.1.2 misho 6908: zval *expr;
6909: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 6910:
1.1.1.2 misho 6911: SAVE_OPLINE();
6912: expr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6913:
1.1.1.2 misho 6914: if (opline->extended_value != IS_STRING) {
6915: ZVAL_COPY_VALUE(result, expr);
6916: if (!1) {
6917: zendi_zval_copy_ctor(*result);
6918: }
6919: }
6920: switch (opline->extended_value) {
6921: case IS_NULL:
6922: convert_to_null(result);
6923: break;
6924: case IS_BOOL:
6925: convert_to_boolean(result);
6926: break;
6927: case IS_LONG:
6928: convert_to_long(result);
6929: break;
6930: case IS_DOUBLE:
6931: convert_to_double(result);
6932: break;
6933: case IS_STRING: {
6934: zval var_copy;
6935: int use_copy;
1.1 misho 6936:
1.1.1.2 misho 6937: zend_make_printable_zval(expr, &var_copy, &use_copy);
6938: if (use_copy) {
6939: ZVAL_COPY_VALUE(result, &var_copy);
6940: if (1) {
6941: zval_dtor(free_op1.var);
6942: }
6943: } else {
6944: ZVAL_COPY_VALUE(result, expr);
6945: if (!1) {
6946: zendi_zval_copy_ctor(*result);
6947: }
6948: }
6949: break;
6950: }
6951: case IS_ARRAY:
6952: convert_to_array(result);
6953: break;
6954: case IS_OBJECT:
6955: convert_to_object(result);
6956: break;
6957: }
1.1 misho 6958:
1.1.1.2 misho 6959: CHECK_EXCEPTION();
1.1 misho 6960: ZEND_VM_NEXT_OPCODE();
6961: }
6962:
1.1.1.2 misho 6963: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 6964: {
1.1.1.2 misho 6965: USE_OPLINE
6966: zend_op_array *new_op_array=NULL;
1.1 misho 6967: zend_free_op free_op1;
1.1.1.2 misho 6968: zval *inc_filename;
6969: zval *tmp_inc_filename = NULL;
6970: zend_bool failure_retval=0;
1.1 misho 6971:
1.1.1.2 misho 6972: SAVE_OPLINE();
6973: inc_filename = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 6974:
1.1.1.2 misho 6975: if (inc_filename->type!=IS_STRING) {
6976: MAKE_STD_ZVAL(tmp_inc_filename);
6977: ZVAL_COPY_VALUE(tmp_inc_filename, inc_filename);
6978: zval_copy_ctor(tmp_inc_filename);
6979: convert_to_string(tmp_inc_filename);
6980: inc_filename = tmp_inc_filename;
6981: }
1.1 misho 6982:
1.1.1.2 misho 6983: if (opline->extended_value != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
6984: if (opline->extended_value == ZEND_INCLUDE_ONCE || opline->extended_value == ZEND_INCLUDE) {
6985: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
6986: } else {
6987: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
6988: }
6989: } else {
6990: switch (opline->extended_value) {
6991: case ZEND_INCLUDE_ONCE:
6992: case ZEND_REQUIRE_ONCE: {
6993: zend_file_handle file_handle;
6994: char *resolved_path;
1.1 misho 6995:
1.1.1.2 misho 6996: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
6997: if (resolved_path) {
6998: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
6999: } else {
7000: resolved_path = Z_STRVAL_P(inc_filename);
7001: }
1.1 misho 7002:
1.1.1.2 misho 7003: if (failure_retval) {
7004: /* do nothing, file already included */
7005: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
1.1 misho 7006:
1.1.1.2 misho 7007: if (!file_handle.opened_path) {
7008: file_handle.opened_path = estrdup(resolved_path);
7009: }
1.1 misho 7010:
1.1.1.2 misho 7011: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
7012: new_op_array = zend_compile_file(&file_handle, (opline->extended_value==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
7013: zend_destroy_file_handle(&file_handle TSRMLS_CC);
7014: } else {
7015: zend_file_handle_dtor(&file_handle TSRMLS_CC);
7016: failure_retval=1;
7017: }
7018: } else {
7019: if (opline->extended_value == ZEND_INCLUDE_ONCE) {
7020: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
7021: } else {
7022: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
7023: }
7024: }
7025: if (resolved_path != Z_STRVAL_P(inc_filename)) {
7026: efree(resolved_path);
7027: }
7028: }
7029: break;
7030: case ZEND_INCLUDE:
7031: case ZEND_REQUIRE:
7032: new_op_array = compile_filename(opline->extended_value, inc_filename TSRMLS_CC);
7033: break;
7034: case ZEND_EVAL: {
7035: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
1.1 misho 7036:
1.1.1.2 misho 7037: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
7038: efree(eval_desc);
7039: }
7040: break;
7041: EMPTY_SWITCH_DEFAULT_CASE()
7042: }
7043: }
7044: if (tmp_inc_filename) {
7045: zval_ptr_dtor(&tmp_inc_filename);
7046: }
1.1 misho 7047: zval_dtor(free_op1.var);
1.1.1.2 misho 7048: if (UNEXPECTED(EG(exception) != NULL)) {
7049: HANDLE_EXCEPTION();
7050: } else if (EXPECTED(new_op_array != NULL)) {
7051: EX(original_return_value) = EG(return_value_ptr_ptr);
7052: EG(active_op_array) = new_op_array;
7053: if (RETURN_VALUE_USED(opline)) {
7054: EX_T(opline->result.var).var.ptr = NULL;
7055: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
7056: EG(return_value_ptr_ptr) = EX_T(opline->result.var).var.ptr_ptr;
7057: } else {
7058: EG(return_value_ptr_ptr) = NULL;
7059: }
1.1 misho 7060:
1.1.1.2 misho 7061: EX(current_object) = EX(object);
1.1 misho 7062:
1.1.1.2 misho 7063: EX(function_state).function = (zend_function *) new_op_array;
7064: EX(object) = NULL;
1.1 misho 7065:
1.1.1.2 misho 7066: if (!EG(active_symbol_table)) {
7067: zend_rebuild_symbol_table(TSRMLS_C);
7068: }
1.1 misho 7069:
1.1.1.2 misho 7070: if (EXPECTED(zend_execute == execute)) {
7071: ZEND_VM_ENTER();
7072: } else {
7073: zend_execute(new_op_array TSRMLS_CC);
7074: }
1.1 misho 7075:
1.1.1.2 misho 7076: EX(function_state).function = (zend_function *) EX(op_array);
7077: EX(object) = EX(current_object);
1.1 misho 7078:
1.1.1.2 misho 7079: EG(opline_ptr) = &EX(opline);
7080: EG(active_op_array) = EX(op_array);
7081: EG(return_value_ptr_ptr) = EX(original_return_value);
7082: destroy_op_array(new_op_array TSRMLS_CC);
7083: efree(new_op_array);
7084: if (UNEXPECTED(EG(exception) != NULL)) {
7085: zend_throw_exception_internal(NULL TSRMLS_CC);
7086: HANDLE_EXCEPTION();
7087: } else if (RETURN_VALUE_USED(opline)) {
7088: if (!EX_T(opline->result.var).var.ptr) { /* there was no return statement */
7089: zval *retval;
1.1 misho 7090:
1.1.1.2 misho 7091: ALLOC_ZVAL(retval);
7092: ZVAL_BOOL(retval, 1);
7093: INIT_PZVAL(retval);
7094: EX_T(opline->result.var).var.ptr = retval;
7095: }
7096: }
1.1 misho 7097:
1.1.1.2 misho 7098: } else if (RETURN_VALUE_USED(opline)) {
7099: zval *retval;
1.1 misho 7100:
1.1.1.2 misho 7101: ALLOC_ZVAL(retval);
7102: ZVAL_BOOL(retval, failure_retval);
7103: INIT_PZVAL(retval);
7104: AI_SET_PTR(&EX_T(opline->result.var), retval);
7105: }
1.1 misho 7106: ZEND_VM_NEXT_OPCODE();
7107: }
7108:
1.1.1.2 misho 7109: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7110: {
1.1.1.2 misho 7111: USE_OPLINE
1.1 misho 7112: zend_free_op free_op1;
1.1.1.2 misho 7113: zval *array_ptr, **array_ptr_ptr;
7114: HashTable *fe_ht;
7115: zend_object_iterator *iter = NULL;
7116: zend_class_entry *ce = NULL;
7117: zend_bool is_empty = 0;
1.1 misho 7118:
1.1.1.2 misho 7119: SAVE_OPLINE();
1.1 misho 7120:
1.1.1.2 misho 7121: if ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
7122: (opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
7123: array_ptr_ptr = NULL;
7124: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
7125: MAKE_STD_ZVAL(array_ptr);
7126: ZVAL_NULL(array_ptr);
7127: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
7128: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
7129: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
7130: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
7131: }
1.1 misho 7132:
1.1.1.2 misho 7133: ce = Z_OBJCE_PP(array_ptr_ptr);
7134: if (!ce || ce->get_iterator == NULL) {
7135: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
7136: Z_ADDREF_PP(array_ptr_ptr);
7137: }
7138: array_ptr = *array_ptr_ptr;
7139: } else {
7140: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
7141: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
7142: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
7143: Z_SET_ISREF_PP(array_ptr_ptr);
7144: }
7145: }
7146: array_ptr = *array_ptr_ptr;
7147: Z_ADDREF_P(array_ptr);
7148: }
7149: } else {
7150: array_ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
7151: if (1) { /* IS_TMP_VAR */
7152: zval *tmp;
1.1 misho 7153:
1.1.1.2 misho 7154: ALLOC_ZVAL(tmp);
7155: INIT_PZVAL_COPY(tmp, array_ptr);
7156: array_ptr = tmp;
7157: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
7158: ce = Z_OBJCE_P(array_ptr);
7159: if (ce && ce->get_iterator) {
7160: Z_DELREF_P(array_ptr);
7161: }
7162: }
7163: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
7164: ce = Z_OBJCE_P(array_ptr);
7165: if (!ce || !ce->get_iterator) {
7166: Z_ADDREF_P(array_ptr);
7167: }
7168: } else if (IS_TMP_VAR == IS_CONST ||
7169: ((IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) &&
7170: !Z_ISREF_P(array_ptr) &&
7171: Z_REFCOUNT_P(array_ptr) > 1)) {
7172: zval *tmp;
1.1 misho 7173:
1.1.1.2 misho 7174: ALLOC_ZVAL(tmp);
7175: INIT_PZVAL_COPY(tmp, array_ptr);
7176: zval_copy_ctor(tmp);
7177: array_ptr = tmp;
7178: } else {
7179: Z_ADDREF_P(array_ptr);
7180: }
7181: }
1.1 misho 7182:
1.1.1.2 misho 7183: if (ce && ce->get_iterator) {
7184: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
1.1 misho 7185:
1.1.1.2 misho 7186: if (iter && EXPECTED(EG(exception) == NULL)) {
7187: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
7188: } else {
1.1 misho 7189:
1.1.1.2 misho 7190: if (!EG(exception)) {
7191: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
7192: }
7193: zend_throw_exception_internal(NULL TSRMLS_CC);
7194: HANDLE_EXCEPTION();
7195: }
7196: }
1.1 misho 7197:
1.1.1.2 misho 7198: EX_T(opline->result.var).fe.ptr = array_ptr;
1.1 misho 7199:
1.1.1.2 misho 7200: if (iter) {
7201: iter->index = 0;
7202: if (iter->funcs->rewind) {
7203: iter->funcs->rewind(iter TSRMLS_CC);
7204: if (UNEXPECTED(EG(exception) != NULL)) {
7205: zval_ptr_dtor(&array_ptr);
1.1 misho 7206:
1.1.1.2 misho 7207: HANDLE_EXCEPTION();
7208: }
1.1 misho 7209: }
1.1.1.2 misho 7210: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
7211: if (UNEXPECTED(EG(exception) != NULL)) {
7212: zval_ptr_dtor(&array_ptr);
1.1 misho 7213:
1.1.1.2 misho 7214: HANDLE_EXCEPTION();
7215: }
7216: iter->index = -1; /* will be set to 0 before using next handler */
7217: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
7218: zend_hash_internal_pointer_reset(fe_ht);
7219: if (ce) {
7220: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
7221: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
7222: char *str_key;
7223: uint str_key_len;
7224: ulong int_key;
7225: zend_uchar key_type;
1.1 misho 7226:
1.1.1.2 misho 7227: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
7228: if (key_type != HASH_KEY_NON_EXISTANT &&
7229: (key_type == HASH_KEY_IS_LONG ||
7230: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
7231: break;
7232: }
7233: zend_hash_move_forward(fe_ht);
7234: }
7235: }
7236: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
7237: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.var).fe.fe_pos);
7238: } else {
7239: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
7240: is_empty = 1;
7241: }
1.1 misho 7242:
1.1.1.2 misho 7243: if (is_empty) {
7244: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
7245: } else {
7246: CHECK_EXCEPTION();
7247: ZEND_VM_NEXT_OPCODE();
1.1 misho 7248: }
7249: }
7250:
1.1.1.2 misho 7251: static int ZEND_FASTCALL ZEND_EXIT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7252: {
1.1.1.2 misho 7253: #if 0 || (IS_TMP_VAR != IS_UNUSED)
7254: USE_OPLINE
1.1 misho 7255:
1.1.1.2 misho 7256: SAVE_OPLINE();
7257: if (IS_TMP_VAR != IS_UNUSED) {
7258: zend_free_op free_op1;
7259: zval *ptr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7260:
1.1.1.2 misho 7261: if (Z_TYPE_P(ptr) == IS_LONG) {
7262: EG(exit_status) = Z_LVAL_P(ptr);
7263: } else {
7264: zend_print_variable(ptr);
7265: }
7266: zval_dtor(free_op1.var);
1.1 misho 7267: }
1.1.1.2 misho 7268: #endif
7269: zend_bailout();
7270: ZEND_VM_NEXT_OPCODE(); /* Never reached */
1.1 misho 7271: }
7272:
1.1.1.2 misho 7273: static int ZEND_FASTCALL ZEND_END_SILENCE_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7274: {
1.1.1.2 misho 7275: USE_OPLINE
7276: zval restored_error_reporting;
1.1 misho 7277:
1.1.1.2 misho 7278: SAVE_OPLINE();
7279: if (!EG(error_reporting) && Z_LVAL(EX_T(opline->op1.var).tmp_var) != 0) {
7280: Z_TYPE(restored_error_reporting) = IS_LONG;
7281: Z_LVAL(restored_error_reporting) = Z_LVAL(EX_T(opline->op1.var).tmp_var);
7282: EG(error_reporting) = Z_LVAL(restored_error_reporting);
7283: convert_to_string(&restored_error_reporting);
7284: if (EXPECTED(EG(error_reporting_ini_entry) != NULL)) {
7285: if (EXPECTED(EG(error_reporting_ini_entry)->modified &&
7286: EG(error_reporting_ini_entry)->value != EG(error_reporting_ini_entry)->orig_value)) {
7287: efree(EG(error_reporting_ini_entry)->value);
7288: }
7289: EG(error_reporting_ini_entry)->value = Z_STRVAL(restored_error_reporting);
7290: EG(error_reporting_ini_entry)->value_length = Z_STRLEN(restored_error_reporting);
7291: } else {
7292: zendi_zval_dtor(restored_error_reporting);
7293: }
1.1 misho 7294: }
1.1.1.2 misho 7295: if (EX(old_error_reporting) == &EX_T(opline->op1.var).tmp_var) {
7296: EX(old_error_reporting) = NULL;
7297: }
7298: CHECK_EXCEPTION();
1.1 misho 7299: ZEND_VM_NEXT_OPCODE();
7300: }
7301:
1.1.1.2 misho 7302: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7303: {
1.1.1.2 misho 7304: USE_OPLINE
1.1 misho 7305: zend_free_op free_op1;
1.1.1.2 misho 7306: zval *value;
1.1 misho 7307:
1.1.1.2 misho 7308: SAVE_OPLINE();
7309: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7310:
1.1.1.2 misho 7311: if (i_zend_is_true(value)) {
7312: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
7313: if (!1) {
7314: zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
1.1 misho 7315: }
7316:
1.1.1.2 misho 7317: #if DEBUG_ZEND>=2
7318: printf("Conditional jmp to %d\n", opline->op2.opline_num);
7319: #endif
7320: ZEND_VM_JMP(opline->op2.jmp_addr);
1.1 misho 7321: }
7322:
1.1.1.2 misho 7323: zval_dtor(free_op1.var);
7324: CHECK_EXCEPTION();
1.1 misho 7325: ZEND_VM_NEXT_OPCODE();
7326: }
7327:
1.1.1.2 misho 7328: static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7329: {
1.1.1.2 misho 7330: USE_OPLINE
1.1 misho 7331: zend_free_op free_op1;
1.1.1.2 misho 7332: zval *value, *ret;
1.1 misho 7333:
1.1.1.2 misho 7334: SAVE_OPLINE();
7335: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
7336:
7337: if (i_zend_is_true(value)) {
7338: if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
7339: Z_ADDREF_P(value);
7340: EX_T(opline->result.var).var.ptr = value;
7341: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 7342: } else {
1.1.1.2 misho 7343: ALLOC_ZVAL(ret);
7344: INIT_PZVAL_COPY(ret, value);
7345: EX_T(opline->result.var).var.ptr = ret;
7346: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
7347: if (!1) {
7348: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
7349: }
1.1 misho 7350: }
1.1.1.2 misho 7351:
7352: #if DEBUG_ZEND>=2
7353: printf("Conditional jmp to %d\n", opline->op2.opline_num);
7354: #endif
7355: ZEND_VM_JMP(opline->op2.jmp_addr);
1.1 misho 7356: }
1.1.1.2 misho 7357:
7358: zval_dtor(free_op1.var);
7359: CHECK_EXCEPTION();
1.1 misho 7360: ZEND_VM_NEXT_OPCODE();
7361: }
7362:
1.1.1.2 misho 7363: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7364: {
1.1.1.2 misho 7365: USE_OPLINE
1.1 misho 7366: zend_free_op free_op1;
1.1.1.2 misho 7367: zval *value;
1.1 misho 7368:
1.1.1.2 misho 7369: SAVE_OPLINE();
7370: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7371:
1.1.1.2 misho 7372: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
7373: if (!1) {
7374: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 7375: }
7376:
1.1.1.2 misho 7377: CHECK_EXCEPTION();
7378: ZEND_VM_NEXT_OPCODE();
7379: }
1.1 misho 7380:
1.1.1.2 misho 7381: static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7382: {
7383: USE_OPLINE
7384: zend_free_op free_op1;
7385: zval *value, *ret;
1.1 misho 7386:
1.1.1.2 misho 7387: SAVE_OPLINE();
7388: value = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7389:
1.1.1.2 misho 7390: if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
7391: Z_ADDREF_P(value);
7392: EX_T(opline->result.var).var.ptr = value;
7393: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 7394: } else {
1.1.1.2 misho 7395: ALLOC_ZVAL(ret);
7396: INIT_PZVAL_COPY(ret, value);
7397: EX_T(opline->result.var).var.ptr = ret;
7398: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
7399: if (!1) {
7400: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
7401: }
1.1 misho 7402: }
7403:
1.1.1.2 misho 7404: CHECK_EXCEPTION();
1.1 misho 7405: ZEND_VM_NEXT_OPCODE();
7406: }
7407:
1.1.1.2 misho 7408: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7409: {
1.1.1.2 misho 7410: USE_OPLINE
7411: zend_free_op free_op1;
7412: zval *expr;
7413: zend_bool result;
1.1 misho 7414:
1.1.1.2 misho 7415: SAVE_OPLINE();
7416: expr = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
7417:
7418: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
7419: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.var).class_entry TSRMLS_CC);
1.1 misho 7420: } else {
1.1.1.2 misho 7421: result = 0;
1.1 misho 7422: }
1.1.1.2 misho 7423: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result);
7424: zval_dtor(free_op1.var);
7425: CHECK_EXCEPTION();
7426: ZEND_VM_NEXT_OPCODE();
1.1 misho 7427: }
7428:
1.1.1.2 misho 7429: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7430: {
1.1.1.2 misho 7431: USE_OPLINE
7432: zend_free_op free_op1;
1.1 misho 7433:
1.1.1.2 misho 7434: SAVE_OPLINE();
7435: fast_add_function(&EX_T(opline->result.var).tmp_var,
7436: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7437: opline->op2.zv TSRMLS_CC);
1.1 misho 7438: zval_dtor(free_op1.var);
1.1.1.2 misho 7439:
7440: CHECK_EXCEPTION();
1.1 misho 7441: ZEND_VM_NEXT_OPCODE();
7442: }
7443:
1.1.1.2 misho 7444: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7445: {
1.1.1.2 misho 7446: USE_OPLINE
7447: zend_free_op free_op1;
1.1 misho 7448:
1.1.1.2 misho 7449: SAVE_OPLINE();
7450: fast_sub_function(&EX_T(opline->result.var).tmp_var,
7451: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7452: opline->op2.zv TSRMLS_CC);
1.1 misho 7453: zval_dtor(free_op1.var);
1.1.1.2 misho 7454:
7455: CHECK_EXCEPTION();
1.1 misho 7456: ZEND_VM_NEXT_OPCODE();
7457: }
7458:
1.1.1.2 misho 7459: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7460: {
1.1.1.2 misho 7461: USE_OPLINE
7462: zend_free_op free_op1;
1.1 misho 7463:
1.1.1.2 misho 7464: SAVE_OPLINE();
7465: fast_mul_function(&EX_T(opline->result.var).tmp_var,
7466: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7467: opline->op2.zv TSRMLS_CC);
1.1 misho 7468: zval_dtor(free_op1.var);
1.1.1.2 misho 7469:
7470: CHECK_EXCEPTION();
1.1 misho 7471: ZEND_VM_NEXT_OPCODE();
7472: }
7473:
1.1.1.2 misho 7474: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7475: {
1.1.1.2 misho 7476: USE_OPLINE
7477: zend_free_op free_op1;
1.1 misho 7478:
1.1.1.2 misho 7479: SAVE_OPLINE();
7480: fast_div_function(&EX_T(opline->result.var).tmp_var,
7481: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7482: opline->op2.zv TSRMLS_CC);
1.1 misho 7483: zval_dtor(free_op1.var);
1.1.1.2 misho 7484:
7485: CHECK_EXCEPTION();
1.1 misho 7486: ZEND_VM_NEXT_OPCODE();
7487: }
7488:
1.1.1.2 misho 7489: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7490: {
1.1.1.2 misho 7491: USE_OPLINE
7492: zend_free_op free_op1;
1.1 misho 7493:
1.1.1.2 misho 7494: SAVE_OPLINE();
7495: fast_mod_function(&EX_T(opline->result.var).tmp_var,
7496: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7497: opline->op2.zv TSRMLS_CC);
1.1 misho 7498: zval_dtor(free_op1.var);
1.1.1.2 misho 7499:
7500: CHECK_EXCEPTION();
1.1 misho 7501: ZEND_VM_NEXT_OPCODE();
7502: }
7503:
1.1.1.2 misho 7504: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7505: {
1.1.1.2 misho 7506: USE_OPLINE
7507: zend_free_op free_op1;
1.1 misho 7508:
1.1.1.2 misho 7509: SAVE_OPLINE();
7510: shift_left_function(&EX_T(opline->result.var).tmp_var,
7511: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7512: opline->op2.zv TSRMLS_CC);
1.1 misho 7513: zval_dtor(free_op1.var);
1.1.1.2 misho 7514:
7515: CHECK_EXCEPTION();
1.1 misho 7516: ZEND_VM_NEXT_OPCODE();
7517: }
7518:
1.1.1.2 misho 7519: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7520: {
1.1.1.2 misho 7521: USE_OPLINE
7522: zend_free_op free_op1;
1.1 misho 7523:
1.1.1.2 misho 7524: SAVE_OPLINE();
7525: shift_right_function(&EX_T(opline->result.var).tmp_var,
7526: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7527: opline->op2.zv TSRMLS_CC);
1.1 misho 7528: zval_dtor(free_op1.var);
1.1.1.2 misho 7529:
7530: CHECK_EXCEPTION();
1.1 misho 7531: ZEND_VM_NEXT_OPCODE();
7532: }
7533:
1.1.1.2 misho 7534: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7535: {
1.1.1.2 misho 7536: USE_OPLINE
7537: zend_free_op free_op1;
1.1 misho 7538:
1.1.1.2 misho 7539: SAVE_OPLINE();
7540: concat_function(&EX_T(opline->result.var).tmp_var,
7541: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7542: opline->op2.zv TSRMLS_CC);
1.1 misho 7543: zval_dtor(free_op1.var);
1.1.1.2 misho 7544:
7545: CHECK_EXCEPTION();
1.1 misho 7546: ZEND_VM_NEXT_OPCODE();
7547: }
7548:
1.1.1.2 misho 7549: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7550: {
1.1.1.2 misho 7551: USE_OPLINE
7552: zend_free_op free_op1;
1.1 misho 7553:
1.1.1.2 misho 7554: SAVE_OPLINE();
7555: is_identical_function(&EX_T(opline->result.var).tmp_var,
7556: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7557: opline->op2.zv TSRMLS_CC);
1.1 misho 7558: zval_dtor(free_op1.var);
1.1.1.2 misho 7559:
7560: CHECK_EXCEPTION();
1.1 misho 7561: ZEND_VM_NEXT_OPCODE();
7562: }
7563:
1.1.1.2 misho 7564: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7565: {
1.1.1.2 misho 7566: USE_OPLINE
7567: zend_free_op free_op1;
7568: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 7569:
1.1.1.2 misho 7570: SAVE_OPLINE();
1.1 misho 7571: is_identical_function(result,
1.1.1.2 misho 7572: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7573: opline->op2.zv TSRMLS_CC);
1.1 misho 7574: Z_LVAL_P(result) = !Z_LVAL_P(result);
7575: zval_dtor(free_op1.var);
1.1.1.2 misho 7576:
7577: CHECK_EXCEPTION();
1.1 misho 7578: ZEND_VM_NEXT_OPCODE();
7579: }
7580:
1.1.1.2 misho 7581: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7582: {
1.1.1.2 misho 7583: USE_OPLINE
7584: zend_free_op free_op1;
7585: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 7586:
1.1.1.2 misho 7587: SAVE_OPLINE();
7588: ZVAL_BOOL(result, fast_equal_function(result,
7589: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7590: opline->op2.zv TSRMLS_CC));
1.1 misho 7591: zval_dtor(free_op1.var);
1.1.1.2 misho 7592:
7593: CHECK_EXCEPTION();
1.1 misho 7594: ZEND_VM_NEXT_OPCODE();
7595: }
7596:
1.1.1.2 misho 7597: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7598: {
1.1.1.2 misho 7599: USE_OPLINE
7600: zend_free_op free_op1;
7601: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 7602:
1.1.1.2 misho 7603: SAVE_OPLINE();
7604: ZVAL_BOOL(result, fast_not_equal_function(result,
7605: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7606: opline->op2.zv TSRMLS_CC));
1.1 misho 7607: zval_dtor(free_op1.var);
1.1.1.2 misho 7608:
7609: CHECK_EXCEPTION();
1.1 misho 7610: ZEND_VM_NEXT_OPCODE();
7611: }
7612:
1.1.1.2 misho 7613: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7614: {
1.1.1.2 misho 7615: USE_OPLINE
7616: zend_free_op free_op1;
7617: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 7618:
1.1.1.2 misho 7619: SAVE_OPLINE();
7620: ZVAL_BOOL(result, fast_is_smaller_function(result,
7621: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7622: opline->op2.zv TSRMLS_CC));
1.1 misho 7623: zval_dtor(free_op1.var);
1.1.1.2 misho 7624:
7625: CHECK_EXCEPTION();
1.1 misho 7626: ZEND_VM_NEXT_OPCODE();
7627: }
7628:
1.1.1.2 misho 7629: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7630: {
1.1.1.2 misho 7631: USE_OPLINE
7632: zend_free_op free_op1;
7633: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 7634:
1.1.1.2 misho 7635: SAVE_OPLINE();
7636: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
7637: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7638: opline->op2.zv TSRMLS_CC));
1.1 misho 7639: zval_dtor(free_op1.var);
1.1.1.2 misho 7640:
7641: CHECK_EXCEPTION();
1.1 misho 7642: ZEND_VM_NEXT_OPCODE();
7643: }
7644:
1.1.1.2 misho 7645: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7646: {
1.1.1.2 misho 7647: USE_OPLINE
7648: zend_free_op free_op1;
1.1 misho 7649:
1.1.1.2 misho 7650: SAVE_OPLINE();
7651: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
7652: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7653: opline->op2.zv TSRMLS_CC);
1.1 misho 7654: zval_dtor(free_op1.var);
1.1.1.2 misho 7655:
7656: CHECK_EXCEPTION();
1.1 misho 7657: ZEND_VM_NEXT_OPCODE();
7658: }
7659:
1.1.1.2 misho 7660: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7661: {
1.1.1.2 misho 7662: USE_OPLINE
7663: zend_free_op free_op1;
1.1 misho 7664:
1.1.1.2 misho 7665: SAVE_OPLINE();
7666: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
7667: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7668: opline->op2.zv TSRMLS_CC);
1.1 misho 7669: zval_dtor(free_op1.var);
1.1.1.2 misho 7670:
7671: CHECK_EXCEPTION();
1.1 misho 7672: ZEND_VM_NEXT_OPCODE();
7673: }
7674:
1.1.1.2 misho 7675: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7676: {
1.1.1.2 misho 7677: USE_OPLINE
7678: zend_free_op free_op1;
1.1 misho 7679:
1.1.1.2 misho 7680: SAVE_OPLINE();
7681: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
7682: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7683: opline->op2.zv TSRMLS_CC);
1.1 misho 7684: zval_dtor(free_op1.var);
1.1.1.2 misho 7685:
7686: CHECK_EXCEPTION();
1.1 misho 7687: ZEND_VM_NEXT_OPCODE();
7688: }
7689:
1.1.1.2 misho 7690: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7691: {
1.1.1.2 misho 7692: USE_OPLINE
7693: zend_free_op free_op1;
1.1 misho 7694:
1.1.1.2 misho 7695: SAVE_OPLINE();
7696: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
7697: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
7698: opline->op2.zv TSRMLS_CC);
1.1 misho 7699: zval_dtor(free_op1.var);
1.1.1.2 misho 7700:
7701: CHECK_EXCEPTION();
1.1 misho 7702: ZEND_VM_NEXT_OPCODE();
7703: }
7704:
1.1.1.2 misho 7705: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7706: {
1.1.1.2 misho 7707: USE_OPLINE
7708: zend_free_op free_op1;
7709: zval *varname;
7710: zval **retval;
7711: zval tmp_varname;
7712: HashTable *target_symbol_table;
7713: ulong hash_value;
1.1 misho 7714:
1.1.1.2 misho 7715: SAVE_OPLINE();
7716: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7717:
1.1.1.2 misho 7718: if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
7719: ZVAL_COPY_VALUE(&tmp_varname, varname);
7720: zval_copy_ctor(&tmp_varname);
7721: Z_SET_REFCOUNT(tmp_varname, 1);
7722: Z_UNSET_ISREF(tmp_varname);
7723: convert_to_string(&tmp_varname);
7724: varname = &tmp_varname;
1.1 misho 7725: }
7726:
1.1.1.2 misho 7727: if (IS_CONST != IS_UNUSED) {
7728: zend_class_entry *ce;
1.1 misho 7729:
1.1.1.2 misho 7730: if (IS_CONST == IS_CONST) {
7731: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
7732: ce = CACHED_PTR(opline->op2.literal->cache_slot);
7733: } else {
7734: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
7735: if (UNEXPECTED(ce == NULL)) {
7736: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
7737: zval_dtor(&tmp_varname);
7738: }
7739: zval_dtor(free_op1.var);
7740: CHECK_EXCEPTION();
7741: ZEND_VM_NEXT_OPCODE();
7742: }
7743: CACHE_PTR(opline->op2.literal->cache_slot, ce);
7744: }
7745: } else {
7746: ce = EX_T(opline->op2.var).class_entry;
7747: }
7748: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
7749: zval_dtor(free_op1.var);
7750: } else {
7751: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
7752: /*
7753: if (!target_symbol_table) {
7754: CHECK_EXCEPTION();
7755: ZEND_VM_NEXT_OPCODE();
7756: }
7757: */
7758: if (IS_TMP_VAR == IS_CONST) {
7759: hash_value = Z_HASH_P(varname);
7760: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
7761: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
7762: } else {
7763: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
1.1 misho 7764: }
7765:
1.1.1.2 misho 7766: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
7767: switch (type) {
7768: case BP_VAR_R:
7769: case BP_VAR_UNSET:
7770: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
7771: /* break missing intentionally */
7772: case BP_VAR_IS:
7773: retval = &EG(uninitialized_zval_ptr);
7774: break;
7775: case BP_VAR_RW:
7776: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
7777: /* break missing intentionally */
7778: case BP_VAR_W:
7779: Z_ADDREF_P(&EG(uninitialized_zval));
7780: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
7781: break;
7782: EMPTY_SWITCH_DEFAULT_CASE()
7783: }
7784: }
7785: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
7786: case ZEND_FETCH_GLOBAL:
7787: if (IS_TMP_VAR != IS_TMP_VAR) {
7788: zval_dtor(free_op1.var);
7789: }
7790: break;
7791: case ZEND_FETCH_LOCAL:
7792: zval_dtor(free_op1.var);
7793: break;
7794: case ZEND_FETCH_STATIC:
7795: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
7796: break;
7797: case ZEND_FETCH_GLOBAL_LOCK:
7798: if (IS_TMP_VAR == IS_VAR && !free_op1.var) {
7799: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
7800: }
7801: break;
7802: }
1.1 misho 7803: }
7804:
1.1.1.2 misho 7805:
7806: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
7807: zval_dtor(&tmp_varname);
7808: }
7809: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
7810: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
7811: }
7812: PZVAL_LOCK(*retval);
7813: switch (type) {
7814: case BP_VAR_R:
7815: case BP_VAR_IS:
7816: AI_SET_PTR(&EX_T(opline->result.var), *retval);
7817: break;
7818: case BP_VAR_UNSET: {
7819: zend_free_op free_res;
7820:
7821: PZVAL_UNLOCK(*retval, &free_res);
7822: if (retval != &EG(uninitialized_zval_ptr)) {
7823: SEPARATE_ZVAL_IF_NOT_REF(retval);
7824: }
7825: PZVAL_LOCK(*retval);
7826: FREE_OP_VAR_PTR(free_res);
7827: }
7828: /* break missing intentionally */
7829: default:
7830: EX_T(opline->result.var).var.ptr_ptr = retval;
7831: break;
7832: }
7833: CHECK_EXCEPTION();
1.1 misho 7834: ZEND_VM_NEXT_OPCODE();
7835: }
7836:
1.1.1.2 misho 7837: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7838: {
1.1.1.2 misho 7839: return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7840: }
1.1 misho 7841:
1.1.1.2 misho 7842: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7843: {
7844: return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7845: }
1.1 misho 7846:
1.1.1.2 misho 7847: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7848: {
7849: return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7850: }
1.1 misho 7851:
1.1.1.2 misho 7852: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7853: {
7854: USE_OPLINE
1.1 misho 7855:
1.1.1.2 misho 7856: return zend_fetch_var_address_helper_SPEC_TMP_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7857: }
1.1 misho 7858:
1.1.1.2 misho 7859: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7860: {
7861: return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7862: }
1.1 misho 7863:
1.1.1.2 misho 7864: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7865: {
7866: return zend_fetch_var_address_helper_SPEC_TMP_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
7867: }
1.1 misho 7868:
1.1.1.2 misho 7869: static int ZEND_FASTCALL ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7870: {
7871: USE_OPLINE
7872: zend_free_op free_op1;
7873: zval *container;
1.1 misho 7874:
1.1.1.2 misho 7875: SAVE_OPLINE();
7876: container = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 7877:
1.1.1.2 misho 7878: if (UNEXPECTED(Z_TYPE_P(container) != IS_ARRAY)) {
7879: PZVAL_LOCK(&EG(uninitialized_zval));
7880: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 7881: } else {
7882:
1.1.1.2 misho 7883: zval *value = *zend_fetch_dimension_address_inner(Z_ARRVAL_P(container), opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
7884:
7885: PZVAL_LOCK(value);
7886: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 7887:
1.1.1.2 misho 7888: }
7889: CHECK_EXCEPTION();
1.1 misho 7890: ZEND_VM_NEXT_OPCODE();
7891: }
7892:
1.1.1.2 misho 7893: static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7894: {
1.1.1.2 misho 7895: USE_OPLINE
7896: zval *str = &EX_T(opline->result.var).tmp_var;
1.1 misho 7897:
1.1.1.2 misho 7898: SAVE_OPLINE();
1.1 misho 7899:
1.1.1.2 misho 7900: if (IS_TMP_VAR == IS_UNUSED) {
7901: /* Initialize for erealloc in add_char_to_string */
7902: Z_STRVAL_P(str) = NULL;
7903: Z_STRLEN_P(str) = 0;
7904: Z_TYPE_P(str) = IS_STRING;
7905:
7906: INIT_PZVAL(str);
1.1 misho 7907: }
1.1.1.2 misho 7908:
7909: add_char_to_string(str, str, opline->op2.zv);
7910:
7911: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
7912: /*CHECK_EXCEPTION();*/
1.1 misho 7913: ZEND_VM_NEXT_OPCODE();
7914: }
7915:
1.1.1.2 misho 7916: static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 7917: {
1.1.1.2 misho 7918: USE_OPLINE
7919: zval *str = &EX_T(opline->result.var).tmp_var;
1.1 misho 7920:
1.1.1.2 misho 7921: SAVE_OPLINE();
1.1 misho 7922:
1.1.1.2 misho 7923: if (IS_TMP_VAR == IS_UNUSED) {
7924: /* Initialize for erealloc in add_string_to_string */
7925: Z_STRVAL_P(str) = NULL;
7926: Z_STRLEN_P(str) = 0;
7927: Z_TYPE_P(str) = IS_STRING;
7928:
7929: INIT_PZVAL(str);
7930: }
7931:
7932: add_string_to_string(str, str, opline->op2.zv);
7933:
7934: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
7935: /*CHECK_EXCEPTION();*/
7936: ZEND_VM_NEXT_OPCODE();
7937: }
7938:
7939: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
7940: {
7941: USE_OPLINE
7942: zval *function_name;
7943: char *function_name_strval;
7944: int function_name_strlen;
7945: zend_free_op free_op1;
7946:
7947: SAVE_OPLINE();
7948: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
7949:
7950: function_name = opline->op2.zv;
7951:
7952: if (IS_CONST != IS_CONST &&
7953: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
7954: zend_error_noreturn(E_ERROR, "Method name must be a string");
7955: }
7956:
7957: function_name_strval = Z_STRVAL_P(function_name);
7958: function_name_strlen = Z_STRLEN_P(function_name);
7959:
7960: EX(object) = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
7961:
7962: if (EXPECTED(EX(object) != NULL) &&
7963: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
7964: EX(called_scope) = Z_OBJCE_P(EX(object));
7965:
7966: if (IS_CONST != IS_CONST ||
7967: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
7968: zval *object = EX(object);
7969:
7970: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
7971: zend_error_noreturn(E_ERROR, "Object does not support method calls");
7972: }
7973:
7974: /* First, locate the function. */
7975: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
7976: if (UNEXPECTED(EX(fbc) == NULL)) {
7977: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
7978: }
7979: if (IS_CONST == IS_CONST &&
7980: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
7981: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
7982: EXPECTED(EX(object) == object)) {
7983: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
7984: }
7985: }
1.1 misho 7986: } else {
1.1.1.2 misho 7987: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
7988: }
7989:
7990: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
7991: EX(object) = NULL;
7992: } else {
7993: if (!PZVAL_IS_REF(EX(object))) {
7994: Z_ADDREF_P(EX(object)); /* For $this pointer */
7995: } else {
7996: zval *this_ptr;
7997: ALLOC_ZVAL(this_ptr);
7998: INIT_PZVAL_COPY(this_ptr, EX(object));
7999: zval_copy_ctor(this_ptr);
8000: EX(object) = this_ptr;
8001: }
1.1 misho 8002: }
8003:
8004:
1.1.1.2 misho 8005: CHECK_EXCEPTION();
8006: ZEND_VM_NEXT_OPCODE();
8007: }
8008:
8009: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8010: {
8011: USE_OPLINE
8012: zend_free_op free_op1;
8013:
8014: SAVE_OPLINE();
8015: if (IS_TMP_VAR==IS_VAR) {
8016: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
8017: }
8018: is_equal_function(&EX_T(opline->result.var).tmp_var,
8019: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8020: opline->op2.zv TSRMLS_CC);
8021:
8022: CHECK_EXCEPTION();
8023: ZEND_VM_NEXT_OPCODE();
8024: }
8025:
8026: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8027: {
8028: USE_OPLINE
8029: zend_free_op free_op1;
8030: zval *expr_ptr;
8031:
8032: SAVE_OPLINE();
8033: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
8034: zval **expr_ptr_ptr = NULL;
8035:
8036: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
8037: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
8038: }
8039: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
8040: expr_ptr = *expr_ptr_ptr;
8041: Z_ADDREF_P(expr_ptr);
8042: } else {
8043: expr_ptr=_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
8044: if (1) { /* temporary variable */
8045: zval *new_expr;
8046:
8047: ALLOC_ZVAL(new_expr);
8048: INIT_PZVAL_COPY(new_expr, expr_ptr);
8049: expr_ptr = new_expr;
8050: } else if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 8051: zval *new_expr;
8052:
8053: ALLOC_ZVAL(new_expr);
8054: INIT_PZVAL_COPY(new_expr, expr_ptr);
8055: expr_ptr = new_expr;
8056: zendi_zval_copy_ctor(*expr_ptr);
8057: } else {
8058: Z_ADDREF_P(expr_ptr);
8059: }
8060: }
1.1.1.2 misho 8061:
8062: if (IS_CONST != IS_UNUSED) {
8063:
8064: zval *offset = opline->op2.zv;
8065: ulong hval;
8066:
1.1 misho 8067: switch (Z_TYPE_P(offset)) {
8068: case IS_DOUBLE:
1.1.1.2 misho 8069: hval = zend_dval_to_lval(Z_DVAL_P(offset));
8070: goto num_index;
1.1 misho 8071: case IS_LONG:
8072: case IS_BOOL:
1.1.1.2 misho 8073: hval = Z_LVAL_P(offset);
8074: num_index:
8075: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 8076: break;
8077: case IS_STRING:
1.1.1.2 misho 8078: if (IS_CONST == IS_CONST) {
8079: hval = Z_HASH_P(offset);
8080: } else {
8081: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
8082: if (IS_INTERNED(Z_STRVAL_P(offset))) {
8083: hval = INTERNED_HASH(Z_STRVAL_P(offset));
8084: } else {
8085: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
8086: }
8087: }
8088: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 8089: break;
8090: case IS_NULL:
1.1.1.2 misho 8091: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 8092: break;
8093: default:
8094: zend_error(E_WARNING, "Illegal offset type");
8095: zval_ptr_dtor(&expr_ptr);
8096: /* do nothing */
8097: break;
8098: }
1.1.1.2 misho 8099:
1.1 misho 8100: } else {
1.1.1.2 misho 8101: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 8102: }
1.1.1.2 misho 8103: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
1.1 misho 8104:
8105: } else {
8106:
8107: }
1.1.1.2 misho 8108: CHECK_EXCEPTION();
1.1 misho 8109: ZEND_VM_NEXT_OPCODE();
8110: }
8111:
1.1.1.2 misho 8112: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8113: {
1.1.1.2 misho 8114: USE_OPLINE
1.1 misho 8115:
1.1.1.2 misho 8116: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 8117: if (IS_TMP_VAR == IS_UNUSED) {
8118: ZEND_VM_NEXT_OPCODE();
8119: #if 0 || IS_TMP_VAR != IS_UNUSED
8120: } else {
1.1.1.2 misho 8121: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 8122: #endif
8123: }
8124: }
8125:
1.1.1.2 misho 8126: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8127: {
1.1.1.2 misho 8128: USE_OPLINE
8129: zval tmp, *varname;
8130: HashTable *target_symbol_table;
8131: zend_free_op free_op1;
8132:
8133: SAVE_OPLINE();
8134: if (IS_TMP_VAR == IS_CV &&
8135: IS_CONST == IS_UNUSED &&
8136: (opline->extended_value & ZEND_QUICK_SET)) {
8137: if (EG(active_symbol_table)) {
8138: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
8139:
8140: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
8141: EX_CV(opline->op1.var) = NULL;
8142: } else if (EX_CV(opline->op1.var)) {
8143: zval_ptr_dtor(EX_CV(opline->op1.var));
8144: EX_CV(opline->op1.var) = NULL;
8145: }
8146: CHECK_EXCEPTION();
8147: ZEND_VM_NEXT_OPCODE();
8148: }
8149:
8150: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
8151:
8152: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
8153: ZVAL_COPY_VALUE(&tmp, varname);
8154: zval_copy_ctor(&tmp);
8155: convert_to_string(&tmp);
8156: varname = &tmp;
8157: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
8158: Z_ADDREF_P(varname);
8159: }
8160:
8161: if (IS_CONST != IS_UNUSED) {
8162: zend_class_entry *ce;
8163:
8164: if (IS_CONST == IS_CONST) {
8165: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
8166: ce = CACHED_PTR(opline->op2.literal->cache_slot);
8167: } else {
8168: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 8169: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 8170: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
8171: zval_dtor(&tmp);
8172: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
8173: zval_ptr_dtor(&varname);
8174: }
8175: zval_dtor(free_op1.var);
1.1.1.4 misho 8176: HANDLE_EXCEPTION();
8177: }
8178: if (UNEXPECTED(ce == NULL)) {
8179: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 8180: }
8181: CACHE_PTR(opline->op2.literal->cache_slot, ce);
8182: }
8183: } else {
8184: ce = EX_T(opline->op2.var).class_entry;
8185: }
8186: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
8187: } else {
8188: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
8189:
8190: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
8191: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
8192: }
1.1 misho 8193:
1.1.1.2 misho 8194: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
8195: zval_dtor(&tmp);
8196: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
8197: zval_ptr_dtor(&varname);
8198: }
1.1 misho 8199: zval_dtor(free_op1.var);
1.1.1.2 misho 8200: CHECK_EXCEPTION();
1.1 misho 8201: ZEND_VM_NEXT_OPCODE();
8202: }
8203:
1.1.1.2 misho 8204: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8205: {
1.1.1.2 misho 8206: USE_OPLINE
8207: zval **value;
8208: zend_bool isset = 1;
1.1 misho 8209:
1.1.1.2 misho 8210: SAVE_OPLINE();
8211: if (IS_TMP_VAR == IS_CV &&
8212: IS_CONST == IS_UNUSED &&
8213: (opline->extended_value & ZEND_QUICK_SET)) {
8214: if (EX_CV(opline->op1.var)) {
8215: value = EX_CV(opline->op1.var);
8216: } else if (EG(active_symbol_table)) {
8217: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
8218:
8219: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
8220: isset = 0;
8221: }
8222: } else {
8223: isset = 0;
8224: }
8225: } else {
8226: HashTable *target_symbol_table;
8227: zend_free_op free_op1;
8228: zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
8229:
8230: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
8231: ZVAL_COPY_VALUE(&tmp, varname);
8232: zval_copy_ctor(&tmp);
8233: convert_to_string(&tmp);
8234: varname = &tmp;
8235: }
8236:
8237: if (IS_CONST != IS_UNUSED) {
8238: zend_class_entry *ce;
8239:
8240: if (IS_CONST == IS_CONST) {
8241: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
8242: ce = CACHED_PTR(opline->op2.literal->cache_slot);
8243: } else {
8244: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
8245: if (UNEXPECTED(ce == NULL)) {
8246: CHECK_EXCEPTION();
8247: ZEND_VM_NEXT_OPCODE();
8248: }
8249: CACHE_PTR(opline->op2.literal->cache_slot, ce);
8250: }
8251: } else {
8252: ce = EX_T(opline->op2.var).class_entry;
8253: }
8254: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
8255: if (!value) {
8256: isset = 0;
8257: }
8258: } else {
8259: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
8260: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
8261: isset = 0;
8262: }
8263: }
8264:
8265: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
8266: zval_dtor(&tmp);
8267: }
8268: zval_dtor(free_op1.var);
8269: }
8270:
8271: if (opline->extended_value & ZEND_ISSET) {
8272: if (isset && Z_TYPE_PP(value) != IS_NULL) {
8273: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
8274: } else {
8275: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
8276: }
8277: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
8278: if (!isset || !i_zend_is_true(*value)) {
8279: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
8280: } else {
8281: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
8282: }
8283: }
8284:
8285: CHECK_EXCEPTION();
1.1 misho 8286: ZEND_VM_NEXT_OPCODE();
8287: }
8288:
1.1.1.2 misho 8289: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8290: {
1.1.1.2 misho 8291: USE_OPLINE
1.1 misho 8292: zend_free_op free_op1, free_op2;
8293:
1.1.1.2 misho 8294: SAVE_OPLINE();
8295: fast_add_function(&EX_T(opline->result.var).tmp_var,
8296: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8297: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8298: zval_dtor(free_op1.var);
1.1.1.2 misho 8299: zval_dtor(free_op2.var);
8300: CHECK_EXCEPTION();
1.1 misho 8301: ZEND_VM_NEXT_OPCODE();
8302: }
8303:
1.1.1.2 misho 8304: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8305: {
1.1.1.2 misho 8306: USE_OPLINE
1.1 misho 8307: zend_free_op free_op1, free_op2;
8308:
1.1.1.2 misho 8309: SAVE_OPLINE();
8310: fast_sub_function(&EX_T(opline->result.var).tmp_var,
8311: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8312: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8313: zval_dtor(free_op1.var);
1.1.1.2 misho 8314: zval_dtor(free_op2.var);
8315: CHECK_EXCEPTION();
1.1 misho 8316: ZEND_VM_NEXT_OPCODE();
8317: }
8318:
1.1.1.2 misho 8319: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8320: {
1.1.1.2 misho 8321: USE_OPLINE
1.1 misho 8322: zend_free_op free_op1, free_op2;
8323:
1.1.1.2 misho 8324: SAVE_OPLINE();
8325: fast_mul_function(&EX_T(opline->result.var).tmp_var,
8326: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8327: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8328: zval_dtor(free_op1.var);
1.1.1.2 misho 8329: zval_dtor(free_op2.var);
8330: CHECK_EXCEPTION();
1.1 misho 8331: ZEND_VM_NEXT_OPCODE();
8332: }
8333:
1.1.1.2 misho 8334: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8335: {
1.1.1.2 misho 8336: USE_OPLINE
1.1 misho 8337: zend_free_op free_op1, free_op2;
8338:
1.1.1.2 misho 8339: SAVE_OPLINE();
8340: fast_div_function(&EX_T(opline->result.var).tmp_var,
8341: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8342: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8343: zval_dtor(free_op1.var);
1.1.1.2 misho 8344: zval_dtor(free_op2.var);
8345: CHECK_EXCEPTION();
1.1 misho 8346: ZEND_VM_NEXT_OPCODE();
8347: }
8348:
1.1.1.2 misho 8349: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8350: {
1.1.1.2 misho 8351: USE_OPLINE
1.1 misho 8352: zend_free_op free_op1, free_op2;
8353:
1.1.1.2 misho 8354: SAVE_OPLINE();
8355: fast_mod_function(&EX_T(opline->result.var).tmp_var,
8356: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8357: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8358: zval_dtor(free_op1.var);
1.1.1.2 misho 8359: zval_dtor(free_op2.var);
8360: CHECK_EXCEPTION();
1.1 misho 8361: ZEND_VM_NEXT_OPCODE();
8362: }
8363:
1.1.1.2 misho 8364: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8365: {
1.1.1.2 misho 8366: USE_OPLINE
1.1 misho 8367: zend_free_op free_op1, free_op2;
8368:
1.1.1.2 misho 8369: SAVE_OPLINE();
8370: shift_left_function(&EX_T(opline->result.var).tmp_var,
8371: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8372: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8373: zval_dtor(free_op1.var);
1.1.1.2 misho 8374: zval_dtor(free_op2.var);
8375: CHECK_EXCEPTION();
1.1 misho 8376: ZEND_VM_NEXT_OPCODE();
8377: }
8378:
1.1.1.2 misho 8379: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8380: {
1.1.1.2 misho 8381: USE_OPLINE
1.1 misho 8382: zend_free_op free_op1, free_op2;
8383:
1.1.1.2 misho 8384: SAVE_OPLINE();
8385: shift_right_function(&EX_T(opline->result.var).tmp_var,
8386: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8387: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8388: zval_dtor(free_op1.var);
1.1.1.2 misho 8389: zval_dtor(free_op2.var);
8390: CHECK_EXCEPTION();
1.1 misho 8391: ZEND_VM_NEXT_OPCODE();
8392: }
8393:
1.1.1.2 misho 8394: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8395: {
1.1.1.2 misho 8396: USE_OPLINE
1.1 misho 8397: zend_free_op free_op1, free_op2;
8398:
1.1.1.2 misho 8399: SAVE_OPLINE();
8400: concat_function(&EX_T(opline->result.var).tmp_var,
8401: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8402: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8403: zval_dtor(free_op1.var);
1.1.1.2 misho 8404: zval_dtor(free_op2.var);
8405: CHECK_EXCEPTION();
1.1 misho 8406: ZEND_VM_NEXT_OPCODE();
8407: }
8408:
1.1.1.2 misho 8409: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8410: {
1.1.1.2 misho 8411: USE_OPLINE
1.1 misho 8412: zend_free_op free_op1, free_op2;
8413:
1.1.1.2 misho 8414: SAVE_OPLINE();
8415: is_identical_function(&EX_T(opline->result.var).tmp_var,
8416: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8417: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8418: zval_dtor(free_op1.var);
1.1.1.2 misho 8419: zval_dtor(free_op2.var);
8420: CHECK_EXCEPTION();
1.1 misho 8421: ZEND_VM_NEXT_OPCODE();
8422: }
8423:
1.1.1.2 misho 8424: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8425: {
1.1.1.2 misho 8426: USE_OPLINE
1.1 misho 8427: zend_free_op free_op1, free_op2;
1.1.1.2 misho 8428: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 8429:
1.1.1.2 misho 8430: SAVE_OPLINE();
8431: is_identical_function(result,
8432: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8433: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8434: Z_LVAL_P(result) = !Z_LVAL_P(result);
1.1 misho 8435: zval_dtor(free_op1.var);
1.1.1.2 misho 8436: zval_dtor(free_op2.var);
8437: CHECK_EXCEPTION();
1.1 misho 8438: ZEND_VM_NEXT_OPCODE();
8439: }
8440:
1.1.1.2 misho 8441: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8442: {
1.1.1.2 misho 8443: USE_OPLINE
1.1 misho 8444: zend_free_op free_op1, free_op2;
1.1.1.2 misho 8445: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 8446:
1.1.1.2 misho 8447: SAVE_OPLINE();
8448: ZVAL_BOOL(result, fast_equal_function(result,
8449: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8450: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 8451: zval_dtor(free_op1.var);
1.1.1.2 misho 8452: zval_dtor(free_op2.var);
8453: CHECK_EXCEPTION();
1.1 misho 8454: ZEND_VM_NEXT_OPCODE();
8455: }
8456:
1.1.1.2 misho 8457: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8458: {
1.1.1.2 misho 8459: USE_OPLINE
1.1 misho 8460: zend_free_op free_op1, free_op2;
1.1.1.2 misho 8461: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 8462:
1.1.1.2 misho 8463: SAVE_OPLINE();
8464: ZVAL_BOOL(result, fast_not_equal_function(result,
8465: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8466: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 8467: zval_dtor(free_op1.var);
1.1.1.2 misho 8468: zval_dtor(free_op2.var);
8469: CHECK_EXCEPTION();
1.1 misho 8470: ZEND_VM_NEXT_OPCODE();
8471: }
8472:
1.1.1.2 misho 8473: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8474: {
1.1.1.2 misho 8475: USE_OPLINE
1.1 misho 8476: zend_free_op free_op1, free_op2;
1.1.1.2 misho 8477: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 8478:
1.1.1.2 misho 8479: SAVE_OPLINE();
8480: ZVAL_BOOL(result, fast_is_smaller_function(result,
8481: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8482: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 8483: zval_dtor(free_op1.var);
1.1.1.2 misho 8484: zval_dtor(free_op2.var);
8485: CHECK_EXCEPTION();
1.1 misho 8486: ZEND_VM_NEXT_OPCODE();
8487: }
8488:
1.1.1.2 misho 8489: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8490: {
1.1.1.2 misho 8491: USE_OPLINE
1.1 misho 8492: zend_free_op free_op1, free_op2;
1.1.1.2 misho 8493: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 8494:
1.1.1.2 misho 8495: SAVE_OPLINE();
8496: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
8497: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8498: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 8499: zval_dtor(free_op1.var);
1.1.1.2 misho 8500: zval_dtor(free_op2.var);
8501: CHECK_EXCEPTION();
1.1 misho 8502: ZEND_VM_NEXT_OPCODE();
8503: }
8504:
1.1.1.2 misho 8505: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8506: {
1.1.1.2 misho 8507: USE_OPLINE
1.1 misho 8508: zend_free_op free_op1, free_op2;
8509:
1.1.1.2 misho 8510: SAVE_OPLINE();
8511: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
8512: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8513: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8514: zval_dtor(free_op1.var);
1.1.1.2 misho 8515: zval_dtor(free_op2.var);
8516: CHECK_EXCEPTION();
1.1 misho 8517: ZEND_VM_NEXT_OPCODE();
8518: }
8519:
1.1.1.2 misho 8520: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8521: {
1.1.1.2 misho 8522: USE_OPLINE
1.1 misho 8523: zend_free_op free_op1, free_op2;
8524:
1.1.1.2 misho 8525: SAVE_OPLINE();
8526: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
8527: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8528: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 8529: zval_dtor(free_op1.var);
1.1.1.2 misho 8530: zval_dtor(free_op2.var);
8531: CHECK_EXCEPTION();
1.1 misho 8532: ZEND_VM_NEXT_OPCODE();
8533: }
8534:
1.1.1.2 misho 8535: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8536: {
8537: USE_OPLINE
8538: zend_free_op free_op1, free_op2;
8539:
8540: SAVE_OPLINE();
8541: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
8542: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8543: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8544: zval_dtor(free_op1.var);
8545: zval_dtor(free_op2.var);
8546: CHECK_EXCEPTION();
8547: ZEND_VM_NEXT_OPCODE();
8548: }
8549:
8550: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8551: {
8552: USE_OPLINE
8553: zend_free_op free_op1, free_op2;
8554:
8555: SAVE_OPLINE();
8556: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
8557: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8558: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8559: zval_dtor(free_op1.var);
8560: zval_dtor(free_op2.var);
8561: CHECK_EXCEPTION();
8562: ZEND_VM_NEXT_OPCODE();
8563: }
8564:
8565: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 8566: {
1.1.1.2 misho 8567: USE_OPLINE
1.1 misho 8568: zend_free_op free_op2;
1.1.1.2 misho 8569: zval *str = &EX_T(opline->result.var).tmp_var;
8570: zval *var;
1.1 misho 8571: zval var_copy;
8572: int use_copy = 0;
8573:
1.1.1.2 misho 8574: SAVE_OPLINE();
8575: var = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
8576:
1.1 misho 8577: if (IS_TMP_VAR == IS_UNUSED) {
8578: /* Initialize for erealloc in add_string_to_string */
8579: Z_STRVAL_P(str) = NULL;
8580: Z_STRLEN_P(str) = 0;
8581: Z_TYPE_P(str) = IS_STRING;
8582:
8583: INIT_PZVAL(str);
8584: }
8585:
1.1.1.2 misho 8586: if (Z_TYPE_P(var) != IS_STRING) {
8587: zend_make_printable_zval(var, &var_copy, &use_copy);
8588:
8589: if (use_copy) {
8590: var = &var_copy;
8591: }
8592: }
8593: add_string_to_string(str, str, var);
8594:
8595: if (use_copy) {
8596: zval_dtor(var);
8597: }
8598: /* original comment, possibly problematic:
8599: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
8600: * (Zeev): I don't think it's problematic, we only use variables
8601: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
8602: * string offsets or overloaded objects
8603: */
8604: zval_dtor(free_op2.var);
8605:
8606: CHECK_EXCEPTION();
8607: ZEND_VM_NEXT_OPCODE();
8608: }
8609:
8610: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8611: {
8612: USE_OPLINE
8613: zval *function_name;
8614: char *function_name_strval;
8615: int function_name_strlen;
8616: zend_free_op free_op1, free_op2;
8617:
8618: SAVE_OPLINE();
8619: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
8620:
8621: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
8622:
8623: if (IS_TMP_VAR != IS_CONST &&
8624: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
8625: zend_error_noreturn(E_ERROR, "Method name must be a string");
8626: }
8627:
8628: function_name_strval = Z_STRVAL_P(function_name);
8629: function_name_strlen = Z_STRLEN_P(function_name);
8630:
8631: EX(object) = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
8632:
8633: if (EXPECTED(EX(object) != NULL) &&
8634: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
8635: EX(called_scope) = Z_OBJCE_P(EX(object));
8636:
8637: if (IS_TMP_VAR != IS_CONST ||
8638: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
8639: zval *object = EX(object);
8640:
8641: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
8642: zend_error_noreturn(E_ERROR, "Object does not support method calls");
8643: }
8644:
8645: /* First, locate the function. */
8646: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
8647: if (UNEXPECTED(EX(fbc) == NULL)) {
8648: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
8649: }
8650: if (IS_TMP_VAR == IS_CONST &&
8651: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
8652: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
8653: EXPECTED(EX(object) == object)) {
8654: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
8655: }
8656: }
8657: } else {
8658: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
8659: }
8660:
8661: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
8662: EX(object) = NULL;
8663: } else {
8664: if (!PZVAL_IS_REF(EX(object))) {
8665: Z_ADDREF_P(EX(object)); /* For $this pointer */
8666: } else {
8667: zval *this_ptr;
8668: ALLOC_ZVAL(this_ptr);
8669: INIT_PZVAL_COPY(this_ptr, EX(object));
8670: zval_copy_ctor(this_ptr);
8671: EX(object) = this_ptr;
8672: }
8673: }
8674:
8675: zval_dtor(free_op2.var);
8676:
8677: CHECK_EXCEPTION();
8678: ZEND_VM_NEXT_OPCODE();
8679: }
8680:
8681: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8682: {
8683: USE_OPLINE
8684: zend_free_op free_op1, free_op2;
8685:
8686: SAVE_OPLINE();
8687: if (IS_TMP_VAR==IS_VAR) {
8688: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
8689: }
8690: is_equal_function(&EX_T(opline->result.var).tmp_var,
8691: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8692: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8693:
8694: zval_dtor(free_op2.var);
8695: CHECK_EXCEPTION();
8696: ZEND_VM_NEXT_OPCODE();
8697: }
8698:
8699: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8700: {
8701: USE_OPLINE
8702: zend_free_op free_op1;
8703: zval *expr_ptr;
8704:
8705: SAVE_OPLINE();
8706: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
8707: zval **expr_ptr_ptr = NULL;
8708:
8709: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
8710: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
8711: }
8712: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
8713: expr_ptr = *expr_ptr_ptr;
8714: Z_ADDREF_P(expr_ptr);
8715: } else {
8716: expr_ptr=_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
8717: if (1) { /* temporary variable */
8718: zval *new_expr;
8719:
8720: ALLOC_ZVAL(new_expr);
8721: INIT_PZVAL_COPY(new_expr, expr_ptr);
8722: expr_ptr = new_expr;
8723: } else if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
8724: zval *new_expr;
8725:
8726: ALLOC_ZVAL(new_expr);
8727: INIT_PZVAL_COPY(new_expr, expr_ptr);
8728: expr_ptr = new_expr;
8729: zendi_zval_copy_ctor(*expr_ptr);
8730: } else {
8731: Z_ADDREF_P(expr_ptr);
8732: }
8733: }
8734:
8735: if (IS_TMP_VAR != IS_UNUSED) {
8736: zend_free_op free_op2;
8737: zval *offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
8738: ulong hval;
8739:
8740: switch (Z_TYPE_P(offset)) {
8741: case IS_DOUBLE:
8742: hval = zend_dval_to_lval(Z_DVAL_P(offset));
8743: goto num_index;
8744: case IS_LONG:
8745: case IS_BOOL:
8746: hval = Z_LVAL_P(offset);
8747: num_index:
8748: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
8749: break;
8750: case IS_STRING:
8751: if (IS_TMP_VAR == IS_CONST) {
8752: hval = Z_HASH_P(offset);
8753: } else {
8754: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
8755: if (IS_INTERNED(Z_STRVAL_P(offset))) {
8756: hval = INTERNED_HASH(Z_STRVAL_P(offset));
8757: } else {
8758: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
8759: }
8760: }
8761: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
8762: break;
8763: case IS_NULL:
8764: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
8765: break;
8766: default:
8767: zend_error(E_WARNING, "Illegal offset type");
8768: zval_ptr_dtor(&expr_ptr);
8769: /* do nothing */
8770: break;
8771: }
8772: zval_dtor(free_op2.var);
8773: } else {
8774: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
8775: }
8776: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
8777:
8778: } else {
8779:
8780: }
8781: CHECK_EXCEPTION();
8782: ZEND_VM_NEXT_OPCODE();
8783: }
8784:
8785: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8786: {
8787: USE_OPLINE
8788:
8789: array_init(&EX_T(opline->result.var).tmp_var);
8790: if (IS_TMP_VAR == IS_UNUSED) {
8791: ZEND_VM_NEXT_OPCODE();
8792: #if 0 || IS_TMP_VAR != IS_UNUSED
8793: } else {
8794: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
8795: #endif
8796: }
8797: }
8798:
8799: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8800: {
8801: USE_OPLINE
8802: zend_free_op free_op1, free_op2;
8803:
8804: SAVE_OPLINE();
8805: fast_add_function(&EX_T(opline->result.var).tmp_var,
8806: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8807: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8808: zval_dtor(free_op1.var);
8809: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8810: CHECK_EXCEPTION();
8811: ZEND_VM_NEXT_OPCODE();
8812: }
8813:
8814: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8815: {
8816: USE_OPLINE
8817: zend_free_op free_op1, free_op2;
8818:
8819: SAVE_OPLINE();
8820: fast_sub_function(&EX_T(opline->result.var).tmp_var,
8821: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8822: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8823: zval_dtor(free_op1.var);
8824: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8825: CHECK_EXCEPTION();
8826: ZEND_VM_NEXT_OPCODE();
8827: }
8828:
8829: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8830: {
8831: USE_OPLINE
8832: zend_free_op free_op1, free_op2;
8833:
8834: SAVE_OPLINE();
8835: fast_mul_function(&EX_T(opline->result.var).tmp_var,
8836: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8837: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8838: zval_dtor(free_op1.var);
8839: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8840: CHECK_EXCEPTION();
8841: ZEND_VM_NEXT_OPCODE();
8842: }
8843:
8844: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8845: {
8846: USE_OPLINE
8847: zend_free_op free_op1, free_op2;
8848:
8849: SAVE_OPLINE();
8850: fast_div_function(&EX_T(opline->result.var).tmp_var,
8851: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8852: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8853: zval_dtor(free_op1.var);
8854: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8855: CHECK_EXCEPTION();
8856: ZEND_VM_NEXT_OPCODE();
8857: }
8858:
8859: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8860: {
8861: USE_OPLINE
8862: zend_free_op free_op1, free_op2;
8863:
8864: SAVE_OPLINE();
8865: fast_mod_function(&EX_T(opline->result.var).tmp_var,
8866: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8867: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8868: zval_dtor(free_op1.var);
8869: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8870: CHECK_EXCEPTION();
8871: ZEND_VM_NEXT_OPCODE();
8872: }
8873:
8874: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8875: {
8876: USE_OPLINE
8877: zend_free_op free_op1, free_op2;
8878:
8879: SAVE_OPLINE();
8880: shift_left_function(&EX_T(opline->result.var).tmp_var,
8881: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8882: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8883: zval_dtor(free_op1.var);
8884: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8885: CHECK_EXCEPTION();
8886: ZEND_VM_NEXT_OPCODE();
8887: }
8888:
8889: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8890: {
8891: USE_OPLINE
8892: zend_free_op free_op1, free_op2;
8893:
8894: SAVE_OPLINE();
8895: shift_right_function(&EX_T(opline->result.var).tmp_var,
8896: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8897: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8898: zval_dtor(free_op1.var);
8899: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8900: CHECK_EXCEPTION();
8901: ZEND_VM_NEXT_OPCODE();
8902: }
8903:
8904: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8905: {
8906: USE_OPLINE
8907: zend_free_op free_op1, free_op2;
8908:
8909: SAVE_OPLINE();
8910: concat_function(&EX_T(opline->result.var).tmp_var,
8911: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8912: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8913: zval_dtor(free_op1.var);
8914: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8915: CHECK_EXCEPTION();
8916: ZEND_VM_NEXT_OPCODE();
8917: }
8918:
8919: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8920: {
8921: USE_OPLINE
8922: zend_free_op free_op1, free_op2;
8923:
8924: SAVE_OPLINE();
8925: is_identical_function(&EX_T(opline->result.var).tmp_var,
8926: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8927: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8928: zval_dtor(free_op1.var);
8929: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8930: CHECK_EXCEPTION();
8931: ZEND_VM_NEXT_OPCODE();
8932: }
8933:
8934: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8935: {
8936: USE_OPLINE
8937: zend_free_op free_op1, free_op2;
8938: zval *result = &EX_T(opline->result.var).tmp_var;
8939:
8940: SAVE_OPLINE();
8941: is_identical_function(result,
8942: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8943: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
8944: Z_LVAL_P(result) = !Z_LVAL_P(result);
8945: zval_dtor(free_op1.var);
8946: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8947: CHECK_EXCEPTION();
8948: ZEND_VM_NEXT_OPCODE();
8949: }
8950:
8951: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8952: {
8953: USE_OPLINE
8954: zend_free_op free_op1, free_op2;
8955: zval *result = &EX_T(opline->result.var).tmp_var;
8956:
8957: SAVE_OPLINE();
8958: ZVAL_BOOL(result, fast_equal_function(result,
8959: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8960: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
8961: zval_dtor(free_op1.var);
8962: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8963: CHECK_EXCEPTION();
8964: ZEND_VM_NEXT_OPCODE();
8965: }
8966:
8967: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8968: {
8969: USE_OPLINE
8970: zend_free_op free_op1, free_op2;
8971: zval *result = &EX_T(opline->result.var).tmp_var;
8972:
8973: SAVE_OPLINE();
8974: ZVAL_BOOL(result, fast_not_equal_function(result,
8975: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8976: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
8977: zval_dtor(free_op1.var);
8978: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8979: CHECK_EXCEPTION();
8980: ZEND_VM_NEXT_OPCODE();
8981: }
8982:
8983: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
8984: {
8985: USE_OPLINE
8986: zend_free_op free_op1, free_op2;
8987: zval *result = &EX_T(opline->result.var).tmp_var;
8988:
8989: SAVE_OPLINE();
8990: ZVAL_BOOL(result, fast_is_smaller_function(result,
8991: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
8992: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
8993: zval_dtor(free_op1.var);
8994: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
8995: CHECK_EXCEPTION();
8996: ZEND_VM_NEXT_OPCODE();
8997: }
8998:
8999: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9000: {
9001: USE_OPLINE
9002: zend_free_op free_op1, free_op2;
9003: zval *result = &EX_T(opline->result.var).tmp_var;
9004:
9005: SAVE_OPLINE();
9006: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
9007: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9008: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
9009: zval_dtor(free_op1.var);
9010: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9011: CHECK_EXCEPTION();
9012: ZEND_VM_NEXT_OPCODE();
9013: }
9014:
9015: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9016: {
9017: USE_OPLINE
9018: zend_free_op free_op1, free_op2;
9019:
9020: SAVE_OPLINE();
9021: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
9022: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9023: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
9024: zval_dtor(free_op1.var);
9025: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9026: CHECK_EXCEPTION();
9027: ZEND_VM_NEXT_OPCODE();
9028: }
9029:
9030: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9031: {
9032: USE_OPLINE
9033: zend_free_op free_op1, free_op2;
9034:
9035: SAVE_OPLINE();
9036: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
9037: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9038: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
9039: zval_dtor(free_op1.var);
9040: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9041: CHECK_EXCEPTION();
9042: ZEND_VM_NEXT_OPCODE();
9043: }
9044:
9045: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9046: {
9047: USE_OPLINE
9048: zend_free_op free_op1, free_op2;
9049:
9050: SAVE_OPLINE();
9051: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
9052: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9053: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
9054: zval_dtor(free_op1.var);
9055: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9056: CHECK_EXCEPTION();
9057: ZEND_VM_NEXT_OPCODE();
9058: }
9059:
9060: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9061: {
9062: USE_OPLINE
9063: zend_free_op free_op1, free_op2;
9064:
9065: SAVE_OPLINE();
9066: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
9067: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9068: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
9069: zval_dtor(free_op1.var);
9070: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9071: CHECK_EXCEPTION();
9072: ZEND_VM_NEXT_OPCODE();
9073: }
9074:
9075: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
9076: {
9077: USE_OPLINE
9078: zend_free_op free_op1;
9079: zval *varname;
9080: zval **retval;
9081: zval tmp_varname;
9082: HashTable *target_symbol_table;
9083: ulong hash_value;
9084:
9085: SAVE_OPLINE();
9086: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9087:
9088: if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
9089: ZVAL_COPY_VALUE(&tmp_varname, varname);
9090: zval_copy_ctor(&tmp_varname);
9091: Z_SET_REFCOUNT(tmp_varname, 1);
9092: Z_UNSET_ISREF(tmp_varname);
9093: convert_to_string(&tmp_varname);
9094: varname = &tmp_varname;
9095: }
9096:
9097: if (IS_VAR != IS_UNUSED) {
9098: zend_class_entry *ce;
9099:
9100: if (IS_VAR == IS_CONST) {
9101: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
9102: ce = CACHED_PTR(opline->op2.literal->cache_slot);
9103: } else {
9104: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
9105: if (UNEXPECTED(ce == NULL)) {
9106: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
9107: zval_dtor(&tmp_varname);
9108: }
9109: zval_dtor(free_op1.var);
9110: CHECK_EXCEPTION();
9111: ZEND_VM_NEXT_OPCODE();
9112: }
9113: CACHE_PTR(opline->op2.literal->cache_slot, ce);
9114: }
9115: } else {
9116: ce = EX_T(opline->op2.var).class_entry;
9117: }
9118: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
9119: zval_dtor(free_op1.var);
9120: } else {
9121: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
9122: /*
9123: if (!target_symbol_table) {
9124: CHECK_EXCEPTION();
9125: ZEND_VM_NEXT_OPCODE();
9126: }
9127: */
9128: if (IS_TMP_VAR == IS_CONST) {
9129: hash_value = Z_HASH_P(varname);
9130: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
9131: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
9132: } else {
9133: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
9134: }
9135:
9136: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
9137: switch (type) {
9138: case BP_VAR_R:
9139: case BP_VAR_UNSET:
9140: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
9141: /* break missing intentionally */
9142: case BP_VAR_IS:
9143: retval = &EG(uninitialized_zval_ptr);
9144: break;
9145: case BP_VAR_RW:
9146: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
9147: /* break missing intentionally */
9148: case BP_VAR_W:
9149: Z_ADDREF_P(&EG(uninitialized_zval));
9150: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
9151: break;
9152: EMPTY_SWITCH_DEFAULT_CASE()
9153: }
9154: }
9155: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
9156: case ZEND_FETCH_GLOBAL:
9157: if (IS_TMP_VAR != IS_TMP_VAR) {
9158: zval_dtor(free_op1.var);
9159: }
9160: break;
9161: case ZEND_FETCH_LOCAL:
9162: zval_dtor(free_op1.var);
9163: break;
9164: case ZEND_FETCH_STATIC:
9165: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
9166: break;
9167: case ZEND_FETCH_GLOBAL_LOCK:
9168: if (IS_TMP_VAR == IS_VAR && !free_op1.var) {
9169: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
9170: }
9171: break;
9172: }
9173: }
9174:
9175:
9176: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
9177: zval_dtor(&tmp_varname);
9178: }
9179: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
9180: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
9181: }
9182: PZVAL_LOCK(*retval);
9183: switch (type) {
9184: case BP_VAR_R:
9185: case BP_VAR_IS:
9186: AI_SET_PTR(&EX_T(opline->result.var), *retval);
9187: break;
9188: case BP_VAR_UNSET: {
9189: zend_free_op free_res;
9190:
9191: PZVAL_UNLOCK(*retval, &free_res);
9192: if (retval != &EG(uninitialized_zval_ptr)) {
9193: SEPARATE_ZVAL_IF_NOT_REF(retval);
9194: }
9195: PZVAL_LOCK(*retval);
9196: FREE_OP_VAR_PTR(free_res);
9197: }
9198: /* break missing intentionally */
9199: default:
9200: EX_T(opline->result.var).var.ptr_ptr = retval;
9201: break;
9202: }
9203: CHECK_EXCEPTION();
9204: ZEND_VM_NEXT_OPCODE();
9205: }
9206:
9207: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9208: {
9209: return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9210: }
9211:
9212: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9213: {
9214: return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9215: }
9216:
9217: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9218: {
9219: return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9220: }
9221:
9222: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9223: {
9224: USE_OPLINE
9225:
9226: return zend_fetch_var_address_helper_SPEC_TMP_VAR(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9227: }
9228:
9229: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9230: {
9231: return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9232: }
9233:
9234: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9235: {
9236: return zend_fetch_var_address_helper_SPEC_TMP_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9237: }
9238:
9239: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9240: {
9241: USE_OPLINE
9242: zend_free_op free_op2;
9243: zval *str = &EX_T(opline->result.var).tmp_var;
9244: zval *var;
9245: zval var_copy;
9246: int use_copy = 0;
9247:
9248: SAVE_OPLINE();
9249: var = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
9250:
9251: if (IS_TMP_VAR == IS_UNUSED) {
9252: /* Initialize for erealloc in add_string_to_string */
9253: Z_STRVAL_P(str) = NULL;
9254: Z_STRLEN_P(str) = 0;
9255: Z_TYPE_P(str) = IS_STRING;
9256:
9257: INIT_PZVAL(str);
9258: }
9259:
9260: if (Z_TYPE_P(var) != IS_STRING) {
9261: zend_make_printable_zval(var, &var_copy, &use_copy);
9262:
9263: if (use_copy) {
9264: var = &var_copy;
9265: }
9266: }
9267: add_string_to_string(str, str, var);
9268:
9269: if (use_copy) {
9270: zval_dtor(var);
9271: }
9272: /* original comment, possibly problematic:
9273: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
9274: * (Zeev): I don't think it's problematic, we only use variables
9275: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
9276: * string offsets or overloaded objects
9277: */
9278: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9279:
9280: CHECK_EXCEPTION();
9281: ZEND_VM_NEXT_OPCODE();
9282: }
9283:
9284: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9285: {
9286: USE_OPLINE
9287: zval *function_name;
9288: char *function_name_strval;
9289: int function_name_strlen;
9290: zend_free_op free_op1, free_op2;
9291:
9292: SAVE_OPLINE();
9293: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
9294:
9295: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
9296:
9297: if (IS_VAR != IS_CONST &&
9298: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
9299: zend_error_noreturn(E_ERROR, "Method name must be a string");
9300: }
9301:
9302: function_name_strval = Z_STRVAL_P(function_name);
9303: function_name_strlen = Z_STRLEN_P(function_name);
9304:
9305: EX(object) = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9306:
9307: if (EXPECTED(EX(object) != NULL) &&
9308: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
9309: EX(called_scope) = Z_OBJCE_P(EX(object));
9310:
9311: if (IS_VAR != IS_CONST ||
9312: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
9313: zval *object = EX(object);
9314:
9315: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
9316: zend_error_noreturn(E_ERROR, "Object does not support method calls");
9317: }
9318:
9319: /* First, locate the function. */
9320: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
9321: if (UNEXPECTED(EX(fbc) == NULL)) {
9322: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
9323: }
9324: if (IS_VAR == IS_CONST &&
9325: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
9326: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
9327: EXPECTED(EX(object) == object)) {
9328: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
9329: }
9330: }
9331: } else {
9332: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
9333: }
9334:
9335: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
9336: EX(object) = NULL;
9337: } else {
9338: if (!PZVAL_IS_REF(EX(object))) {
9339: Z_ADDREF_P(EX(object)); /* For $this pointer */
9340: } else {
9341: zval *this_ptr;
9342: ALLOC_ZVAL(this_ptr);
9343: INIT_PZVAL_COPY(this_ptr, EX(object));
9344: zval_copy_ctor(this_ptr);
9345: EX(object) = this_ptr;
9346: }
9347: }
9348:
9349: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9350:
9351: CHECK_EXCEPTION();
9352: ZEND_VM_NEXT_OPCODE();
9353: }
9354:
9355: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9356: {
9357: USE_OPLINE
9358: zend_free_op free_op1, free_op2;
9359:
9360: SAVE_OPLINE();
9361: if (IS_TMP_VAR==IS_VAR) {
9362: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
9363: }
9364: is_equal_function(&EX_T(opline->result.var).tmp_var,
9365: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
9366: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
9367:
9368: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9369: CHECK_EXCEPTION();
9370: ZEND_VM_NEXT_OPCODE();
9371: }
9372:
9373: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9374: {
9375: USE_OPLINE
9376: zend_free_op free_op1;
9377: zval *expr_ptr;
9378:
9379: SAVE_OPLINE();
9380: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
9381: zval **expr_ptr_ptr = NULL;
9382:
9383: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
9384: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
9385: }
9386: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
9387: expr_ptr = *expr_ptr_ptr;
9388: Z_ADDREF_P(expr_ptr);
9389: } else {
9390: expr_ptr=_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9391: if (1) { /* temporary variable */
9392: zval *new_expr;
9393:
9394: ALLOC_ZVAL(new_expr);
9395: INIT_PZVAL_COPY(new_expr, expr_ptr);
9396: expr_ptr = new_expr;
9397: } else if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
9398: zval *new_expr;
9399:
9400: ALLOC_ZVAL(new_expr);
9401: INIT_PZVAL_COPY(new_expr, expr_ptr);
9402: expr_ptr = new_expr;
9403: zendi_zval_copy_ctor(*expr_ptr);
9404: } else {
9405: Z_ADDREF_P(expr_ptr);
9406: }
9407: }
9408:
9409: if (IS_VAR != IS_UNUSED) {
9410: zend_free_op free_op2;
9411: zval *offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
9412: ulong hval;
9413:
9414: switch (Z_TYPE_P(offset)) {
9415: case IS_DOUBLE:
9416: hval = zend_dval_to_lval(Z_DVAL_P(offset));
9417: goto num_index;
9418: case IS_LONG:
9419: case IS_BOOL:
9420: hval = Z_LVAL_P(offset);
9421: num_index:
9422: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
9423: break;
9424: case IS_STRING:
9425: if (IS_VAR == IS_CONST) {
9426: hval = Z_HASH_P(offset);
9427: } else {
9428: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
9429: if (IS_INTERNED(Z_STRVAL_P(offset))) {
9430: hval = INTERNED_HASH(Z_STRVAL_P(offset));
9431: } else {
9432: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
9433: }
9434: }
9435: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
9436: break;
9437: case IS_NULL:
9438: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
9439: break;
9440: default:
9441: zend_error(E_WARNING, "Illegal offset type");
9442: zval_ptr_dtor(&expr_ptr);
9443: /* do nothing */
9444: break;
9445: }
9446: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
9447: } else {
9448: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
9449: }
9450: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
9451:
9452: } else {
9453:
9454: }
9455: CHECK_EXCEPTION();
9456: ZEND_VM_NEXT_OPCODE();
9457: }
9458:
9459: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9460: {
9461: USE_OPLINE
9462:
9463: array_init(&EX_T(opline->result.var).tmp_var);
9464: if (IS_TMP_VAR == IS_UNUSED) {
9465: ZEND_VM_NEXT_OPCODE();
9466: #if 0 || IS_TMP_VAR != IS_UNUSED
9467: } else {
9468: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9469: #endif
9470: }
9471: }
9472:
9473: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9474: {
9475: USE_OPLINE
9476: zval tmp, *varname;
9477: HashTable *target_symbol_table;
9478: zend_free_op free_op1;
9479:
9480: SAVE_OPLINE();
9481: if (IS_TMP_VAR == IS_CV &&
9482: IS_VAR == IS_UNUSED &&
9483: (opline->extended_value & ZEND_QUICK_SET)) {
9484: if (EG(active_symbol_table)) {
9485: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
9486:
9487: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
9488: EX_CV(opline->op1.var) = NULL;
9489: } else if (EX_CV(opline->op1.var)) {
9490: zval_ptr_dtor(EX_CV(opline->op1.var));
9491: EX_CV(opline->op1.var) = NULL;
9492: }
9493: CHECK_EXCEPTION();
9494: ZEND_VM_NEXT_OPCODE();
9495: }
9496:
9497: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9498:
9499: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
9500: ZVAL_COPY_VALUE(&tmp, varname);
9501: zval_copy_ctor(&tmp);
9502: convert_to_string(&tmp);
9503: varname = &tmp;
9504: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9505: Z_ADDREF_P(varname);
9506: }
9507:
9508: if (IS_VAR != IS_UNUSED) {
9509: zend_class_entry *ce;
9510:
9511: if (IS_VAR == IS_CONST) {
9512: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
9513: ce = CACHED_PTR(opline->op2.literal->cache_slot);
9514: } else {
9515: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 9516: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 9517: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
9518: zval_dtor(&tmp);
9519: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9520: zval_ptr_dtor(&varname);
9521: }
9522: zval_dtor(free_op1.var);
1.1.1.4 misho 9523: HANDLE_EXCEPTION();
9524: }
9525: if (UNEXPECTED(ce == NULL)) {
9526: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 9527: }
9528: CACHE_PTR(opline->op2.literal->cache_slot, ce);
9529: }
9530: } else {
9531: ce = EX_T(opline->op2.var).class_entry;
9532: }
9533: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
9534: } else {
9535: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
9536:
9537: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
9538: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
9539: }
9540:
9541: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
9542: zval_dtor(&tmp);
9543: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9544: zval_ptr_dtor(&varname);
9545: }
9546: zval_dtor(free_op1.var);
9547: CHECK_EXCEPTION();
9548: ZEND_VM_NEXT_OPCODE();
9549: }
9550:
9551: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9552: {
9553: USE_OPLINE
9554: zval **value;
9555: zend_bool isset = 1;
9556:
9557: SAVE_OPLINE();
9558: if (IS_TMP_VAR == IS_CV &&
9559: IS_VAR == IS_UNUSED &&
9560: (opline->extended_value & ZEND_QUICK_SET)) {
9561: if (EX_CV(opline->op1.var)) {
9562: value = EX_CV(opline->op1.var);
9563: } else if (EG(active_symbol_table)) {
9564: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
9565:
9566: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
9567: isset = 0;
9568: }
9569: } else {
9570: isset = 0;
9571: }
9572: } else {
9573: HashTable *target_symbol_table;
9574: zend_free_op free_op1;
9575: zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9576:
9577: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
9578: ZVAL_COPY_VALUE(&tmp, varname);
9579: zval_copy_ctor(&tmp);
9580: convert_to_string(&tmp);
9581: varname = &tmp;
9582: }
9583:
9584: if (IS_VAR != IS_UNUSED) {
9585: zend_class_entry *ce;
9586:
9587: if (IS_VAR == IS_CONST) {
9588: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
9589: ce = CACHED_PTR(opline->op2.literal->cache_slot);
9590: } else {
9591: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
9592: if (UNEXPECTED(ce == NULL)) {
9593: CHECK_EXCEPTION();
9594: ZEND_VM_NEXT_OPCODE();
9595: }
9596: CACHE_PTR(opline->op2.literal->cache_slot, ce);
9597: }
9598: } else {
9599: ce = EX_T(opline->op2.var).class_entry;
9600: }
9601: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
9602: if (!value) {
9603: isset = 0;
9604: }
9605: } else {
9606: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
9607: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
9608: isset = 0;
9609: }
9610: }
9611:
9612: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
9613: zval_dtor(&tmp);
9614: }
9615: zval_dtor(free_op1.var);
9616: }
9617:
9618: if (opline->extended_value & ZEND_ISSET) {
9619: if (isset && Z_TYPE_PP(value) != IS_NULL) {
9620: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
9621: } else {
9622: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
9623: }
9624: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
9625: if (!isset || !i_zend_is_true(*value)) {
9626: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
9627: } else {
9628: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
9629: }
9630: }
9631:
9632: CHECK_EXCEPTION();
9633: ZEND_VM_NEXT_OPCODE();
9634: }
9635:
9636: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS)
9637: {
9638: USE_OPLINE
9639: zend_free_op free_op1;
9640: zval *varname;
9641: zval **retval;
9642: zval tmp_varname;
9643: HashTable *target_symbol_table;
9644: ulong hash_value;
9645:
9646: SAVE_OPLINE();
9647: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9648:
9649: if (IS_TMP_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
9650: ZVAL_COPY_VALUE(&tmp_varname, varname);
9651: zval_copy_ctor(&tmp_varname);
9652: Z_SET_REFCOUNT(tmp_varname, 1);
9653: Z_UNSET_ISREF(tmp_varname);
9654: convert_to_string(&tmp_varname);
9655: varname = &tmp_varname;
9656: }
9657:
9658: if (IS_UNUSED != IS_UNUSED) {
9659: zend_class_entry *ce;
9660:
9661: if (IS_UNUSED == IS_CONST) {
9662: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
9663: ce = CACHED_PTR(opline->op2.literal->cache_slot);
9664: } else {
9665: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
9666: if (UNEXPECTED(ce == NULL)) {
9667: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
9668: zval_dtor(&tmp_varname);
9669: }
9670: zval_dtor(free_op1.var);
9671: CHECK_EXCEPTION();
9672: ZEND_VM_NEXT_OPCODE();
9673: }
9674: CACHE_PTR(opline->op2.literal->cache_slot, ce);
9675: }
9676: } else {
9677: ce = EX_T(opline->op2.var).class_entry;
9678: }
9679: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
9680: zval_dtor(free_op1.var);
9681: } else {
9682: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
9683: /*
9684: if (!target_symbol_table) {
9685: CHECK_EXCEPTION();
9686: ZEND_VM_NEXT_OPCODE();
9687: }
9688: */
9689: if (IS_TMP_VAR == IS_CONST) {
9690: hash_value = Z_HASH_P(varname);
9691: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
9692: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
9693: } else {
9694: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
9695: }
9696:
9697: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
9698: switch (type) {
9699: case BP_VAR_R:
9700: case BP_VAR_UNSET:
9701: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
9702: /* break missing intentionally */
9703: case BP_VAR_IS:
9704: retval = &EG(uninitialized_zval_ptr);
9705: break;
9706: case BP_VAR_RW:
9707: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
9708: /* break missing intentionally */
9709: case BP_VAR_W:
9710: Z_ADDREF_P(&EG(uninitialized_zval));
9711: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
9712: break;
9713: EMPTY_SWITCH_DEFAULT_CASE()
9714: }
9715: }
9716: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
9717: case ZEND_FETCH_GLOBAL:
9718: if (IS_TMP_VAR != IS_TMP_VAR) {
9719: zval_dtor(free_op1.var);
9720: }
9721: break;
9722: case ZEND_FETCH_LOCAL:
9723: zval_dtor(free_op1.var);
9724: break;
9725: case ZEND_FETCH_STATIC:
9726: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
9727: break;
9728: case ZEND_FETCH_GLOBAL_LOCK:
9729: if (IS_TMP_VAR == IS_VAR && !free_op1.var) {
9730: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
9731: }
9732: break;
9733: }
9734: }
9735:
1.1 misho 9736:
1.1.1.2 misho 9737: if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
9738: zval_dtor(&tmp_varname);
1.1 misho 9739: }
1.1.1.2 misho 9740: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
9741: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
1.1 misho 9742: }
1.1.1.2 misho 9743: PZVAL_LOCK(*retval);
9744: switch (type) {
9745: case BP_VAR_R:
9746: case BP_VAR_IS:
9747: AI_SET_PTR(&EX_T(opline->result.var), *retval);
9748: break;
9749: case BP_VAR_UNSET: {
9750: zend_free_op free_res;
9751:
9752: PZVAL_UNLOCK(*retval, &free_res);
9753: if (retval != &EG(uninitialized_zval_ptr)) {
9754: SEPARATE_ZVAL_IF_NOT_REF(retval);
9755: }
9756: PZVAL_LOCK(*retval);
9757: FREE_OP_VAR_PTR(free_res);
9758: }
9759: /* break missing intentionally */
9760: default:
9761: EX_T(opline->result.var).var.ptr_ptr = retval;
9762: break;
9763: }
9764: CHECK_EXCEPTION();
1.1 misho 9765: ZEND_VM_NEXT_OPCODE();
9766: }
9767:
1.1.1.2 misho 9768: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9769: {
1.1.1.2 misho 9770: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9771: }
1.1 misho 9772:
1.1.1.2 misho 9773: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9774: {
9775: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9776: }
1.1 misho 9777:
1.1.1.2 misho 9778: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9779: {
9780: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9781: }
1.1 misho 9782:
1.1.1.2 misho 9783: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9784: {
9785: USE_OPLINE
1.1 misho 9786:
1.1.1.2 misho 9787: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 9788: }
9789:
1.1.1.2 misho 9790: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9791: {
1.1.1.2 misho 9792: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
9793: }
1.1 misho 9794:
1.1.1.2 misho 9795: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
9796: {
9797: return zend_fetch_var_address_helper_SPEC_TMP_UNUSED(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 9798: }
9799:
1.1.1.2 misho 9800: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9801: {
1.1.1.2 misho 9802: USE_OPLINE
9803: zend_free_op free_op1;
1.1 misho 9804: zval *expr_ptr;
9805:
1.1.1.2 misho 9806: SAVE_OPLINE();
9807: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
9808: zval **expr_ptr_ptr = NULL;
1.1 misho 9809:
1.1.1.2 misho 9810: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
9811: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
9812: }
9813: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 9814: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 9815: Z_ADDREF_P(expr_ptr);
1.1 misho 9816: } else {
1.1.1.2 misho 9817: expr_ptr=_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
9818: if (1) { /* temporary variable */
9819: zval *new_expr;
1.1 misho 9820:
1.1.1.2 misho 9821: ALLOC_ZVAL(new_expr);
9822: INIT_PZVAL_COPY(new_expr, expr_ptr);
9823: expr_ptr = new_expr;
9824: } else if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 9825: zval *new_expr;
9826:
9827: ALLOC_ZVAL(new_expr);
9828: INIT_PZVAL_COPY(new_expr, expr_ptr);
9829: expr_ptr = new_expr;
9830: zendi_zval_copy_ctor(*expr_ptr);
9831: } else {
9832: Z_ADDREF_P(expr_ptr);
9833: }
9834: }
1.1.1.2 misho 9835:
9836: if (IS_UNUSED != IS_UNUSED) {
9837:
9838: zval *offset = NULL;
9839: ulong hval;
9840:
1.1 misho 9841: switch (Z_TYPE_P(offset)) {
9842: case IS_DOUBLE:
1.1.1.2 misho 9843: hval = zend_dval_to_lval(Z_DVAL_P(offset));
9844: goto num_index;
1.1 misho 9845: case IS_LONG:
9846: case IS_BOOL:
1.1.1.2 misho 9847: hval = Z_LVAL_P(offset);
9848: num_index:
9849: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 9850: break;
9851: case IS_STRING:
1.1.1.2 misho 9852: if (IS_UNUSED == IS_CONST) {
9853: hval = Z_HASH_P(offset);
9854: } else {
9855: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
9856: if (IS_INTERNED(Z_STRVAL_P(offset))) {
9857: hval = INTERNED_HASH(Z_STRVAL_P(offset));
9858: } else {
9859: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
9860: }
9861: }
9862: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 9863: break;
9864: case IS_NULL:
1.1.1.2 misho 9865: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 9866: break;
9867: default:
9868: zend_error(E_WARNING, "Illegal offset type");
9869: zval_ptr_dtor(&expr_ptr);
9870: /* do nothing */
9871: break;
9872: }
1.1.1.2 misho 9873:
1.1 misho 9874: } else {
1.1.1.2 misho 9875: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 9876: }
1.1.1.2 misho 9877: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
1.1 misho 9878:
9879: } else {
9880:
9881: }
1.1.1.2 misho 9882: CHECK_EXCEPTION();
1.1 misho 9883: ZEND_VM_NEXT_OPCODE();
9884: }
9885:
1.1.1.2 misho 9886: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9887: {
1.1.1.2 misho 9888: USE_OPLINE
1.1 misho 9889:
1.1.1.2 misho 9890: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 9891: if (IS_TMP_VAR == IS_UNUSED) {
9892: ZEND_VM_NEXT_OPCODE();
9893: #if 0 || IS_TMP_VAR != IS_UNUSED
9894: } else {
1.1.1.2 misho 9895: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 9896: #endif
9897: }
9898: }
9899:
1.1.1.2 misho 9900: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9901: {
1.1.1.2 misho 9902: USE_OPLINE
9903: zval tmp, *varname;
9904: HashTable *target_symbol_table;
1.1 misho 9905: zend_free_op free_op1;
9906:
1.1.1.2 misho 9907: SAVE_OPLINE();
9908: if (IS_TMP_VAR == IS_CV &&
9909: IS_UNUSED == IS_UNUSED &&
9910: (opline->extended_value & ZEND_QUICK_SET)) {
9911: if (EG(active_symbol_table)) {
9912: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
1.1 misho 9913:
1.1.1.2 misho 9914: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
9915: EX_CV(opline->op1.var) = NULL;
9916: } else if (EX_CV(opline->op1.var)) {
9917: zval_ptr_dtor(EX_CV(opline->op1.var));
9918: EX_CV(opline->op1.var) = NULL;
9919: }
9920: CHECK_EXCEPTION();
9921: ZEND_VM_NEXT_OPCODE();
1.1 misho 9922: }
9923:
1.1.1.2 misho 9924: varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 9925:
1.1.1.2 misho 9926: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
9927: ZVAL_COPY_VALUE(&tmp, varname);
9928: zval_copy_ctor(&tmp);
9929: convert_to_string(&tmp);
9930: varname = &tmp;
9931: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9932: Z_ADDREF_P(varname);
9933: }
1.1 misho 9934:
1.1.1.2 misho 9935: if (IS_UNUSED != IS_UNUSED) {
9936: zend_class_entry *ce;
9937:
9938: if (IS_UNUSED == IS_CONST) {
9939: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
9940: ce = CACHED_PTR(opline->op2.literal->cache_slot);
9941: } else {
9942: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 9943: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 9944: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
9945: zval_dtor(&tmp);
9946: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9947: zval_ptr_dtor(&varname);
9948: }
9949: zval_dtor(free_op1.var);
1.1.1.4 misho 9950: HANDLE_EXCEPTION();
9951: }
9952: if (UNEXPECTED(ce == NULL)) {
9953: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 9954: }
9955: CACHE_PTR(opline->op2.literal->cache_slot, ce);
9956: }
1.1 misho 9957: } else {
1.1.1.2 misho 9958: ce = EX_T(opline->op2.var).class_entry;
1.1 misho 9959: }
1.1.1.2 misho 9960: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
1.1 misho 9961: } else {
1.1.1.2 misho 9962: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
1.1 misho 9963:
1.1.1.2 misho 9964: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
9965: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
9966: }
1.1 misho 9967:
1.1.1.2 misho 9968: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
9969: zval_dtor(&tmp);
9970: } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
9971: zval_ptr_dtor(&varname);
1.1 misho 9972: }
1.1.1.2 misho 9973: zval_dtor(free_op1.var);
9974: CHECK_EXCEPTION();
1.1 misho 9975: ZEND_VM_NEXT_OPCODE();
9976: }
9977:
1.1.1.2 misho 9978: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 9979: {
1.1.1.2 misho 9980: USE_OPLINE
9981: zval **value;
9982: zend_bool isset = 1;
1.1 misho 9983:
1.1.1.2 misho 9984: SAVE_OPLINE();
9985: if (IS_TMP_VAR == IS_CV &&
9986: IS_UNUSED == IS_UNUSED &&
9987: (opline->extended_value & ZEND_QUICK_SET)) {
9988: if (EX_CV(opline->op1.var)) {
9989: value = EX_CV(opline->op1.var);
9990: } else if (EG(active_symbol_table)) {
9991: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
9992:
9993: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
9994: isset = 0;
9995: }
9996: } else {
9997: isset = 0;
9998: }
1.1 misho 9999: } else {
1.1.1.2 misho 10000: HashTable *target_symbol_table;
10001: zend_free_op free_op1;
10002: zval tmp, *varname = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10003:
10004: if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
10005: ZVAL_COPY_VALUE(&tmp, varname);
10006: zval_copy_ctor(&tmp);
10007: convert_to_string(&tmp);
10008: varname = &tmp;
10009: }
10010:
10011: if (IS_UNUSED != IS_UNUSED) {
10012: zend_class_entry *ce;
10013:
10014: if (IS_UNUSED == IS_CONST) {
10015: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
10016: ce = CACHED_PTR(opline->op2.literal->cache_slot);
10017: } else {
10018: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
10019: if (UNEXPECTED(ce == NULL)) {
10020: CHECK_EXCEPTION();
10021: ZEND_VM_NEXT_OPCODE();
10022: }
10023: CACHE_PTR(opline->op2.literal->cache_slot, ce);
10024: }
10025: } else {
10026: ce = EX_T(opline->op2.var).class_entry;
10027: }
10028: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_TMP_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
10029: if (!value) {
10030: isset = 0;
10031: }
10032: } else {
10033: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
10034: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
10035: isset = 0;
10036: }
10037: }
10038:
10039: if (IS_TMP_VAR != IS_CONST && varname == &tmp) {
10040: zval_dtor(&tmp);
10041: }
10042: zval_dtor(free_op1.var);
10043: }
10044:
10045: if (opline->extended_value & ZEND_ISSET) {
10046: if (isset && Z_TYPE_PP(value) != IS_NULL) {
10047: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
10048: } else {
10049: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
10050: }
10051: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
10052: if (!isset || !i_zend_is_true(*value)) {
10053: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
10054: } else {
10055: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
10056: }
1.1 misho 10057: }
1.1.1.2 misho 10058:
10059: CHECK_EXCEPTION();
10060: ZEND_VM_NEXT_OPCODE();
1.1 misho 10061: }
10062:
10063: static int ZEND_FASTCALL ZEND_ADD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10064: {
1.1.1.2 misho 10065: USE_OPLINE
1.1 misho 10066: zend_free_op free_op1;
10067:
1.1.1.2 misho 10068: SAVE_OPLINE();
10069: fast_add_function(&EX_T(opline->result.var).tmp_var,
10070: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10071: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10072: zval_dtor(free_op1.var);
10073:
1.1.1.2 misho 10074: CHECK_EXCEPTION();
1.1 misho 10075: ZEND_VM_NEXT_OPCODE();
10076: }
10077:
10078: static int ZEND_FASTCALL ZEND_SUB_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10079: {
1.1.1.2 misho 10080: USE_OPLINE
1.1 misho 10081: zend_free_op free_op1;
10082:
1.1.1.2 misho 10083: SAVE_OPLINE();
10084: fast_sub_function(&EX_T(opline->result.var).tmp_var,
10085: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10086: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10087: zval_dtor(free_op1.var);
10088:
1.1.1.2 misho 10089: CHECK_EXCEPTION();
1.1 misho 10090: ZEND_VM_NEXT_OPCODE();
10091: }
10092:
10093: static int ZEND_FASTCALL ZEND_MUL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10094: {
1.1.1.2 misho 10095: USE_OPLINE
1.1 misho 10096: zend_free_op free_op1;
10097:
1.1.1.2 misho 10098: SAVE_OPLINE();
10099: fast_mul_function(&EX_T(opline->result.var).tmp_var,
10100: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10101: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10102: zval_dtor(free_op1.var);
10103:
1.1.1.2 misho 10104: CHECK_EXCEPTION();
1.1 misho 10105: ZEND_VM_NEXT_OPCODE();
10106: }
10107:
10108: static int ZEND_FASTCALL ZEND_DIV_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10109: {
1.1.1.2 misho 10110: USE_OPLINE
1.1 misho 10111: zend_free_op free_op1;
10112:
1.1.1.2 misho 10113: SAVE_OPLINE();
10114: fast_div_function(&EX_T(opline->result.var).tmp_var,
10115: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10116: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10117: zval_dtor(free_op1.var);
10118:
1.1.1.2 misho 10119: CHECK_EXCEPTION();
1.1 misho 10120: ZEND_VM_NEXT_OPCODE();
10121: }
10122:
10123: static int ZEND_FASTCALL ZEND_MOD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10124: {
1.1.1.2 misho 10125: USE_OPLINE
1.1 misho 10126: zend_free_op free_op1;
10127:
1.1.1.2 misho 10128: SAVE_OPLINE();
10129: fast_mod_function(&EX_T(opline->result.var).tmp_var,
10130: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10131: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10132: zval_dtor(free_op1.var);
10133:
1.1.1.2 misho 10134: CHECK_EXCEPTION();
1.1 misho 10135: ZEND_VM_NEXT_OPCODE();
10136: }
10137:
10138: static int ZEND_FASTCALL ZEND_SL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10139: {
1.1.1.2 misho 10140: USE_OPLINE
1.1 misho 10141: zend_free_op free_op1;
10142:
1.1.1.2 misho 10143: SAVE_OPLINE();
10144: shift_left_function(&EX_T(opline->result.var).tmp_var,
10145: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10146: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10147: zval_dtor(free_op1.var);
10148:
1.1.1.2 misho 10149: CHECK_EXCEPTION();
1.1 misho 10150: ZEND_VM_NEXT_OPCODE();
10151: }
10152:
10153: static int ZEND_FASTCALL ZEND_SR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10154: {
1.1.1.2 misho 10155: USE_OPLINE
1.1 misho 10156: zend_free_op free_op1;
10157:
1.1.1.2 misho 10158: SAVE_OPLINE();
10159: shift_right_function(&EX_T(opline->result.var).tmp_var,
10160: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10161: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10162: zval_dtor(free_op1.var);
10163:
1.1.1.2 misho 10164: CHECK_EXCEPTION();
1.1 misho 10165: ZEND_VM_NEXT_OPCODE();
10166: }
10167:
10168: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10169: {
1.1.1.2 misho 10170: USE_OPLINE
1.1 misho 10171: zend_free_op free_op1;
10172:
1.1.1.2 misho 10173: SAVE_OPLINE();
10174: concat_function(&EX_T(opline->result.var).tmp_var,
10175: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10176: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10177: zval_dtor(free_op1.var);
10178:
1.1.1.2 misho 10179: CHECK_EXCEPTION();
1.1 misho 10180: ZEND_VM_NEXT_OPCODE();
10181: }
10182:
10183: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10184: {
1.1.1.2 misho 10185: USE_OPLINE
1.1 misho 10186: zend_free_op free_op1;
10187:
1.1.1.2 misho 10188: SAVE_OPLINE();
10189: is_identical_function(&EX_T(opline->result.var).tmp_var,
10190: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10191: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10192: zval_dtor(free_op1.var);
10193:
1.1.1.2 misho 10194: CHECK_EXCEPTION();
1.1 misho 10195: ZEND_VM_NEXT_OPCODE();
10196: }
10197:
10198: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10199: {
1.1.1.2 misho 10200: USE_OPLINE
1.1 misho 10201: zend_free_op free_op1;
1.1.1.2 misho 10202: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 10203:
1.1.1.2 misho 10204: SAVE_OPLINE();
1.1 misho 10205: is_identical_function(result,
1.1.1.2 misho 10206: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10207: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10208: Z_LVAL_P(result) = !Z_LVAL_P(result);
10209: zval_dtor(free_op1.var);
10210:
1.1.1.2 misho 10211: CHECK_EXCEPTION();
1.1 misho 10212: ZEND_VM_NEXT_OPCODE();
10213: }
10214:
10215: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10216: {
1.1.1.2 misho 10217: USE_OPLINE
1.1 misho 10218: zend_free_op free_op1;
1.1.1.2 misho 10219: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 10220:
1.1.1.2 misho 10221: SAVE_OPLINE();
10222: ZVAL_BOOL(result, fast_equal_function(result,
10223: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10224: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 10225: zval_dtor(free_op1.var);
10226:
1.1.1.2 misho 10227: CHECK_EXCEPTION();
1.1 misho 10228: ZEND_VM_NEXT_OPCODE();
10229: }
10230:
10231: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10232: {
1.1.1.2 misho 10233: USE_OPLINE
1.1 misho 10234: zend_free_op free_op1;
1.1.1.2 misho 10235: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 10236:
1.1.1.2 misho 10237: SAVE_OPLINE();
10238: ZVAL_BOOL(result, fast_not_equal_function(result,
10239: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10240: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 10241: zval_dtor(free_op1.var);
10242:
1.1.1.2 misho 10243: CHECK_EXCEPTION();
1.1 misho 10244: ZEND_VM_NEXT_OPCODE();
10245: }
10246:
10247: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10248: {
1.1.1.2 misho 10249: USE_OPLINE
1.1 misho 10250: zend_free_op free_op1;
1.1.1.2 misho 10251: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 10252:
1.1.1.2 misho 10253: SAVE_OPLINE();
10254: ZVAL_BOOL(result, fast_is_smaller_function(result,
10255: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10256: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 10257: zval_dtor(free_op1.var);
10258:
1.1.1.2 misho 10259: CHECK_EXCEPTION();
1.1 misho 10260: ZEND_VM_NEXT_OPCODE();
10261: }
10262:
10263: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10264: {
1.1.1.2 misho 10265: USE_OPLINE
1.1 misho 10266: zend_free_op free_op1;
1.1.1.2 misho 10267: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 10268:
1.1.1.2 misho 10269: SAVE_OPLINE();
10270: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
10271: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10272: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 10273: zval_dtor(free_op1.var);
10274:
1.1.1.2 misho 10275: CHECK_EXCEPTION();
1.1 misho 10276: ZEND_VM_NEXT_OPCODE();
10277: }
10278:
10279: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10280: {
1.1.1.2 misho 10281: USE_OPLINE
1.1 misho 10282: zend_free_op free_op1;
10283:
1.1.1.2 misho 10284: SAVE_OPLINE();
10285: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
10286: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10287: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10288: zval_dtor(free_op1.var);
10289:
1.1.1.2 misho 10290: CHECK_EXCEPTION();
1.1 misho 10291: ZEND_VM_NEXT_OPCODE();
10292: }
10293:
10294: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10295: {
1.1.1.2 misho 10296: USE_OPLINE
1.1 misho 10297: zend_free_op free_op1;
10298:
1.1.1.2 misho 10299: SAVE_OPLINE();
10300: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
10301: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10302: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10303: zval_dtor(free_op1.var);
10304:
1.1.1.2 misho 10305: CHECK_EXCEPTION();
1.1 misho 10306: ZEND_VM_NEXT_OPCODE();
10307: }
10308:
10309: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10310: {
1.1.1.2 misho 10311: USE_OPLINE
1.1 misho 10312: zend_free_op free_op1;
10313:
1.1.1.2 misho 10314: SAVE_OPLINE();
10315: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
10316: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10317: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10318: zval_dtor(free_op1.var);
10319:
1.1.1.2 misho 10320: CHECK_EXCEPTION();
1.1 misho 10321: ZEND_VM_NEXT_OPCODE();
10322: }
10323:
10324: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10325: {
1.1.1.2 misho 10326: USE_OPLINE
1.1 misho 10327: zend_free_op free_op1;
10328:
1.1.1.2 misho 10329: SAVE_OPLINE();
10330: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
10331: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10332: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 10333: zval_dtor(free_op1.var);
10334:
1.1.1.2 misho 10335: CHECK_EXCEPTION();
1.1 misho 10336: ZEND_VM_NEXT_OPCODE();
10337: }
10338:
10339: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10340: {
1.1.1.2 misho 10341: USE_OPLINE
1.1 misho 10342:
1.1.1.2 misho 10343: zval *str = &EX_T(opline->result.var).tmp_var;
10344: zval *var;
1.1 misho 10345: zval var_copy;
10346: int use_copy = 0;
10347:
1.1.1.2 misho 10348: SAVE_OPLINE();
10349: var = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
10350:
1.1 misho 10351: if (IS_TMP_VAR == IS_UNUSED) {
10352: /* Initialize for erealloc in add_string_to_string */
10353: Z_STRVAL_P(str) = NULL;
10354: Z_STRLEN_P(str) = 0;
10355: Z_TYPE_P(str) = IS_STRING;
10356:
10357: INIT_PZVAL(str);
10358: }
10359:
10360: if (Z_TYPE_P(var) != IS_STRING) {
10361: zend_make_printable_zval(var, &var_copy, &use_copy);
10362:
10363: if (use_copy) {
10364: var = &var_copy;
10365: }
10366: }
10367: add_string_to_string(str, str, var);
10368:
10369: if (use_copy) {
10370: zval_dtor(var);
10371: }
10372: /* original comment, possibly problematic:
10373: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
10374: * (Zeev): I don't think it's problematic, we only use variables
10375: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
10376: * string offsets or overloaded objects
10377: */
10378:
1.1.1.2 misho 10379: CHECK_EXCEPTION();
1.1 misho 10380: ZEND_VM_NEXT_OPCODE();
10381: }
10382:
10383: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10384: {
1.1.1.2 misho 10385: USE_OPLINE
1.1 misho 10386: zval *function_name;
10387: char *function_name_strval;
10388: int function_name_strlen;
10389: zend_free_op free_op1;
10390:
1.1.1.2 misho 10391: SAVE_OPLINE();
1.1 misho 10392: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
10393:
1.1.1.2 misho 10394: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 10395:
1.1.1.2 misho 10396: if (IS_CV != IS_CONST &&
10397: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 10398: zend_error_noreturn(E_ERROR, "Method name must be a string");
10399: }
10400:
10401: function_name_strval = Z_STRVAL_P(function_name);
10402: function_name_strlen = Z_STRLEN_P(function_name);
10403:
1.1.1.2 misho 10404: EX(object) = _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 10405:
1.1.1.2 misho 10406: if (EXPECTED(EX(object) != NULL) &&
10407: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
10408: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 10409:
1.1.1.2 misho 10410: if (IS_CV != IS_CONST ||
10411: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
10412: zval *object = EX(object);
10413:
10414: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
10415: zend_error_noreturn(E_ERROR, "Object does not support method calls");
10416: }
10417:
10418: /* First, locate the function. */
10419: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
10420: if (UNEXPECTED(EX(fbc) == NULL)) {
10421: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
10422: }
10423: if (IS_CV == IS_CONST &&
10424: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
10425: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
10426: EXPECTED(EX(object) == object)) {
10427: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
10428: }
1.1 misho 10429: }
10430: } else {
10431: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
10432: }
10433:
10434: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
10435: EX(object) = NULL;
10436: } else {
10437: if (!PZVAL_IS_REF(EX(object))) {
10438: Z_ADDREF_P(EX(object)); /* For $this pointer */
10439: } else {
10440: zval *this_ptr;
10441: ALLOC_ZVAL(this_ptr);
10442: INIT_PZVAL_COPY(this_ptr, EX(object));
10443: zval_copy_ctor(this_ptr);
10444: EX(object) = this_ptr;
10445: }
10446: }
10447:
10448:
1.1.1.2 misho 10449: CHECK_EXCEPTION();
1.1 misho 10450: ZEND_VM_NEXT_OPCODE();
10451: }
10452:
10453: static int ZEND_FASTCALL ZEND_CASE_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10454: {
1.1.1.2 misho 10455: USE_OPLINE
1.1 misho 10456: zend_free_op free_op1;
10457:
1.1.1.2 misho 10458: SAVE_OPLINE();
1.1 misho 10459: if (IS_TMP_VAR==IS_VAR) {
1.1.1.2 misho 10460: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 10461: }
1.1.1.2 misho 10462: is_equal_function(&EX_T(opline->result.var).tmp_var,
10463: _get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
10464: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
10465:
10466: CHECK_EXCEPTION();
1.1 misho 10467: ZEND_VM_NEXT_OPCODE();
10468: }
10469:
10470: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10471: {
1.1.1.2 misho 10472: USE_OPLINE
1.1 misho 10473: zend_free_op free_op1;
10474: zval *expr_ptr;
10475:
1.1.1.2 misho 10476: SAVE_OPLINE();
10477: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
10478: zval **expr_ptr_ptr = NULL;
1.1 misho 10479:
1.1.1.2 misho 10480: if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
10481: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
10482: }
10483: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 10484: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 10485: Z_ADDREF_P(expr_ptr);
1.1 misho 10486: } else {
1.1.1.2 misho 10487: expr_ptr=_get_zval_ptr_tmp(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10488: if (1) { /* temporary variable */
10489: zval *new_expr;
1.1 misho 10490:
1.1.1.2 misho 10491: ALLOC_ZVAL(new_expr);
10492: INIT_PZVAL_COPY(new_expr, expr_ptr);
10493: expr_ptr = new_expr;
10494: } else if (IS_TMP_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 10495: zval *new_expr;
10496:
10497: ALLOC_ZVAL(new_expr);
10498: INIT_PZVAL_COPY(new_expr, expr_ptr);
10499: expr_ptr = new_expr;
10500: zendi_zval_copy_ctor(*expr_ptr);
10501: } else {
10502: Z_ADDREF_P(expr_ptr);
10503: }
10504: }
1.1.1.2 misho 10505:
10506: if (IS_CV != IS_UNUSED) {
10507:
10508: zval *offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
10509: ulong hval;
10510:
1.1 misho 10511: switch (Z_TYPE_P(offset)) {
10512: case IS_DOUBLE:
1.1.1.2 misho 10513: hval = zend_dval_to_lval(Z_DVAL_P(offset));
10514: goto num_index;
1.1 misho 10515: case IS_LONG:
10516: case IS_BOOL:
1.1.1.2 misho 10517: hval = Z_LVAL_P(offset);
10518: num_index:
10519: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 10520: break;
10521: case IS_STRING:
1.1.1.2 misho 10522: if (IS_CV == IS_CONST) {
10523: hval = Z_HASH_P(offset);
10524: } else {
10525: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
10526: if (IS_INTERNED(Z_STRVAL_P(offset))) {
10527: hval = INTERNED_HASH(Z_STRVAL_P(offset));
10528: } else {
10529: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
10530: }
10531: }
10532: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 10533: break;
10534: case IS_NULL:
1.1.1.2 misho 10535: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 10536: break;
10537: default:
10538: zend_error(E_WARNING, "Illegal offset type");
10539: zval_ptr_dtor(&expr_ptr);
10540: /* do nothing */
10541: break;
10542: }
10543:
10544: } else {
1.1.1.2 misho 10545: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 10546: }
1.1.1.2 misho 10547: if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && opline->extended_value) {
1.1 misho 10548:
10549: } else {
10550:
10551: }
1.1.1.2 misho 10552: CHECK_EXCEPTION();
1.1 misho 10553: ZEND_VM_NEXT_OPCODE();
10554: }
10555:
10556: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10557: {
1.1.1.2 misho 10558: USE_OPLINE
1.1 misho 10559:
1.1.1.2 misho 10560: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 10561: if (IS_TMP_VAR == IS_UNUSED) {
10562: ZEND_VM_NEXT_OPCODE();
10563: #if 0 || IS_TMP_VAR != IS_UNUSED
10564: } else {
10565: return ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
10566: #endif
10567: }
10568: }
10569:
10570: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10571: {
1.1.1.2 misho 10572: USE_OPLINE
1.1 misho 10573: zend_free_op free_op1;
10574:
1.1.1.2 misho 10575: SAVE_OPLINE();
10576: bitwise_not_function(&EX_T(opline->result.var).tmp_var,
10577: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC) TSRMLS_CC);
1.1 misho 10578: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10579: CHECK_EXCEPTION();
1.1 misho 10580: ZEND_VM_NEXT_OPCODE();
10581: }
10582:
10583: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10584: {
1.1.1.2 misho 10585: USE_OPLINE
1.1 misho 10586: zend_free_op free_op1;
10587:
1.1.1.2 misho 10588: SAVE_OPLINE();
10589: boolean_not_function(&EX_T(opline->result.var).tmp_var,
10590: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC) TSRMLS_CC);
1.1 misho 10591: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10592: CHECK_EXCEPTION();
1.1 misho 10593: ZEND_VM_NEXT_OPCODE();
10594: }
10595:
10596: static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10597: {
1.1.1.2 misho 10598: USE_OPLINE
1.1 misho 10599: zend_free_op free_op1;
1.1.1.2 misho 10600: zval **var_ptr;
10601:
10602: SAVE_OPLINE();
10603: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 10604:
1.1.1.2 misho 10605: if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 10606: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
10607: }
1.1.1.2 misho 10608: if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
10609: if (RETURN_VALUE_USED(opline)) {
10610: PZVAL_LOCK(&EG(uninitialized_zval));
10611: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 10612: }
10613: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10614: CHECK_EXCEPTION();
1.1 misho 10615: ZEND_VM_NEXT_OPCODE();
10616: }
10617:
10618: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
10619:
1.1.1.2 misho 10620: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
10621: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 10622: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
10623: /* proxy object */
10624: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
10625: Z_ADDREF_P(val);
1.1.1.2 misho 10626: fast_increment_function(val);
1.1 misho 10627: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
10628: zval_ptr_dtor(&val);
10629: } else {
1.1.1.2 misho 10630: fast_increment_function(*var_ptr);
1.1 misho 10631: }
10632:
1.1.1.2 misho 10633: if (RETURN_VALUE_USED(opline)) {
1.1 misho 10634: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 10635: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 10636: }
10637:
10638: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10639: CHECK_EXCEPTION();
1.1 misho 10640: ZEND_VM_NEXT_OPCODE();
10641: }
10642:
10643: static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10644: {
1.1.1.2 misho 10645: USE_OPLINE
1.1 misho 10646: zend_free_op free_op1;
1.1.1.2 misho 10647: zval **var_ptr;
1.1 misho 10648:
1.1.1.2 misho 10649: SAVE_OPLINE();
10650: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10651:
10652: if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 10653: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
10654: }
1.1.1.2 misho 10655: if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
10656: if (RETURN_VALUE_USED(opline)) {
10657: PZVAL_LOCK(&EG(uninitialized_zval));
10658: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 10659: }
10660: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10661: CHECK_EXCEPTION();
1.1 misho 10662: ZEND_VM_NEXT_OPCODE();
10663: }
10664:
10665: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
10666:
1.1.1.2 misho 10667: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
10668: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 10669: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
10670: /* proxy object */
10671: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
10672: Z_ADDREF_P(val);
1.1.1.2 misho 10673: fast_decrement_function(val);
1.1 misho 10674: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
10675: zval_ptr_dtor(&val);
10676: } else {
1.1.1.2 misho 10677: fast_decrement_function(*var_ptr);
1.1 misho 10678: }
10679:
1.1.1.2 misho 10680: if (RETURN_VALUE_USED(opline)) {
1.1 misho 10681: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 10682: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 10683: }
10684:
10685: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10686: CHECK_EXCEPTION();
1.1 misho 10687: ZEND_VM_NEXT_OPCODE();
10688: }
10689:
10690: static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10691: {
1.1.1.2 misho 10692: USE_OPLINE
1.1 misho 10693: zend_free_op free_op1;
1.1.1.2 misho 10694: zval **var_ptr, *retval;
1.1 misho 10695:
1.1.1.2 misho 10696: SAVE_OPLINE();
10697: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10698:
10699: if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 10700: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
10701: }
1.1.1.2 misho 10702: if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
10703: ZVAL_NULL(&EX_T(opline->result.var).tmp_var);
1.1 misho 10704: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10705: CHECK_EXCEPTION();
1.1 misho 10706: ZEND_VM_NEXT_OPCODE();
10707: }
10708:
1.1.1.2 misho 10709: retval = &EX_T(opline->result.var).tmp_var;
10710: ZVAL_COPY_VALUE(retval, *var_ptr);
10711: zendi_zval_copy_ctor(*retval);
1.1 misho 10712:
10713: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
10714:
1.1.1.2 misho 10715: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
10716: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 10717: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
10718: /* proxy object */
10719: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
10720: Z_ADDREF_P(val);
1.1.1.2 misho 10721: fast_increment_function(val);
1.1 misho 10722: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
10723: zval_ptr_dtor(&val);
10724: } else {
1.1.1.2 misho 10725: fast_increment_function(*var_ptr);
1.1 misho 10726: }
10727:
10728: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10729: CHECK_EXCEPTION();
1.1 misho 10730: ZEND_VM_NEXT_OPCODE();
10731: }
10732:
10733: static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10734: {
1.1.1.2 misho 10735: USE_OPLINE
1.1 misho 10736: zend_free_op free_op1;
1.1.1.2 misho 10737: zval **var_ptr, *retval;
1.1 misho 10738:
1.1.1.2 misho 10739: SAVE_OPLINE();
10740: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10741:
10742: if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 10743: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
10744: }
1.1.1.2 misho 10745: if (IS_VAR == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
10746: ZVAL_NULL(&EX_T(opline->result.var).tmp_var);
1.1 misho 10747: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10748: CHECK_EXCEPTION();
1.1 misho 10749: ZEND_VM_NEXT_OPCODE();
10750: }
10751:
1.1.1.2 misho 10752: retval = &EX_T(opline->result.var).tmp_var;
10753: ZVAL_COPY_VALUE(retval, *var_ptr);
10754: zendi_zval_copy_ctor(*retval);
1.1 misho 10755:
10756: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
10757:
1.1.1.2 misho 10758: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
10759: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 10760: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
10761: /* proxy object */
10762: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
10763: Z_ADDREF_P(val);
1.1.1.2 misho 10764: fast_decrement_function(val);
1.1 misho 10765: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
10766: zval_ptr_dtor(&val);
10767: } else {
1.1.1.2 misho 10768: fast_decrement_function(*var_ptr);
1.1 misho 10769: }
10770:
10771: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10772: CHECK_EXCEPTION();
1.1 misho 10773: ZEND_VM_NEXT_OPCODE();
10774: }
10775:
10776: static int ZEND_FASTCALL ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10777: {
1.1.1.2 misho 10778: USE_OPLINE
1.1 misho 10779: zend_free_op free_op1;
1.1.1.2 misho 10780: zval *z;
10781:
10782: SAVE_OPLINE();
10783: z = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 10784:
1.1.1.3 misho 10785: if (IS_VAR == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
10786: INIT_PZVAL(z);
1.1 misho 10787: }
1.1.1.3 misho 10788: zend_print_variable(z);
1.1 misho 10789:
10790: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 10791: CHECK_EXCEPTION();
1.1 misho 10792: ZEND_VM_NEXT_OPCODE();
10793: }
10794:
10795: static int ZEND_FASTCALL ZEND_PRINT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10796: {
1.1.1.2 misho 10797: USE_OPLINE
1.1 misho 10798:
1.1.1.2 misho 10799: ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
1.1 misho 10800: return ZEND_ECHO_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
10801: }
10802:
10803: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10804: {
1.1.1.2 misho 10805: USE_OPLINE
1.1 misho 10806: zend_free_op free_op1;
1.1.1.2 misho 10807: zval *val;
1.1 misho 10808: int ret;
10809:
1.1.1.2 misho 10810: SAVE_OPLINE();
10811: val = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10812:
10813: if (IS_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 10814: ret = Z_LVAL_P(val);
10815: } else {
10816: ret = i_zend_is_true(val);
10817: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10818: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 10819: HANDLE_EXCEPTION();
1.1 misho 10820: }
10821: }
10822: if (!ret) {
10823: #if DEBUG_ZEND>=2
1.1.1.2 misho 10824: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 10825: #endif
1.1.1.2 misho 10826: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 10827: ZEND_VM_CONTINUE();
10828: }
10829:
10830: ZEND_VM_NEXT_OPCODE();
10831: }
10832:
10833: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10834: {
1.1.1.2 misho 10835: USE_OPLINE
1.1 misho 10836: zend_free_op free_op1;
1.1.1.2 misho 10837: zval *val;
1.1 misho 10838: int ret;
10839:
1.1.1.2 misho 10840: SAVE_OPLINE();
10841: val = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10842:
10843: if (IS_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 10844: ret = Z_LVAL_P(val);
10845: } else {
10846: ret = i_zend_is_true(val);
10847: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10848: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 10849: HANDLE_EXCEPTION();
1.1 misho 10850: }
10851: }
10852: if (ret) {
10853: #if DEBUG_ZEND>=2
1.1.1.2 misho 10854: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 10855: #endif
1.1.1.2 misho 10856: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 10857: ZEND_VM_CONTINUE();
10858: }
10859:
10860: ZEND_VM_NEXT_OPCODE();
10861: }
10862:
10863: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10864: {
1.1.1.2 misho 10865: USE_OPLINE
1.1 misho 10866: zend_free_op free_op1;
1.1.1.2 misho 10867: zval *val;
1.1 misho 10868: int retval;
10869:
1.1.1.2 misho 10870: SAVE_OPLINE();
10871: val = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10872:
10873: if (IS_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 10874: retval = Z_LVAL_P(val);
10875: } else {
10876: retval = i_zend_is_true(val);
10877: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10878: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 10879: HANDLE_EXCEPTION();
1.1 misho 10880: }
10881: }
10882: if (EXPECTED(retval != 0)) {
10883: #if DEBUG_ZEND>=2
10884: printf("Conditional jmp on true to %d\n", opline->extended_value);
10885: #endif
10886: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
10887: ZEND_VM_CONTINUE(); /* CHECK_ME */
10888: } else {
10889: #if DEBUG_ZEND>=2
1.1.1.2 misho 10890: printf("Conditional jmp on false to %d\n", opline->op2.opline_num);
1.1 misho 10891: #endif
1.1.1.2 misho 10892: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.opline_num]);
1.1 misho 10893: ZEND_VM_CONTINUE(); /* CHECK_ME */
10894: }
10895: }
10896:
10897: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10898: {
1.1.1.2 misho 10899: USE_OPLINE
1.1 misho 10900: zend_free_op free_op1;
1.1.1.2 misho 10901: zval *val;
1.1 misho 10902: int retval;
10903:
1.1.1.2 misho 10904: SAVE_OPLINE();
10905: val = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10906:
10907: if (IS_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 10908: retval = Z_LVAL_P(val);
10909: } else {
10910: retval = i_zend_is_true(val);
10911: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10912: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 10913: HANDLE_EXCEPTION();
1.1 misho 10914: }
10915: }
1.1.1.2 misho 10916: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
10917: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 10918: if (!retval) {
10919: #if DEBUG_ZEND>=2
1.1.1.2 misho 10920: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 10921: #endif
1.1.1.2 misho 10922: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 10923: ZEND_VM_CONTINUE();
10924: }
10925: ZEND_VM_NEXT_OPCODE();
10926: }
10927:
10928: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10929: {
1.1.1.2 misho 10930: USE_OPLINE
1.1 misho 10931: zend_free_op free_op1;
1.1.1.2 misho 10932: zval *val;
1.1 misho 10933: int retval;
10934:
1.1.1.2 misho 10935: SAVE_OPLINE();
10936: val = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10937:
10938: if (IS_VAR == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 10939: retval = Z_LVAL_P(val);
10940: } else {
10941: retval = i_zend_is_true(val);
10942: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10943: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 10944: HANDLE_EXCEPTION();
1.1 misho 10945: }
10946: }
1.1.1.2 misho 10947: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
10948: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 10949: if (retval) {
10950: #if DEBUG_ZEND>=2
1.1.1.2 misho 10951: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 10952: #endif
1.1.1.2 misho 10953: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 10954: ZEND_VM_CONTINUE();
10955: }
10956: ZEND_VM_NEXT_OPCODE();
10957: }
10958:
1.1.1.2 misho 10959: static int ZEND_FASTCALL ZEND_FREE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10960: {
10961: USE_OPLINE
10962:
10963: SAVE_OPLINE();
10964: if (IS_VAR == IS_TMP_VAR) {
10965: zendi_zval_dtor(EX_T(opline->op1.var).tmp_var);
10966: } else {
10967: zval_ptr_dtor(&EX_T(opline->op1.var).var.ptr);
10968: }
10969: CHECK_EXCEPTION();
10970: ZEND_VM_NEXT_OPCODE();
10971: }
10972:
1.1 misho 10973: static int ZEND_FASTCALL ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
10974: {
1.1.1.2 misho 10975: USE_OPLINE
10976: zval *retval_ptr;
10977: zend_free_op free_op1;
10978:
10979: SAVE_OPLINE();
10980: retval_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
10981:
10982: if (!EG(return_value_ptr_ptr)) {
10983: if (IS_VAR == IS_TMP_VAR) {
10984: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
10985: }
10986: } else if (!0) { /* Not a temp var */
10987: if (IS_VAR == IS_CONST ||
10988: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
10989: zval *ret;
10990:
10991: ALLOC_ZVAL(ret);
10992: INIT_PZVAL_COPY(ret, retval_ptr);
10993: zval_copy_ctor(ret);
10994: *EG(return_value_ptr_ptr) = ret;
10995: } else if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
10996: retval_ptr == &EG(uninitialized_zval)) {
10997: zval *ret;
10998:
10999: ALLOC_INIT_ZVAL(ret);
11000: *EG(return_value_ptr_ptr) = ret;
11001: } else {
11002: *EG(return_value_ptr_ptr) = retval_ptr;
11003: Z_ADDREF_P(retval_ptr);
11004: }
11005: } else {
11006: zval *ret;
11007:
11008: ALLOC_ZVAL(ret);
11009: INIT_PZVAL_COPY(ret, retval_ptr);
11010: *EG(return_value_ptr_ptr) = ret;
11011: }
11012: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11013: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11014: }
11015:
11016: static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11017: {
11018: USE_OPLINE
1.1 misho 11019: zval *retval_ptr;
11020: zval **retval_ptr_ptr;
11021: zend_free_op free_op1;
11022:
1.1.1.2 misho 11023: SAVE_OPLINE();
1.1 misho 11024:
1.1.1.2 misho 11025: do {
1.1 misho 11026: if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
11027: /* Not supposed to happen, but we'll allow it */
11028: zend_error(E_NOTICE, "Only variable references should be returned by reference");
1.1.1.2 misho 11029:
11030: retval_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11031: if (!EG(return_value_ptr_ptr)) {
11032: if (IS_VAR == IS_TMP_VAR) {
11033: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11034: }
11035: } else if (!0) { /* Not a temp var */
11036: zval *ret;
11037:
11038: ALLOC_ZVAL(ret);
11039: INIT_PZVAL_COPY(ret, retval_ptr);
11040: zval_copy_ctor(ret);
11041: *EG(return_value_ptr_ptr) = ret;
11042: } else {
11043: zval *ret;
11044:
11045: ALLOC_ZVAL(ret);
11046: INIT_PZVAL_COPY(ret, retval_ptr);
11047: *EG(return_value_ptr_ptr) = ret;
11048: }
11049: break;
1.1 misho 11050: }
11051:
1.1.1.2 misho 11052: retval_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11053:
1.1.1.2 misho 11054: if (IS_VAR == IS_VAR && UNEXPECTED(retval_ptr_ptr == NULL)) {
1.1 misho 11055: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
11056: }
11057:
11058: if (IS_VAR == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
11059: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
1.1.1.2 misho 11060: EX_T(opline->op1.var).var.fcall_returned_reference) {
11061: } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
1.1 misho 11062: zend_error(E_NOTICE, "Only variable references should be returned by reference");
1.1.1.2 misho 11063: if (EG(return_value_ptr_ptr)) {
1.1.1.4 misho 11064: zval *ret;
11065:
11066: ALLOC_ZVAL(ret);
11067: INIT_PZVAL_COPY(ret, *retval_ptr_ptr);
11068: zval_copy_ctor(ret);
11069: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 11070: }
11071: break;
1.1 misho 11072: }
11073: }
11074:
11075: if (EG(return_value_ptr_ptr)) {
11076: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
11077: Z_ADDREF_PP(retval_ptr_ptr);
11078:
1.1.1.2 misho 11079: *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
1.1 misho 11080: }
1.1.1.2 misho 11081: } while (0);
1.1 misho 11082:
11083: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11084: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11085: }
11086:
11087: static int ZEND_FASTCALL ZEND_THROW_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11088: {
1.1.1.2 misho 11089: USE_OPLINE
1.1 misho 11090: zval *value;
11091: zval *exception;
11092: zend_free_op free_op1;
11093:
1.1.1.2 misho 11094: SAVE_OPLINE();
11095: value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11096:
1.1.1.2 misho 11097: if (IS_VAR == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
1.1 misho 11098: zend_error_noreturn(E_ERROR, "Can only throw objects");
11099: }
11100: zend_exception_save(TSRMLS_C);
11101: /* Not sure if a complete copy is what we want here */
11102: ALLOC_ZVAL(exception);
11103: INIT_PZVAL_COPY(exception, value);
11104: if (!0) {
11105: zval_copy_ctor(exception);
11106: }
11107:
11108: zend_throw_exception_object(exception TSRMLS_CC);
11109: zend_exception_restore(TSRMLS_C);
11110: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11111: HANDLE_EXCEPTION();
1.1 misho 11112: }
11113:
11114: static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS)
11115: {
1.1.1.2 misho 11116: USE_OPLINE
1.1 misho 11117: zval *varptr;
11118: zend_free_op free_op1;
1.1.1.2 misho 11119: varptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11120:
11121: if (varptr == &EG(uninitialized_zval)) {
11122: ALLOC_ZVAL(varptr);
11123: INIT_ZVAL(*varptr);
11124: Z_SET_REFCOUNT_P(varptr, 0);
11125: } else if (PZVAL_IS_REF(varptr)) {
11126: zval *original_var = varptr;
11127:
11128: ALLOC_ZVAL(varptr);
1.1.1.2 misho 11129: ZVAL_COPY_VALUE(varptr, original_var);
1.1 misho 11130: Z_UNSET_ISREF_P(varptr);
11131: Z_SET_REFCOUNT_P(varptr, 0);
11132: zval_copy_ctor(varptr);
11133: }
11134: Z_ADDREF_P(varptr);
11135: zend_vm_stack_push(varptr TSRMLS_CC);
11136: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; /* for string offsets */
11137:
1.1.1.2 misho 11138: CHECK_EXCEPTION();
1.1 misho 11139: ZEND_VM_NEXT_OPCODE();
11140: }
11141:
11142: static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11143: {
1.1.1.2 misho 11144: USE_OPLINE
1.1 misho 11145: zend_free_op free_op1;
11146: zval *varptr;
11147:
1.1.1.2 misho 11148: SAVE_OPLINE();
1.1 misho 11149: if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
11150: if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
11151: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11152: }
1.1.1.2 misho 11153: } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 11154: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11155: }
11156:
11157: if (IS_VAR == IS_VAR &&
11158: (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
1.1.1.2 misho 11159: EX_T(opline->op1.var).var.fcall_returned_reference &&
11160: EX_T(opline->op1.var).var.ptr) {
11161: varptr = EX_T(opline->op1.var).var.ptr;
1.1 misho 11162: PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
11163: } else {
1.1.1.2 misho 11164: varptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11165: }
11166: if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
1.1.1.2 misho 11167: EX_T(opline->op1.var).var.fcall_returned_reference) &&
1.1 misho 11168: varptr != &EG(uninitialized_zval) &&
11169: (PZVAL_IS_REF(varptr) ||
11170: (Z_REFCOUNT_P(varptr) == 1 && (IS_VAR == IS_CV || free_op1.var)))) {
11171: Z_SET_ISREF_P(varptr);
11172: Z_ADDREF_P(varptr);
11173: zend_vm_stack_push(varptr TSRMLS_CC);
11174: } else {
11175: zval *valptr;
11176:
11177: if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
11178: !(opline->extended_value & ZEND_ARG_SEND_SILENT) :
1.1.1.2 misho 11179: !ARG_MAY_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 11180: zend_error(E_STRICT, "Only variables should be passed by reference");
11181: }
11182: ALLOC_ZVAL(valptr);
11183: INIT_PZVAL_COPY(valptr, varptr);
11184: if (!0) {
11185: zval_copy_ctor(valptr);
11186: }
11187: zend_vm_stack_push(valptr TSRMLS_CC);
11188: }
11189: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11190: CHECK_EXCEPTION();
1.1 misho 11191: ZEND_VM_NEXT_OPCODE();
11192: }
11193:
11194: static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11195: {
1.1.1.2 misho 11196: USE_OPLINE
1.1 misho 11197: zend_free_op free_op1;
11198: zval **varptr_ptr;
11199: zval *varptr;
11200:
1.1.1.2 misho 11201: SAVE_OPLINE();
11202: varptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11203:
11204: if (IS_VAR == IS_VAR && UNEXPECTED(varptr_ptr == NULL)) {
1.1 misho 11205: zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
11206: }
11207:
1.1.1.2 misho 11208: if (IS_VAR == IS_VAR && UNEXPECTED(*varptr_ptr == &EG(error_zval))) {
1.1 misho 11209: ALLOC_INIT_ZVAL(varptr);
11210: zend_vm_stack_push(varptr TSRMLS_CC);
1.1.1.2 misho 11211: CHECK_EXCEPTION();
1.1 misho 11212: ZEND_VM_NEXT_OPCODE();
11213: }
11214:
1.1.1.3 misho 11215: if (opline->extended_value == ZEND_DO_FCALL_BY_NAME &&
11216: EX(function_state).function->type == ZEND_INTERNAL_FUNCTION &&
11217: !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 11218: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11219: }
11220:
11221: SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr);
11222: varptr = *varptr_ptr;
11223: Z_ADDREF_P(varptr);
11224: zend_vm_stack_push(varptr TSRMLS_CC);
11225:
11226: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11227: CHECK_EXCEPTION();
1.1 misho 11228: ZEND_VM_NEXT_OPCODE();
11229: }
11230:
11231: static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11232: {
1.1.1.2 misho 11233: USE_OPLINE
1.1 misho 11234:
11235: if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME)
1.1.1.2 misho 11236: && ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 11237: return ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11238: }
1.1.1.2 misho 11239: SAVE_OPLINE();
1.1 misho 11240: return zend_send_by_var_helper_SPEC_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
11241: }
11242:
11243: static int ZEND_FASTCALL ZEND_BOOL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11244: {
1.1.1.2 misho 11245: USE_OPLINE
1.1 misho 11246: zend_free_op free_op1;
1.1.1.2 misho 11247: zval *retval = &EX_T(opline->result.var).tmp_var;
1.1 misho 11248:
1.1.1.2 misho 11249: SAVE_OPLINE();
1.1 misho 11250: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
1.1.1.2 misho 11251: ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC)));
1.1 misho 11252: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11253:
1.1.1.2 misho 11254: CHECK_EXCEPTION();
1.1 misho 11255: ZEND_VM_NEXT_OPCODE();
11256: }
11257:
11258: static int ZEND_FASTCALL ZEND_SWITCH_FREE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11259: {
1.1.1.2 misho 11260: USE_OPLINE
1.1 misho 11261:
1.1.1.2 misho 11262: SAVE_OPLINE();
11263: zval_ptr_dtor(&EX_T(opline->op1.var).var.ptr);
11264: CHECK_EXCEPTION();
1.1 misho 11265: ZEND_VM_NEXT_OPCODE();
11266: }
11267:
11268: static int ZEND_FASTCALL ZEND_CLONE_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11269: {
1.1.1.2 misho 11270: USE_OPLINE
1.1 misho 11271: zend_free_op free_op1;
1.1.1.2 misho 11272: zval *obj;
1.1 misho 11273: zend_class_entry *ce;
11274: zend_function *clone;
11275: zend_object_clone_obj_t clone_call;
11276:
1.1.1.2 misho 11277: SAVE_OPLINE();
11278: obj = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11279:
1.1 misho 11280: if (IS_VAR == IS_CONST ||
1.1.1.2 misho 11281: UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
1.1 misho 11282: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
11283: }
11284:
11285: ce = Z_OBJCE_P(obj);
11286: clone = ce ? ce->clone : NULL;
11287: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
1.1.1.2 misho 11288: if (UNEXPECTED(clone_call == NULL)) {
1.1 misho 11289: if (ce) {
11290: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
11291: } else {
11292: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
11293: }
11294: }
11295:
11296: if (ce && clone) {
11297: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
11298: /* Ensure that if we're calling a private function, we're allowed to do so.
11299: */
1.1.1.2 misho 11300: if (UNEXPECTED(ce != EG(scope))) {
1.1 misho 11301: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
11302: }
11303: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
11304: /* Ensure that if we're calling a protected function, we're allowed to do so.
11305: */
1.1.1.3 misho 11306: if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
1.1 misho 11307: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
11308: }
11309: }
11310: }
11311:
1.1.1.2 misho 11312: if (EXPECTED(EG(exception) == NULL)) {
11313: zval *retval;
11314:
11315: ALLOC_ZVAL(retval);
11316: Z_OBJVAL_P(retval) = clone_call(obj TSRMLS_CC);
11317: Z_TYPE_P(retval) = IS_OBJECT;
11318: Z_SET_REFCOUNT_P(retval, 1);
11319: Z_SET_ISREF_P(retval);
11320: if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
11321: zval_ptr_dtor(&retval);
11322: } else {
11323: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 11324: }
11325: }
11326: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11327: CHECK_EXCEPTION();
1.1 misho 11328: ZEND_VM_NEXT_OPCODE();
11329: }
11330:
11331: static int ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11332: {
1.1.1.2 misho 11333: USE_OPLINE
1.1 misho 11334: zend_free_op free_op1;
1.1.1.2 misho 11335: zval *expr;
11336: zval *result = &EX_T(opline->result.var).tmp_var;
11337:
11338: SAVE_OPLINE();
11339: expr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11340:
11341: if (opline->extended_value != IS_STRING) {
1.1.1.2 misho 11342: ZVAL_COPY_VALUE(result, expr);
1.1 misho 11343: if (!0) {
11344: zendi_zval_copy_ctor(*result);
11345: }
11346: }
11347: switch (opline->extended_value) {
11348: case IS_NULL:
11349: convert_to_null(result);
11350: break;
11351: case IS_BOOL:
11352: convert_to_boolean(result);
11353: break;
11354: case IS_LONG:
11355: convert_to_long(result);
11356: break;
11357: case IS_DOUBLE:
11358: convert_to_double(result);
11359: break;
11360: case IS_STRING: {
11361: zval var_copy;
11362: int use_copy;
11363:
11364: zend_make_printable_zval(expr, &var_copy, &use_copy);
11365: if (use_copy) {
1.1.1.2 misho 11366: ZVAL_COPY_VALUE(result, &var_copy);
1.1 misho 11367: if (0) {
11368: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11369: }
11370: } else {
1.1.1.2 misho 11371: ZVAL_COPY_VALUE(result, expr);
1.1 misho 11372: if (!0) {
11373: zendi_zval_copy_ctor(*result);
11374: }
11375: }
11376: break;
11377: }
11378: case IS_ARRAY:
11379: convert_to_array(result);
11380: break;
11381: case IS_OBJECT:
11382: convert_to_object(result);
11383: break;
11384: }
11385: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11386: CHECK_EXCEPTION();
1.1 misho 11387: ZEND_VM_NEXT_OPCODE();
11388: }
11389:
11390: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11391: {
1.1.1.2 misho 11392: USE_OPLINE
1.1 misho 11393: zend_op_array *new_op_array=NULL;
11394: zend_free_op free_op1;
1.1.1.2 misho 11395: zval *inc_filename;
11396: zval *tmp_inc_filename = NULL;
1.1 misho 11397: zend_bool failure_retval=0;
11398:
1.1.1.2 misho 11399: SAVE_OPLINE();
11400: inc_filename = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11401:
1.1 misho 11402: if (inc_filename->type!=IS_STRING) {
1.1.1.2 misho 11403: MAKE_STD_ZVAL(tmp_inc_filename);
11404: ZVAL_COPY_VALUE(tmp_inc_filename, inc_filename);
11405: zval_copy_ctor(tmp_inc_filename);
11406: convert_to_string(tmp_inc_filename);
11407: inc_filename = tmp_inc_filename;
1.1 misho 11408: }
11409:
1.1.1.2 misho 11410: if (opline->extended_value != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
11411: if (opline->extended_value == ZEND_INCLUDE_ONCE || opline->extended_value == ZEND_INCLUDE) {
1.1 misho 11412: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
11413: } else {
11414: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
11415: }
11416: } else {
1.1.1.2 misho 11417: switch (opline->extended_value) {
1.1 misho 11418: case ZEND_INCLUDE_ONCE:
11419: case ZEND_REQUIRE_ONCE: {
11420: zend_file_handle file_handle;
11421: char *resolved_path;
11422:
11423: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
11424: if (resolved_path) {
11425: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
11426: } else {
11427: resolved_path = Z_STRVAL_P(inc_filename);
11428: }
11429:
11430: if (failure_retval) {
11431: /* do nothing, file already included */
11432: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
11433:
11434: if (!file_handle.opened_path) {
11435: file_handle.opened_path = estrdup(resolved_path);
11436: }
11437:
11438: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
1.1.1.2 misho 11439: new_op_array = zend_compile_file(&file_handle, (opline->extended_value==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
1.1 misho 11440: zend_destroy_file_handle(&file_handle TSRMLS_CC);
11441: } else {
11442: zend_file_handle_dtor(&file_handle TSRMLS_CC);
11443: failure_retval=1;
11444: }
11445: } else {
1.1.1.2 misho 11446: if (opline->extended_value == ZEND_INCLUDE_ONCE) {
1.1 misho 11447: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
11448: } else {
11449: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
11450: }
11451: }
11452: if (resolved_path != Z_STRVAL_P(inc_filename)) {
11453: efree(resolved_path);
11454: }
11455: }
11456: break;
11457: case ZEND_INCLUDE:
11458: case ZEND_REQUIRE:
1.1.1.2 misho 11459: new_op_array = compile_filename(opline->extended_value, inc_filename TSRMLS_CC);
1.1 misho 11460: break;
11461: case ZEND_EVAL: {
11462: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
11463:
11464: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
11465: efree(eval_desc);
11466: }
11467: break;
11468: EMPTY_SWITCH_DEFAULT_CASE()
11469: }
11470: }
1.1.1.2 misho 11471: if (tmp_inc_filename) {
11472: zval_ptr_dtor(&tmp_inc_filename);
1.1 misho 11473: }
11474: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11475: if (UNEXPECTED(EG(exception) != NULL)) {
11476: HANDLE_EXCEPTION();
11477: } else if (EXPECTED(new_op_array != NULL)) {
1.1 misho 11478: EX(original_return_value) = EG(return_value_ptr_ptr);
11479: EG(active_op_array) = new_op_array;
1.1.1.2 misho 11480: if (RETURN_VALUE_USED(opline)) {
11481: EX_T(opline->result.var).var.ptr = NULL;
11482: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
11483: EG(return_value_ptr_ptr) = EX_T(opline->result.var).var.ptr_ptr;
11484: } else {
11485: EG(return_value_ptr_ptr) = NULL;
11486: }
1.1 misho 11487:
11488: EX(current_object) = EX(object);
11489:
11490: EX(function_state).function = (zend_function *) new_op_array;
11491: EX(object) = NULL;
11492:
11493: if (!EG(active_symbol_table)) {
11494: zend_rebuild_symbol_table(TSRMLS_C);
11495: }
11496:
1.1.1.2 misho 11497: if (EXPECTED(zend_execute == execute)) {
1.1 misho 11498: ZEND_VM_ENTER();
11499: } else {
11500: zend_execute(new_op_array TSRMLS_CC);
11501: }
11502:
1.1.1.2 misho 11503: EX(function_state).function = (zend_function *) EX(op_array);
11504: EX(object) = EX(current_object);
1.1 misho 11505:
1.1.1.2 misho 11506: EG(opline_ptr) = &EX(opline);
11507: EG(active_op_array) = EX(op_array);
11508: EG(return_value_ptr_ptr) = EX(original_return_value);
11509: destroy_op_array(new_op_array TSRMLS_CC);
11510: efree(new_op_array);
11511: if (UNEXPECTED(EG(exception) != NULL)) {
11512: zend_throw_exception_internal(NULL TSRMLS_CC);
11513: HANDLE_EXCEPTION();
11514: } else if (RETURN_VALUE_USED(opline)) {
11515: if (!EX_T(opline->result.var).var.ptr) { /* there was no return statement */
11516: zval *retval;
1.1 misho 11517:
1.1.1.2 misho 11518: ALLOC_ZVAL(retval);
11519: ZVAL_BOOL(retval, 1);
11520: INIT_PZVAL(retval);
11521: EX_T(opline->result.var).var.ptr = retval;
11522: }
1.1 misho 11523: }
11524:
1.1.1.2 misho 11525: } else if (RETURN_VALUE_USED(opline)) {
11526: zval *retval;
11527:
11528: ALLOC_ZVAL(retval);
11529: ZVAL_BOOL(retval, failure_retval);
11530: INIT_PZVAL(retval);
11531: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 11532: }
11533: ZEND_VM_NEXT_OPCODE();
11534: }
11535:
11536: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11537: {
1.1.1.2 misho 11538: USE_OPLINE
1.1 misho 11539: zend_free_op free_op1;
11540: zval *array_ptr, **array_ptr_ptr;
11541: HashTable *fe_ht;
11542: zend_object_iterator *iter = NULL;
11543: zend_class_entry *ce = NULL;
11544: zend_bool is_empty = 0;
11545:
1.1.1.2 misho 11546: SAVE_OPLINE();
11547:
11548: if ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
11549: (opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
11550: array_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11551: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
1.1.1.2 misho 11552: MAKE_STD_ZVAL(array_ptr);
11553: ZVAL_NULL(array_ptr);
1.1 misho 11554: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
11555: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
11556: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
1.1.1.2 misho 11557: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11558: }
11559:
11560: ce = Z_OBJCE_PP(array_ptr_ptr);
11561: if (!ce || ce->get_iterator == NULL) {
11562: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
11563: Z_ADDREF_PP(array_ptr_ptr);
11564: }
11565: array_ptr = *array_ptr_ptr;
11566: } else {
11567: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
11568: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
11569: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
11570: Z_SET_ISREF_PP(array_ptr_ptr);
11571: }
11572: }
11573: array_ptr = *array_ptr_ptr;
11574: Z_ADDREF_P(array_ptr);
11575: }
11576: } else {
1.1.1.2 misho 11577: array_ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11578: if (0) { /* IS_TMP_VAR */
11579: zval *tmp;
11580:
11581: ALLOC_ZVAL(tmp);
11582: INIT_PZVAL_COPY(tmp, array_ptr);
11583: array_ptr = tmp;
11584: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
11585: ce = Z_OBJCE_P(array_ptr);
11586: if (ce && ce->get_iterator) {
11587: Z_DELREF_P(array_ptr);
11588: }
11589: }
11590: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
11591: ce = Z_OBJCE_P(array_ptr);
11592: if (!ce || !ce->get_iterator) {
11593: Z_ADDREF_P(array_ptr);
11594: }
11595: } else if (IS_VAR == IS_CONST ||
11596: ((IS_VAR == IS_CV || IS_VAR == IS_VAR) &&
11597: !Z_ISREF_P(array_ptr) &&
11598: Z_REFCOUNT_P(array_ptr) > 1)) {
11599: zval *tmp;
11600:
11601: ALLOC_ZVAL(tmp);
11602: INIT_PZVAL_COPY(tmp, array_ptr);
11603: zval_copy_ctor(tmp);
11604: array_ptr = tmp;
11605: } else {
11606: Z_ADDREF_P(array_ptr);
11607: }
11608: }
11609:
11610: if (ce && ce->get_iterator) {
11611: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
11612:
1.1.1.2 misho 11613: if (iter && EXPECTED(EG(exception) == NULL)) {
1.1 misho 11614: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
11615: } else {
1.1.1.2 misho 11616: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 11617: if (!EG(exception)) {
11618: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
11619: }
11620: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 11621: HANDLE_EXCEPTION();
1.1 misho 11622: }
11623: }
11624:
1.1.1.2 misho 11625: EX_T(opline->result.var).fe.ptr = array_ptr;
1.1 misho 11626:
11627: if (iter) {
11628: iter->index = 0;
11629: if (iter->funcs->rewind) {
11630: iter->funcs->rewind(iter TSRMLS_CC);
1.1.1.2 misho 11631: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11632: zval_ptr_dtor(&array_ptr);
1.1.1.2 misho 11633: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11634: HANDLE_EXCEPTION();
1.1 misho 11635: }
11636: }
11637: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
1.1.1.2 misho 11638: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11639: zval_ptr_dtor(&array_ptr);
1.1.1.2 misho 11640: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11641: HANDLE_EXCEPTION();
1.1 misho 11642: }
11643: iter->index = -1; /* will be set to 0 before using next handler */
11644: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
11645: zend_hash_internal_pointer_reset(fe_ht);
11646: if (ce) {
11647: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
11648: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
11649: char *str_key;
11650: uint str_key_len;
11651: ulong int_key;
11652: zend_uchar key_type;
11653:
11654: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
11655: if (key_type != HASH_KEY_NON_EXISTANT &&
11656: (key_type == HASH_KEY_IS_LONG ||
11657: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
11658: break;
11659: }
11660: zend_hash_move_forward(fe_ht);
11661: }
11662: }
11663: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
1.1.1.2 misho 11664: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.var).fe.fe_pos);
1.1 misho 11665: } else {
11666: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
11667: is_empty = 1;
11668: }
11669:
1.1.1.2 misho 11670: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 11671: if (is_empty) {
1.1.1.2 misho 11672: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11673: } else {
1.1.1.2 misho 11674: CHECK_EXCEPTION();
1.1 misho 11675: ZEND_VM_NEXT_OPCODE();
11676: }
11677: }
11678:
11679: static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11680: {
1.1.1.2 misho 11681: USE_OPLINE
1.1 misho 11682:
1.1.1.2 misho 11683: zval *array = EX_T(opline->op1.var).fe.ptr;
1.1 misho 11684: zval **value;
11685: char *str_key;
11686: uint str_key_len;
11687: ulong int_key;
11688: HashTable *fe_ht;
11689: zend_object_iterator *iter = NULL;
11690: int key_type = 0;
11691: zend_bool use_key = (zend_bool)(opline->extended_value & ZEND_FE_FETCH_WITH_KEY);
11692:
1.1.1.2 misho 11693: SAVE_OPLINE();
11694:
1.1 misho 11695: switch (zend_iterator_unwrap(array, &iter TSRMLS_CC)) {
11696: default:
11697: case ZEND_ITER_INVALID:
11698: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
1.1.1.2 misho 11699: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11700:
11701: case ZEND_ITER_PLAIN_OBJECT: {
1.1.1.2 misho 11702: const char *class_name, *prop_name;
1.1 misho 11703: zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
11704:
1.1.1.2 misho 11705: fe_ht = Z_OBJPROP_P(array);
11706: zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
1.1 misho 11707: do {
11708: if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
11709: /* reached end of iteration */
1.1.1.2 misho 11710: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11711: }
11712: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
11713:
11714: zend_hash_move_forward(fe_ht);
11715: } while (key_type == HASH_KEY_NON_EXISTANT ||
11716: (key_type != HASH_KEY_IS_LONG &&
11717: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS));
1.1.1.2 misho 11718: zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
1.1 misho 11719: if (use_key && key_type != HASH_KEY_IS_LONG) {
11720: zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name);
11721: str_key_len = strlen(prop_name);
11722: str_key = estrndup(prop_name, str_key_len);
11723: str_key_len++;
11724: }
11725: break;
11726: }
11727:
11728: case ZEND_ITER_PLAIN_ARRAY:
1.1.1.2 misho 11729: fe_ht = Z_ARRVAL_P(array);
11730: zend_hash_set_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
1.1 misho 11731: if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
11732: /* reached end of iteration */
1.1.1.2 misho 11733: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11734: }
11735: if (use_key) {
11736: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
11737: }
11738: zend_hash_move_forward(fe_ht);
1.1.1.2 misho 11739: zend_hash_get_pointer(fe_ht, &EX_T(opline->op1.var).fe.fe_pos);
1.1 misho 11740: break;
11741:
11742: case ZEND_ITER_OBJECT:
11743: /* !iter happens from exception */
11744: if (iter && ++iter->index > 0) {
11745: /* This could cause an endless loop if index becomes zero again.
11746: * In case that ever happens we need an additional flag. */
11747: iter->funcs->move_forward(iter TSRMLS_CC);
1.1.1.2 misho 11748: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11749: zval_ptr_dtor(&array);
1.1.1.2 misho 11750: HANDLE_EXCEPTION();
1.1 misho 11751: }
11752: }
11753: /* If index is zero we come from FE_RESET and checked valid() already. */
11754: if (!iter || (iter->index > 0 && iter->funcs->valid(iter TSRMLS_CC) == FAILURE)) {
11755: /* reached end of iteration */
1.1.1.2 misho 11756: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11757: zval_ptr_dtor(&array);
1.1.1.2 misho 11758: HANDLE_EXCEPTION();
1.1 misho 11759: }
1.1.1.2 misho 11760: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11761: }
11762: iter->funcs->get_current_data(iter, &value TSRMLS_CC);
1.1.1.2 misho 11763: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11764: zval_ptr_dtor(&array);
1.1.1.2 misho 11765: HANDLE_EXCEPTION();
1.1 misho 11766: }
11767: if (!value) {
11768: /* failure in get_current_data */
1.1.1.2 misho 11769: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 11770: }
11771: if (use_key) {
11772: if (iter->funcs->get_current_key) {
11773: key_type = iter->funcs->get_current_key(iter, &str_key, &str_key_len, &int_key TSRMLS_CC);
1.1.1.2 misho 11774: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 11775: zval_ptr_dtor(&array);
1.1.1.2 misho 11776: HANDLE_EXCEPTION();
1.1 misho 11777: }
11778: } else {
11779: key_type = HASH_KEY_IS_LONG;
11780: int_key = iter->index;
11781: }
11782: }
11783: break;
11784: }
11785:
11786: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
11787: SEPARATE_ZVAL_IF_NOT_REF(value);
11788: Z_SET_ISREF_PP(value);
1.1.1.2 misho 11789: EX_T(opline->result.var).var.ptr_ptr = value;
1.1 misho 11790: Z_ADDREF_PP(value);
11791: } else {
11792: PZVAL_LOCK(*value);
1.1.1.2 misho 11793: AI_SET_PTR(&EX_T(opline->result.var), *value);
1.1 misho 11794: }
11795:
11796: if (use_key) {
1.1.1.2 misho 11797: zval *key = &EX_T((opline+1)->result.var).tmp_var;
1.1 misho 11798:
11799: switch (key_type) {
11800: case HASH_KEY_IS_STRING:
1.1.1.2 misho 11801: Z_STRVAL_P(key) = (char*)str_key;
1.1 misho 11802: Z_STRLEN_P(key) = str_key_len-1;
11803: Z_TYPE_P(key) = IS_STRING;
11804: break;
11805: case HASH_KEY_IS_LONG:
11806: Z_LVAL_P(key) = int_key;
11807: Z_TYPE_P(key) = IS_LONG;
11808: break;
11809: default:
11810: case HASH_KEY_NON_EXISTANT:
11811: ZVAL_NULL(key);
11812: break;
11813: }
11814: }
11815:
1.1.1.2 misho 11816: CHECK_EXCEPTION();
1.1 misho 11817: ZEND_VM_INC_OPCODE();
11818: ZEND_VM_NEXT_OPCODE();
11819: }
11820:
11821: static int ZEND_FASTCALL ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11822: {
11823: #if 0 || (IS_VAR != IS_UNUSED)
1.1.1.2 misho 11824: USE_OPLINE
11825:
11826: SAVE_OPLINE();
1.1 misho 11827: if (IS_VAR != IS_UNUSED) {
11828: zend_free_op free_op1;
1.1.1.2 misho 11829: zval *ptr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11830:
11831: if (Z_TYPE_P(ptr) == IS_LONG) {
11832: EG(exit_status) = Z_LVAL_P(ptr);
11833: } else {
11834: zend_print_variable(ptr);
11835: }
11836: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11837: }
11838: #endif
11839: zend_bailout();
1.1.1.2 misho 11840: ZEND_VM_NEXT_OPCODE(); /* Never reached */
1.1 misho 11841: }
11842:
11843: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11844: {
1.1.1.2 misho 11845: USE_OPLINE
11846: zend_free_op free_op1;
11847: zval *value;
11848:
11849: SAVE_OPLINE();
11850: value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11851:
11852: if (i_zend_is_true(value)) {
11853: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
11854: if (!0) {
11855: zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
11856: }
11857: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11858: #if DEBUG_ZEND>=2
11859: printf("Conditional jmp to %d\n", opline->op2.opline_num);
11860: #endif
11861: ZEND_VM_JMP(opline->op2.jmp_addr);
11862: }
11863:
11864: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11865: CHECK_EXCEPTION();
11866: ZEND_VM_NEXT_OPCODE();
11867: }
11868:
11869: static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11870: {
11871: USE_OPLINE
1.1 misho 11872: zend_free_op free_op1;
1.1.1.2 misho 11873: zval *value, *ret;
11874:
11875: SAVE_OPLINE();
11876: value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 11877:
11878: if (i_zend_is_true(value)) {
1.1.1.2 misho 11879: if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
11880: Z_ADDREF_P(value);
11881: EX_T(opline->result.var).var.ptr = value;
11882: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
11883: } else {
11884: ALLOC_ZVAL(ret);
11885: INIT_PZVAL_COPY(ret, value);
11886: EX_T(opline->result.var).var.ptr = ret;
11887: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
11888: if (!0) {
11889: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
11890: }
11891: }
1.1 misho 11892: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11893: #if DEBUG_ZEND>=2
1.1.1.2 misho 11894: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 11895: #endif
1.1.1.2 misho 11896: ZEND_VM_JMP(opline->op2.jmp_addr);
1.1 misho 11897: }
11898:
11899: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11900: CHECK_EXCEPTION();
1.1 misho 11901: ZEND_VM_NEXT_OPCODE();
11902: }
11903:
11904: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11905: {
1.1.1.2 misho 11906: USE_OPLINE
1.1 misho 11907: zend_free_op free_op1;
1.1.1.2 misho 11908: zval *value;
1.1 misho 11909:
1.1.1.2 misho 11910: SAVE_OPLINE();
11911: value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11912:
11913: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
1.1 misho 11914: if (!0) {
1.1.1.2 misho 11915: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
11916: }
11917: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11918: CHECK_EXCEPTION();
11919: ZEND_VM_NEXT_OPCODE();
11920: }
11921:
11922: static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11923: {
11924: USE_OPLINE
11925: zend_free_op free_op1;
11926: zval *value, *ret;
11927:
11928: SAVE_OPLINE();
11929: value = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11930:
11931: if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
11932: Z_ADDREF_P(value);
11933: EX_T(opline->result.var).var.ptr = value;
11934: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
11935: } else {
11936: ALLOC_ZVAL(ret);
11937: INIT_PZVAL_COPY(ret, value);
11938: EX_T(opline->result.var).var.ptr = ret;
11939: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
11940: if (!0) {
11941: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
11942: }
1.1 misho 11943: }
1.1.1.2 misho 11944:
1.1 misho 11945: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11946: CHECK_EXCEPTION();
1.1 misho 11947: ZEND_VM_NEXT_OPCODE();
11948: }
11949:
11950: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11951: {
1.1.1.2 misho 11952: USE_OPLINE
1.1 misho 11953: zend_free_op free_op1;
1.1.1.2 misho 11954: zval *expr;
1.1 misho 11955: zend_bool result;
11956:
1.1.1.2 misho 11957: SAVE_OPLINE();
11958: expr = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
11959:
1.1 misho 11960: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
1.1.1.2 misho 11961: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.var).class_entry TSRMLS_CC);
1.1 misho 11962: } else {
11963: result = 0;
11964: }
1.1.1.2 misho 11965: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result);
1.1 misho 11966: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 11967: CHECK_EXCEPTION();
1.1 misho 11968: ZEND_VM_NEXT_OPCODE();
11969: }
11970:
11971: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11972: {
1.1.1.2 misho 11973: USE_OPLINE
1.1 misho 11974: zend_free_op free_op1;
11975:
1.1.1.2 misho 11976: SAVE_OPLINE();
11977: fast_add_function(&EX_T(opline->result.var).tmp_var,
11978: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
11979: opline->op2.zv TSRMLS_CC);
1.1 misho 11980: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11981:
1.1.1.2 misho 11982: CHECK_EXCEPTION();
1.1 misho 11983: ZEND_VM_NEXT_OPCODE();
11984: }
11985:
11986: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
11987: {
1.1.1.2 misho 11988: USE_OPLINE
1.1 misho 11989: zend_free_op free_op1;
11990:
1.1.1.2 misho 11991: SAVE_OPLINE();
11992: fast_sub_function(&EX_T(opline->result.var).tmp_var,
11993: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
11994: opline->op2.zv TSRMLS_CC);
1.1 misho 11995: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
11996:
1.1.1.2 misho 11997: CHECK_EXCEPTION();
1.1 misho 11998: ZEND_VM_NEXT_OPCODE();
11999: }
12000:
12001: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12002: {
1.1.1.2 misho 12003: USE_OPLINE
1.1 misho 12004: zend_free_op free_op1;
12005:
1.1.1.2 misho 12006: SAVE_OPLINE();
12007: fast_mul_function(&EX_T(opline->result.var).tmp_var,
12008: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12009: opline->op2.zv TSRMLS_CC);
1.1 misho 12010: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12011:
1.1.1.2 misho 12012: CHECK_EXCEPTION();
1.1 misho 12013: ZEND_VM_NEXT_OPCODE();
12014: }
12015:
12016: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12017: {
1.1.1.2 misho 12018: USE_OPLINE
1.1 misho 12019: zend_free_op free_op1;
12020:
1.1.1.2 misho 12021: SAVE_OPLINE();
12022: fast_div_function(&EX_T(opline->result.var).tmp_var,
12023: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12024: opline->op2.zv TSRMLS_CC);
1.1 misho 12025: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12026:
1.1.1.2 misho 12027: CHECK_EXCEPTION();
1.1 misho 12028: ZEND_VM_NEXT_OPCODE();
12029: }
12030:
12031: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12032: {
1.1.1.2 misho 12033: USE_OPLINE
1.1 misho 12034: zend_free_op free_op1;
12035:
1.1.1.2 misho 12036: SAVE_OPLINE();
12037: fast_mod_function(&EX_T(opline->result.var).tmp_var,
12038: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12039: opline->op2.zv TSRMLS_CC);
1.1 misho 12040: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12041:
1.1.1.2 misho 12042: CHECK_EXCEPTION();
1.1 misho 12043: ZEND_VM_NEXT_OPCODE();
12044: }
12045:
12046: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12047: {
1.1.1.2 misho 12048: USE_OPLINE
1.1 misho 12049: zend_free_op free_op1;
12050:
1.1.1.2 misho 12051: SAVE_OPLINE();
12052: shift_left_function(&EX_T(opline->result.var).tmp_var,
12053: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12054: opline->op2.zv TSRMLS_CC);
1.1 misho 12055: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12056:
1.1.1.2 misho 12057: CHECK_EXCEPTION();
1.1 misho 12058: ZEND_VM_NEXT_OPCODE();
12059: }
12060:
12061: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12062: {
1.1.1.2 misho 12063: USE_OPLINE
1.1 misho 12064: zend_free_op free_op1;
12065:
1.1.1.2 misho 12066: SAVE_OPLINE();
12067: shift_right_function(&EX_T(opline->result.var).tmp_var,
12068: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12069: opline->op2.zv TSRMLS_CC);
1.1 misho 12070: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12071:
1.1.1.2 misho 12072: CHECK_EXCEPTION();
1.1 misho 12073: ZEND_VM_NEXT_OPCODE();
12074: }
12075:
12076: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12077: {
1.1.1.2 misho 12078: USE_OPLINE
1.1 misho 12079: zend_free_op free_op1;
12080:
1.1.1.2 misho 12081: SAVE_OPLINE();
12082: concat_function(&EX_T(opline->result.var).tmp_var,
12083: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12084: opline->op2.zv TSRMLS_CC);
1.1 misho 12085: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12086:
1.1.1.2 misho 12087: CHECK_EXCEPTION();
1.1 misho 12088: ZEND_VM_NEXT_OPCODE();
12089: }
12090:
12091: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12092: {
1.1.1.2 misho 12093: USE_OPLINE
1.1 misho 12094: zend_free_op free_op1;
12095:
1.1.1.2 misho 12096: SAVE_OPLINE();
12097: is_identical_function(&EX_T(opline->result.var).tmp_var,
12098: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12099: opline->op2.zv TSRMLS_CC);
1.1 misho 12100: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12101:
1.1.1.2 misho 12102: CHECK_EXCEPTION();
1.1 misho 12103: ZEND_VM_NEXT_OPCODE();
12104: }
12105:
12106: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12107: {
1.1.1.2 misho 12108: USE_OPLINE
1.1 misho 12109: zend_free_op free_op1;
1.1.1.2 misho 12110: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 12111:
1.1.1.2 misho 12112: SAVE_OPLINE();
1.1 misho 12113: is_identical_function(result,
1.1.1.2 misho 12114: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12115: opline->op2.zv TSRMLS_CC);
1.1 misho 12116: Z_LVAL_P(result) = !Z_LVAL_P(result);
12117: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12118:
1.1.1.2 misho 12119: CHECK_EXCEPTION();
1.1 misho 12120: ZEND_VM_NEXT_OPCODE();
12121: }
12122:
12123: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12124: {
1.1.1.2 misho 12125: USE_OPLINE
1.1 misho 12126: zend_free_op free_op1;
1.1.1.2 misho 12127: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 12128:
1.1.1.2 misho 12129: SAVE_OPLINE();
12130: ZVAL_BOOL(result, fast_equal_function(result,
12131: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12132: opline->op2.zv TSRMLS_CC));
1.1 misho 12133: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12134:
1.1.1.2 misho 12135: CHECK_EXCEPTION();
1.1 misho 12136: ZEND_VM_NEXT_OPCODE();
12137: }
12138:
12139: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12140: {
1.1.1.2 misho 12141: USE_OPLINE
1.1 misho 12142: zend_free_op free_op1;
1.1.1.2 misho 12143: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 12144:
1.1.1.2 misho 12145: SAVE_OPLINE();
12146: ZVAL_BOOL(result, fast_not_equal_function(result,
12147: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12148: opline->op2.zv TSRMLS_CC));
1.1 misho 12149: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12150:
1.1.1.2 misho 12151: CHECK_EXCEPTION();
1.1 misho 12152: ZEND_VM_NEXT_OPCODE();
12153: }
12154:
12155: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12156: {
1.1.1.2 misho 12157: USE_OPLINE
1.1 misho 12158: zend_free_op free_op1;
1.1.1.2 misho 12159: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 12160:
1.1.1.2 misho 12161: SAVE_OPLINE();
12162: ZVAL_BOOL(result, fast_is_smaller_function(result,
12163: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12164: opline->op2.zv TSRMLS_CC));
1.1 misho 12165: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12166:
1.1.1.2 misho 12167: CHECK_EXCEPTION();
1.1 misho 12168: ZEND_VM_NEXT_OPCODE();
12169: }
12170:
12171: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12172: {
1.1.1.2 misho 12173: USE_OPLINE
1.1 misho 12174: zend_free_op free_op1;
1.1.1.2 misho 12175: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 12176:
1.1.1.2 misho 12177: SAVE_OPLINE();
12178: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
12179: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12180: opline->op2.zv TSRMLS_CC));
1.1 misho 12181: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12182:
1.1.1.2 misho 12183: CHECK_EXCEPTION();
1.1 misho 12184: ZEND_VM_NEXT_OPCODE();
12185: }
12186:
12187: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12188: {
1.1.1.2 misho 12189: USE_OPLINE
1.1 misho 12190: zend_free_op free_op1;
12191:
1.1.1.2 misho 12192: SAVE_OPLINE();
12193: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
12194: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12195: opline->op2.zv TSRMLS_CC);
1.1 misho 12196: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12197:
1.1.1.2 misho 12198: CHECK_EXCEPTION();
1.1 misho 12199: ZEND_VM_NEXT_OPCODE();
12200: }
12201:
12202: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12203: {
1.1.1.2 misho 12204: USE_OPLINE
1.1 misho 12205: zend_free_op free_op1;
12206:
1.1.1.2 misho 12207: SAVE_OPLINE();
12208: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
12209: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12210: opline->op2.zv TSRMLS_CC);
1.1 misho 12211: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12212:
1.1.1.2 misho 12213: CHECK_EXCEPTION();
1.1 misho 12214: ZEND_VM_NEXT_OPCODE();
12215: }
12216:
12217: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12218: {
1.1.1.2 misho 12219: USE_OPLINE
1.1 misho 12220: zend_free_op free_op1;
12221:
1.1.1.2 misho 12222: SAVE_OPLINE();
12223: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
12224: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12225: opline->op2.zv TSRMLS_CC);
1.1 misho 12226: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12227:
1.1.1.2 misho 12228: CHECK_EXCEPTION();
1.1 misho 12229: ZEND_VM_NEXT_OPCODE();
12230: }
12231:
12232: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12233: {
1.1.1.2 misho 12234: USE_OPLINE
1.1 misho 12235: zend_free_op free_op1;
12236:
1.1.1.2 misho 12237: SAVE_OPLINE();
12238: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
12239: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
12240: opline->op2.zv TSRMLS_CC);
1.1 misho 12241: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12242:
1.1.1.2 misho 12243: CHECK_EXCEPTION();
1.1 misho 12244: ZEND_VM_NEXT_OPCODE();
12245: }
12246:
12247: 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)
12248: {
1.1.1.2 misho 12249: USE_OPLINE
1.1 misho 12250: zend_free_op free_op1, free_op_data1;
1.1.1.2 misho 12251: zval **object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 12252: zval *object;
1.1.1.2 misho 12253: zval *property = opline->op2.zv;
12254: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 12255: int have_get_ptr = 0;
12256:
1.1.1.2 misho 12257: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 12258: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
12259: }
12260:
12261: make_real_object(object_ptr TSRMLS_CC);
12262: object = *object_ptr;
12263:
1.1.1.2 misho 12264: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 12265: zend_error(E_WARNING, "Attempt to assign property of non-object");
12266:
12267: FREE_OP(free_op_data1);
12268:
1.1.1.2 misho 12269: if (RETURN_VALUE_USED(opline)) {
12270: PZVAL_LOCK(&EG(uninitialized_zval));
12271: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
12272: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 12273: }
12274: } else {
12275: /* here we are sure we are dealing with an object */
12276: if (0) {
12277: MAKE_REAL_ZVAL_PTR(property);
12278: }
12279:
12280: /* here property is a string */
12281: if (opline->extended_value == ZEND_ASSIGN_OBJ
12282: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 12283: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12284: if (zptr != NULL) { /* NULL means no success in getting PTR */
12285: SEPARATE_ZVAL_IF_NOT_REF(zptr);
12286:
12287: have_get_ptr = 1;
12288: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 12289: if (RETURN_VALUE_USED(opline)) {
1.1 misho 12290: PZVAL_LOCK(*zptr);
1.1.1.2 misho 12291: EX_T(opline->result.var).var.ptr = *zptr;
12292: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 12293: }
12294: }
12295: }
12296:
12297: if (!have_get_ptr) {
12298: zval *z = NULL;
12299:
12300: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
12301: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 12302: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12303: }
12304: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
12305: if (Z_OBJ_HT_P(object)->read_dimension) {
12306: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
12307: }
12308: }
12309: if (z) {
12310: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
12311: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
12312:
12313: if (Z_REFCOUNT_P(z) == 0) {
12314: GC_REMOVE_ZVAL_FROM_BUFFER(z);
12315: zval_dtor(z);
12316: FREE_ZVAL(z);
12317: }
12318: z = value;
12319: }
12320: Z_ADDREF_P(z);
12321: SEPARATE_ZVAL_IF_NOT_REF(&z);
12322: binary_op(z, z, value TSRMLS_CC);
12323: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 12324: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12325: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
12326: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
12327: }
1.1.1.2 misho 12328: if (RETURN_VALUE_USED(opline)) {
1.1 misho 12329: PZVAL_LOCK(z);
1.1.1.2 misho 12330: EX_T(opline->result.var).var.ptr = z;
12331: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 12332: }
12333: zval_ptr_dtor(&z);
12334: } else {
12335: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 12336: if (RETURN_VALUE_USED(opline)) {
12337: PZVAL_LOCK(&EG(uninitialized_zval));
12338: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
12339: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 12340: }
12341: }
12342: }
12343:
12344: if (0) {
12345: zval_ptr_dtor(&property);
12346: } else {
12347:
12348: }
12349: FREE_OP(free_op_data1);
12350: }
12351:
12352: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12353: /* assign_obj has two opcodes! */
1.1.1.2 misho 12354: CHECK_EXCEPTION();
1.1 misho 12355: ZEND_VM_INC_OPCODE();
12356: ZEND_VM_NEXT_OPCODE();
12357: }
12358:
12359: 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)
12360: {
1.1.1.2 misho 12361: USE_OPLINE
1.1 misho 12362: zend_free_op free_op1, free_op_data2, free_op_data1;
12363: zval **var_ptr;
12364: zval *value;
12365:
1.1.1.2 misho 12366: SAVE_OPLINE();
1.1 misho 12367: switch (opline->extended_value) {
12368: case ZEND_ASSIGN_OBJ:
12369: return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12370: break;
12371: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 12372: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 12373:
1.1.1.2 misho 12374: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 12375: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 12376: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 12377: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
12378: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
12379: }
12380: return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12381: } else {
1.1.1.2 misho 12382: zval *dim = opline->op2.zv;
1.1 misho 12383:
1.1.1.2 misho 12384: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
12385: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
12386: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 12387: }
12388: }
12389: break;
12390: default:
1.1.1.2 misho 12391: value = opline->op2.zv;
12392: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 12393: /* do nothing */
12394: break;
12395: }
12396:
1.1.1.2 misho 12397: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 12398: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
12399: }
12400:
1.1.1.2 misho 12401: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
12402: if (RETURN_VALUE_USED(opline)) {
12403: PZVAL_LOCK(&EG(uninitialized_zval));
12404: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 12405: }
12406:
12407: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12408: CHECK_EXCEPTION();
12409: if (opline->extended_value == ZEND_ASSIGN_DIM) {
12410: ZEND_VM_INC_OPCODE();
12411: }
1.1 misho 12412: ZEND_VM_NEXT_OPCODE();
12413: }
12414:
12415: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
12416:
1.1.1.2 misho 12417: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
12418: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 12419: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
12420: /* proxy object */
12421: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
12422: Z_ADDREF_P(objval);
12423: binary_op(objval, objval, value TSRMLS_CC);
12424: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
12425: zval_ptr_dtor(&objval);
12426: } else {
12427: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
12428: }
12429:
1.1.1.2 misho 12430: if (RETURN_VALUE_USED(opline)) {
1.1 misho 12431: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 12432: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 12433: }
12434:
12435: if (opline->extended_value == ZEND_ASSIGN_DIM) {
12436: FREE_OP(free_op_data1);
12437: FREE_OP_VAR_PTR(free_op_data2);
1.1.1.2 misho 12438: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12439: CHECK_EXCEPTION();
12440: ZEND_VM_INC_OPCODE();
12441: } else {
12442: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12443: CHECK_EXCEPTION();
1.1 misho 12444: }
12445: ZEND_VM_NEXT_OPCODE();
12446: }
12447:
12448: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12449: {
12450: return zend_binary_assign_op_helper_SPEC_VAR_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12451: }
12452:
12453: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12454: {
12455: return zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12456: }
12457:
12458: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12459: {
12460: return zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12461: }
12462:
12463: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12464: {
12465: return zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12466: }
12467:
12468: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12469: {
12470: return zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12471: }
12472:
12473: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12474: {
12475: return zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12476: }
12477:
12478: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12479: {
12480: return zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12481: }
12482:
12483: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12484: {
12485: return zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12486: }
12487:
12488: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12489: {
12490: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12491: }
12492:
12493: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12494: {
12495: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12496: }
12497:
12498: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12499: {
12500: return zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12501: }
12502:
12503: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
12504: {
1.1.1.2 misho 12505: USE_OPLINE
1.1 misho 12506: zend_free_op free_op1;
1.1.1.2 misho 12507: zval **object_ptr;
1.1 misho 12508: zval *object;
1.1.1.2 misho 12509: zval *property;
12510: zval **retval;
1.1 misho 12511: int have_get_ptr = 0;
12512:
1.1.1.2 misho 12513: SAVE_OPLINE();
12514: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
12515: property = opline->op2.zv;
12516: retval = &EX_T(opline->result.var).var.ptr;
12517:
12518: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 12519: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
12520: }
12521:
12522: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
12523: object = *object_ptr;
12524:
1.1.1.2 misho 12525: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 12526: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
12527:
1.1.1.2 misho 12528: if (RETURN_VALUE_USED(opline)) {
12529: PZVAL_LOCK(&EG(uninitialized_zval));
12530: *retval = &EG(uninitialized_zval);
1.1 misho 12531: }
12532: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12533: CHECK_EXCEPTION();
1.1 misho 12534: ZEND_VM_NEXT_OPCODE();
12535: }
12536:
12537: /* here we are sure we are dealing with an object */
12538:
12539: if (0) {
12540: MAKE_REAL_ZVAL_PTR(property);
12541: }
12542:
12543: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 12544: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12545: if (zptr != NULL) { /* NULL means no success in getting PTR */
12546: SEPARATE_ZVAL_IF_NOT_REF(zptr);
12547:
12548: have_get_ptr = 1;
12549: incdec_op(*zptr);
1.1.1.2 misho 12550: if (RETURN_VALUE_USED(opline)) {
1.1 misho 12551: *retval = *zptr;
12552: PZVAL_LOCK(*retval);
12553: }
12554: }
12555: }
12556:
12557: if (!have_get_ptr) {
12558: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 12559: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12560:
1.1.1.2 misho 12561: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 12562: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
12563:
12564: if (Z_REFCOUNT_P(z) == 0) {
12565: GC_REMOVE_ZVAL_FROM_BUFFER(z);
12566: zval_dtor(z);
12567: FREE_ZVAL(z);
12568: }
12569: z = value;
12570: }
12571: Z_ADDREF_P(z);
12572: SEPARATE_ZVAL_IF_NOT_REF(&z);
12573: incdec_op(z);
12574: *retval = z;
1.1.1.2 misho 12575: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
12576: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 12577: zval_ptr_dtor(&z);
12578: } else {
12579: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 12580: if (RETURN_VALUE_USED(opline)) {
12581: PZVAL_LOCK(&EG(uninitialized_zval));
12582: *retval = &EG(uninitialized_zval);
1.1 misho 12583: }
12584: }
12585: }
12586:
12587: if (0) {
12588: zval_ptr_dtor(&property);
12589: } else {
12590:
12591: }
12592: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12593: CHECK_EXCEPTION();
1.1 misho 12594: ZEND_VM_NEXT_OPCODE();
12595: }
12596:
12597: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12598: {
12599: return zend_pre_incdec_property_helper_SPEC_VAR_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12600: }
12601:
12602: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12603: {
12604: return zend_pre_incdec_property_helper_SPEC_VAR_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12605: }
12606:
12607: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
12608: {
1.1.1.2 misho 12609: USE_OPLINE
1.1 misho 12610: zend_free_op free_op1;
1.1.1.2 misho 12611: zval **object_ptr;
1.1 misho 12612: zval *object;
1.1.1.2 misho 12613: zval *property;
12614: zval *retval;
1.1 misho 12615: int have_get_ptr = 0;
12616:
1.1.1.2 misho 12617: SAVE_OPLINE();
12618: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
12619: property = opline->op2.zv;
12620: retval = &EX_T(opline->result.var).tmp_var;
12621:
12622: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 12623: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
12624: }
12625:
12626: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
12627: object = *object_ptr;
12628:
1.1.1.2 misho 12629: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 12630: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
12631:
1.1.1.2 misho 12632: ZVAL_NULL(retval);
1.1 misho 12633: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12634: CHECK_EXCEPTION();
1.1 misho 12635: ZEND_VM_NEXT_OPCODE();
12636: }
12637:
12638: /* here we are sure we are dealing with an object */
12639:
12640: if (0) {
12641: MAKE_REAL_ZVAL_PTR(property);
12642: }
12643:
12644: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 12645: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12646: if (zptr != NULL) { /* NULL means no success in getting PTR */
12647: have_get_ptr = 1;
12648: SEPARATE_ZVAL_IF_NOT_REF(zptr);
12649:
1.1.1.2 misho 12650: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 12651: zendi_zval_copy_ctor(*retval);
12652:
12653: incdec_op(*zptr);
12654:
12655: }
12656: }
12657:
12658: if (!have_get_ptr) {
12659: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 12660: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12661: zval *z_copy;
12662:
1.1.1.2 misho 12663: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 12664: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
12665:
12666: if (Z_REFCOUNT_P(z) == 0) {
12667: GC_REMOVE_ZVAL_FROM_BUFFER(z);
12668: zval_dtor(z);
12669: FREE_ZVAL(z);
12670: }
12671: z = value;
12672: }
1.1.1.2 misho 12673: ZVAL_COPY_VALUE(retval, z);
1.1 misho 12674: zendi_zval_copy_ctor(*retval);
12675: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 12676: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 12677: zendi_zval_copy_ctor(*z_copy);
12678: incdec_op(z_copy);
12679: Z_ADDREF_P(z);
1.1.1.2 misho 12680: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 12681: zval_ptr_dtor(&z_copy);
12682: zval_ptr_dtor(&z);
12683: } else {
12684: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 12685: ZVAL_NULL(retval);
12686: }
12687: }
12688:
12689: if (0) {
12690: zval_ptr_dtor(&property);
12691: } else {
12692:
12693: }
12694: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12695: CHECK_EXCEPTION();
12696: ZEND_VM_NEXT_OPCODE();
12697: }
12698:
12699: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12700: {
12701: return zend_post_incdec_property_helper_SPEC_VAR_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12702: }
12703:
12704: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12705: {
12706: return zend_post_incdec_property_helper_SPEC_VAR_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12707: }
12708:
12709: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
12710: {
12711: USE_OPLINE
12712: zend_free_op free_op1;
12713: zval *varname;
12714: zval **retval;
12715: zval tmp_varname;
12716: HashTable *target_symbol_table;
12717: ulong hash_value;
12718:
12719: SAVE_OPLINE();
12720: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
12721:
12722: if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
12723: ZVAL_COPY_VALUE(&tmp_varname, varname);
12724: zval_copy_ctor(&tmp_varname);
12725: Z_SET_REFCOUNT(tmp_varname, 1);
12726: Z_UNSET_ISREF(tmp_varname);
12727: convert_to_string(&tmp_varname);
12728: varname = &tmp_varname;
12729: }
12730:
12731: if (IS_CONST != IS_UNUSED) {
12732: zend_class_entry *ce;
12733:
12734: if (IS_CONST == IS_CONST) {
12735: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
12736: ce = CACHED_PTR(opline->op2.literal->cache_slot);
12737: } else {
12738: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
12739: if (UNEXPECTED(ce == NULL)) {
12740: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
12741: zval_dtor(&tmp_varname);
12742: }
12743: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12744: CHECK_EXCEPTION();
12745: ZEND_VM_NEXT_OPCODE();
12746: }
12747: CACHE_PTR(opline->op2.literal->cache_slot, ce);
12748: }
12749: } else {
12750: ce = EX_T(opline->op2.var).class_entry;
12751: }
12752: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
12753: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12754: } else {
12755: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
12756: /*
12757: if (!target_symbol_table) {
12758: CHECK_EXCEPTION();
12759: ZEND_VM_NEXT_OPCODE();
12760: }
12761: */
12762: if (IS_VAR == IS_CONST) {
12763: hash_value = Z_HASH_P(varname);
12764: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
12765: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
12766: } else {
12767: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
12768: }
12769:
12770: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
12771: switch (type) {
12772: case BP_VAR_R:
12773: case BP_VAR_UNSET:
12774: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
12775: /* break missing intentionally */
12776: case BP_VAR_IS:
12777: retval = &EG(uninitialized_zval_ptr);
12778: break;
12779: case BP_VAR_RW:
12780: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
12781: /* break missing intentionally */
12782: case BP_VAR_W:
12783: Z_ADDREF_P(&EG(uninitialized_zval));
12784: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
12785: break;
12786: EMPTY_SWITCH_DEFAULT_CASE()
12787: }
12788: }
12789: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
12790: case ZEND_FETCH_GLOBAL:
12791: if (IS_VAR != IS_TMP_VAR) {
12792: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12793: }
12794: break;
12795: case ZEND_FETCH_LOCAL:
12796: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12797: break;
12798: case ZEND_FETCH_STATIC:
12799: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
12800: break;
12801: case ZEND_FETCH_GLOBAL_LOCK:
12802: if (IS_VAR == IS_VAR && !free_op1.var) {
12803: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
12804: }
12805: break;
12806: }
12807: }
12808:
12809:
12810: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
12811: zval_dtor(&tmp_varname);
12812: }
12813: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
12814: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
12815: }
12816: PZVAL_LOCK(*retval);
12817: switch (type) {
12818: case BP_VAR_R:
12819: case BP_VAR_IS:
12820: AI_SET_PTR(&EX_T(opline->result.var), *retval);
12821: break;
12822: case BP_VAR_UNSET: {
12823: zend_free_op free_res;
12824:
12825: PZVAL_UNLOCK(*retval, &free_res);
12826: if (retval != &EG(uninitialized_zval_ptr)) {
12827: SEPARATE_ZVAL_IF_NOT_REF(retval);
12828: }
12829: PZVAL_LOCK(*retval);
12830: FREE_OP_VAR_PTR(free_res);
1.1 misho 12831: }
1.1.1.2 misho 12832: /* break missing intentionally */
12833: default:
12834: EX_T(opline->result.var).var.ptr_ptr = retval;
12835: break;
1.1 misho 12836: }
1.1.1.2 misho 12837: CHECK_EXCEPTION();
12838: ZEND_VM_NEXT_OPCODE();
12839: }
12840:
12841: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12842: {
12843: return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12844: }
1.1 misho 12845:
1.1.1.2 misho 12846: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12847: {
12848: return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12849: }
1.1 misho 12850:
1.1.1.2 misho 12851: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12852: {
12853: return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 12854: }
12855:
1.1.1.2 misho 12856: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 12857: {
1.1.1.2 misho 12858: USE_OPLINE
12859:
12860: return zend_fetch_var_address_helper_SPEC_VAR_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 12861: }
12862:
1.1.1.2 misho 12863: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 12864: {
1.1.1.2 misho 12865: return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
12866: }
12867:
12868: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12869: {
12870: return zend_fetch_var_address_helper_SPEC_VAR_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 12871: }
12872:
12873: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12874: {
1.1.1.2 misho 12875: USE_OPLINE
1.1 misho 12876: zend_free_op free_op1;
1.1.1.5 ! misho 12877: zval *container;
1.1 misho 12878:
1.1.1.2 misho 12879: SAVE_OPLINE();
12880:
1.1.1.5 ! misho 12881: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 12882: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 12883: }
1.1.1.5 ! misho 12884: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 12885: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
1.1 misho 12886:
12887: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12888: CHECK_EXCEPTION();
1.1 misho 12889: ZEND_VM_NEXT_OPCODE();
12890: }
12891:
12892: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12893: {
1.1.1.2 misho 12894: USE_OPLINE
1.1 misho 12895: zend_free_op free_op1;
1.1.1.2 misho 12896: zval **container;
12897:
12898: SAVE_OPLINE();
12899: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 12900:
1.1.1.2 misho 12901: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 12902: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12903: }
1.1.1.2 misho 12904: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
1.1 misho 12905:
1.1.1.2 misho 12906: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
12907: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 12908: }
12909: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
12910:
12911: /* We are going to assign the result by reference */
1.1.1.2 misho 12912: if (UNEXPECTED(opline->extended_value != 0)) {
12913: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
12914:
12915: if (retval_ptr) {
12916: Z_DELREF_PP(retval_ptr);
12917: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
12918: Z_ADDREF_PP(retval_ptr);
12919: }
1.1 misho 12920: }
12921:
1.1.1.2 misho 12922: CHECK_EXCEPTION();
1.1 misho 12923: ZEND_VM_NEXT_OPCODE();
12924: }
12925:
12926: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12927: {
1.1.1.2 misho 12928: USE_OPLINE
1.1 misho 12929: zend_free_op free_op1;
1.1.1.2 misho 12930: zval **container;
1.1 misho 12931:
1.1.1.2 misho 12932: SAVE_OPLINE();
12933: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
12934:
12935: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 12936: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12937: }
1.1.1.2 misho 12938: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW TSRMLS_CC);
1.1 misho 12939:
1.1.1.2 misho 12940: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
12941: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 12942: }
12943: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12944: CHECK_EXCEPTION();
1.1 misho 12945: ZEND_VM_NEXT_OPCODE();
12946: }
12947:
12948: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12949: {
1.1.1.2 misho 12950: USE_OPLINE
1.1 misho 12951: zend_free_op free_op1;
1.1.1.5 ! misho 12952: zval *container;
1.1 misho 12953:
1.1.1.2 misho 12954: SAVE_OPLINE();
1.1.1.5 ! misho 12955: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 12956: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
1.1 misho 12957:
12958: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 12959: CHECK_EXCEPTION();
1.1 misho 12960: ZEND_VM_NEXT_OPCODE();
12961: }
12962:
12963: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12964: {
1.1.1.2 misho 12965: USE_OPLINE
1.1 misho 12966: zend_free_op free_op1;
12967:
1.1.1.2 misho 12968: SAVE_OPLINE();
12969:
12970: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 12971: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
! 12972:
1.1.1.2 misho 12973: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 12974: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
12975: }
1.1.1.2 misho 12976: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
12977: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
12978: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 12979: }
1.1.1.5 ! misho 12980:
! 12981: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 12982: } else {
1.1.1.5 ! misho 12983: zval *container;
! 12984:
1.1 misho 12985: if (IS_CONST == IS_UNUSED) {
12986: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
12987: }
1.1.1.5 ! misho 12988: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 12989: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
1.1 misho 12990:
1.1.1.5 ! misho 12991: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 12992: }
1.1.1.2 misho 12993: CHECK_EXCEPTION();
1.1 misho 12994: ZEND_VM_NEXT_OPCODE();
12995: }
12996:
12997: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
12998: {
1.1.1.2 misho 12999: USE_OPLINE
1.1 misho 13000: zend_free_op free_op1;
1.1.1.2 misho 13001: zval **container;
13002:
13003: SAVE_OPLINE();
13004: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13005:
13006: if (IS_VAR == IS_CV) {
13007: if (container != &EG(uninitialized_zval_ptr)) {
13008: SEPARATE_ZVAL_IF_NOT_REF(container);
13009: }
13010: }
1.1.1.2 misho 13011: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 13012: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
13013: }
1.1.1.2 misho 13014: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 13015:
1.1.1.2 misho 13016: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
13017: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 13018: }
13019: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 13020: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 13021: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
13022: } else {
13023: zend_free_op free_res;
1.1.1.2 misho 13024: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 13025:
1.1.1.2 misho 13026: PZVAL_UNLOCK(*retval_ptr, &free_res);
13027: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
13028: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 13029: }
1.1.1.2 misho 13030: PZVAL_LOCK(*retval_ptr);
1.1 misho 13031: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 13032: CHECK_EXCEPTION();
13033: ZEND_VM_NEXT_OPCODE();
1.1 misho 13034: }
13035: }
13036:
1.1.1.2 misho 13037: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 13038: {
1.1.1.2 misho 13039: USE_OPLINE
1.1 misho 13040: zend_free_op free_op1;
1.1.1.2 misho 13041: zval *container;
1.1 misho 13042:
1.1.1.2 misho 13043: zval *offset;
1.1 misho 13044:
1.1.1.2 misho 13045: SAVE_OPLINE();
13046: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13047: offset = opline->op2.zv;
13048:
13049: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
13050: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
13051: zend_error(E_NOTICE, "Trying to get property of non-object");
13052: PZVAL_LOCK(&EG(uninitialized_zval));
13053: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 13054:
13055: } else {
13056: zval *retval;
13057:
13058: if (0) {
13059: MAKE_REAL_ZVAL_PTR(offset);
13060: }
13061:
13062: /* here we are sure we are dealing with an object */
1.1.1.2 misho 13063: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 13064:
1.1.1.2 misho 13065: PZVAL_LOCK(retval);
13066: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 13067:
13068: if (0) {
13069: zval_ptr_dtor(&offset);
13070: } else {
13071:
13072: }
13073: }
13074:
13075: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 13076: CHECK_EXCEPTION();
1.1 misho 13077: ZEND_VM_NEXT_OPCODE();
13078: }
13079:
13080: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13081: {
1.1.1.2 misho 13082: return zend_fetch_property_address_read_helper_SPEC_VAR_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 13083: }
13084:
13085: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13086: {
1.1.1.2 misho 13087: USE_OPLINE
1.1 misho 13088: zend_free_op free_op1;
1.1.1.2 misho 13089: zval *property;
1.1 misho 13090: zval **container;
13091:
1.1.1.2 misho 13092: SAVE_OPLINE();
13093: property = opline->op2.zv;
13094:
1.1 misho 13095: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 13096: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
13097: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 13098: }
13099:
13100: if (0) {
13101: MAKE_REAL_ZVAL_PTR(property);
13102: }
1.1.1.2 misho 13103: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13104: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 13105: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
13106: }
1.1.1.2 misho 13107:
13108: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 13109: if (0) {
13110: zval_ptr_dtor(&property);
13111: } else {
13112:
13113: }
1.1.1.2 misho 13114: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
13115: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 13116: }
13117: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13118:
13119: /* We are going to assign the result by reference */
13120: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 13121: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
13122:
13123: Z_DELREF_PP(retval_ptr);
13124: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
13125: Z_ADDREF_PP(retval_ptr);
13126: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
13127: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 13128: }
13129:
1.1.1.2 misho 13130: CHECK_EXCEPTION();
1.1 misho 13131: ZEND_VM_NEXT_OPCODE();
13132: }
13133:
13134: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13135: {
1.1.1.2 misho 13136: USE_OPLINE
1.1 misho 13137: zend_free_op free_op1;
1.1.1.2 misho 13138: zval *property;
13139: zval **container;
13140:
13141: SAVE_OPLINE();
13142: property = opline->op2.zv;
13143: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13144:
13145: if (0) {
13146: MAKE_REAL_ZVAL_PTR(property);
13147: }
1.1.1.2 misho 13148: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 13149: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
13150: }
1.1.1.2 misho 13151: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 13152: if (0) {
13153: zval_ptr_dtor(&property);
13154: } else {
13155:
13156: }
1.1.1.2 misho 13157: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
13158: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 13159: }
13160: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 13161: CHECK_EXCEPTION();
1.1 misho 13162: ZEND_VM_NEXT_OPCODE();
13163: }
13164:
13165: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13166: {
1.1.1.2 misho 13167: USE_OPLINE
13168: zend_free_op free_op1;
13169: zval *container;
13170:
13171: zval *offset;
13172:
13173: SAVE_OPLINE();
13174: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13175: offset = opline->op2.zv;
13176:
13177: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
13178: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
13179: PZVAL_LOCK(&EG(uninitialized_zval));
13180: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
13181:
13182: } else {
13183: zval *retval;
13184:
13185: if (0) {
13186: MAKE_REAL_ZVAL_PTR(offset);
13187: }
13188:
13189: /* here we are sure we are dealing with an object */
13190: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
13191:
13192: PZVAL_LOCK(retval);
13193: AI_SET_PTR(&EX_T(opline->result.var), retval);
13194:
13195: if (0) {
13196: zval_ptr_dtor(&offset);
13197: } else {
13198:
13199: }
13200: }
13201:
13202: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13203: CHECK_EXCEPTION();
13204: ZEND_VM_NEXT_OPCODE();
1.1 misho 13205: }
13206:
13207: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13208: {
1.1.1.2 misho 13209: USE_OPLINE
1.1 misho 13210:
1.1.1.2 misho 13211: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 13212: /* Behave like FETCH_OBJ_W */
13213: zend_free_op free_op1;
1.1.1.2 misho 13214: zval *property;
13215: zval **container;
13216:
13217: SAVE_OPLINE();
13218: property = opline->op2.zv;
13219: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13220:
13221: if (0) {
13222: MAKE_REAL_ZVAL_PTR(property);
13223: }
1.1.1.2 misho 13224: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 13225: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
13226: }
1.1.1.2 misho 13227: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 13228: if (0) {
13229: zval_ptr_dtor(&property);
13230: } else {
13231:
13232: }
1.1.1.2 misho 13233: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
13234: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 13235: }
13236: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 13237: CHECK_EXCEPTION();
1.1 misho 13238: ZEND_VM_NEXT_OPCODE();
13239: } else {
1.1.1.2 misho 13240: return zend_fetch_property_address_read_helper_SPEC_VAR_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 13241: }
13242: }
13243:
13244: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13245: {
1.1.1.2 misho 13246: USE_OPLINE
1.1 misho 13247: zend_free_op free_op1, free_res;
1.1.1.2 misho 13248: zval **container;
13249: zval *property;
13250:
13251: SAVE_OPLINE();
13252: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13253: property = opline->op2.zv;
1.1 misho 13254:
13255: if (IS_VAR == IS_CV) {
13256: if (container != &EG(uninitialized_zval_ptr)) {
13257: SEPARATE_ZVAL_IF_NOT_REF(container);
13258: }
13259: }
13260: if (0) {
13261: MAKE_REAL_ZVAL_PTR(property);
13262: }
1.1.1.2 misho 13263: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 13264: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
13265: }
1.1.1.2 misho 13266: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 13267: if (0) {
13268: zval_ptr_dtor(&property);
13269: } else {
13270:
13271: }
1.1.1.2 misho 13272: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
13273: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 13274: }
13275: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13276:
1.1.1.2 misho 13277: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
13278: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
13279: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 13280: }
1.1.1.2 misho 13281: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 13282: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 13283: CHECK_EXCEPTION();
1.1 misho 13284: ZEND_VM_NEXT_OPCODE();
13285: }
13286:
13287: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13288: {
1.1.1.2 misho 13289: USE_OPLINE
1.1 misho 13290: zend_free_op free_op1;
1.1.1.2 misho 13291: zval **object_ptr;
13292: zval *property_name;
13293:
13294: SAVE_OPLINE();
13295: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13296: property_name = opline->op2.zv;
1.1 misho 13297:
13298: if (0) {
13299: MAKE_REAL_ZVAL_PTR(property_name);
13300: }
1.1.1.2 misho 13301: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 13302: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
13303: }
1.1.1.2 misho 13304: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 13305: if (0) {
13306: zval_ptr_dtor(&property_name);
13307: } else {
13308:
13309: }
13310: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13311: /* assign_obj has two opcodes! */
1.1.1.2 misho 13312: CHECK_EXCEPTION();
1.1 misho 13313: ZEND_VM_INC_OPCODE();
13314: ZEND_VM_NEXT_OPCODE();
13315: }
13316:
13317: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13318: {
1.1.1.2 misho 13319: USE_OPLINE
1.1 misho 13320: zend_free_op free_op1;
1.1.1.2 misho 13321: zval **object_ptr;
1.1 misho 13322:
1.1.1.2 misho 13323: SAVE_OPLINE();
13324: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13325:
13326: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 13327: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
13328: }
13329: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
13330:
1.1.1.2 misho 13331: zval *property_name = opline->op2.zv;
1.1 misho 13332:
13333: if (0) {
13334: MAKE_REAL_ZVAL_PTR(property_name);
13335: }
1.1.1.2 misho 13336: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 13337: if (0) {
13338: zval_ptr_dtor(&property_name);
13339: } else {
13340:
13341: }
13342: } else {
13343: zend_free_op free_op_data1, free_op_data2;
13344: zval *value;
1.1.1.2 misho 13345: zval *dim = opline->op2.zv;
1.1 misho 13346: zval **variable_ptr_ptr;
13347:
1.1.1.2 misho 13348: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W TSRMLS_CC);
13349:
13350: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
13351: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
13352: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
13353: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
13354: if (RETURN_VALUE_USED(opline)) {
13355: zval *retval;
1.1 misho 13356:
1.1.1.2 misho 13357: ALLOC_ZVAL(retval);
13358: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
13359: INIT_PZVAL(retval);
13360: AI_SET_PTR(&EX_T(opline->result.var), retval);
13361: }
13362: } else if (RETURN_VALUE_USED(opline)) {
13363: PZVAL_LOCK(&EG(uninitialized_zval));
13364: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
13365: }
13366: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
13367: if (IS_TMP_FREE(free_op_data1)) {
13368: zval_dtor(value);
13369: }
13370: if (RETURN_VALUE_USED(opline)) {
13371: PZVAL_LOCK(&EG(uninitialized_zval));
13372: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
13373: }
13374: } else {
13375: if ((opline+1)->op1_type == IS_TMP_VAR) {
13376: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13377: } else if ((opline+1)->op1_type == IS_CONST) {
13378: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13379: } else {
13380: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13381: }
13382: if (RETURN_VALUE_USED(opline)) {
1.1 misho 13383: PZVAL_LOCK(value);
1.1.1.2 misho 13384: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 13385: }
13386: }
13387: FREE_OP_VAR_PTR(free_op_data2);
13388: FREE_OP_IF_VAR(free_op_data1);
13389: }
13390: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13391: /* assign_dim has two opcodes! */
1.1.1.2 misho 13392: CHECK_EXCEPTION();
1.1 misho 13393: ZEND_VM_INC_OPCODE();
13394: ZEND_VM_NEXT_OPCODE();
13395: }
13396:
13397: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13398: {
1.1.1.2 misho 13399: USE_OPLINE
1.1 misho 13400: zend_free_op free_op1;
1.1.1.2 misho 13401: zval *value;
13402: zval **variable_ptr_ptr;
1.1 misho 13403:
1.1.1.2 misho 13404: SAVE_OPLINE();
13405: value = opline->op2.zv;
13406: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13407:
13408: if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
13409: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_CONST TSRMLS_CC)) {
13410: if (RETURN_VALUE_USED(opline)) {
13411: zval *retval;
13412:
13413: ALLOC_ZVAL(retval);
13414: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
13415: INIT_PZVAL(retval);
13416: AI_SET_PTR(&EX_T(opline->result.var), retval);
13417: }
13418: } else if (RETURN_VALUE_USED(opline)) {
13419: PZVAL_LOCK(&EG(uninitialized_zval));
13420: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
13421: }
13422: } else if (IS_VAR == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
13423: if (0) {
13424: zval_dtor(value);
13425: }
13426: if (RETURN_VALUE_USED(opline)) {
13427: PZVAL_LOCK(&EG(uninitialized_zval));
13428: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
13429: }
13430: } else {
13431: if (IS_CONST == IS_TMP_VAR) {
13432: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13433: } else if (IS_CONST == IS_CONST) {
13434: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13435: } else {
13436: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
13437: }
13438: if (RETURN_VALUE_USED(opline)) {
1.1 misho 13439: PZVAL_LOCK(value);
1.1.1.2 misho 13440: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 13441: }
13442: }
13443:
13444: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13445:
13446: /* zend_assign_to_variable() always takes care of op2, never free it! */
13447:
1.1.1.2 misho 13448: CHECK_EXCEPTION();
1.1 misho 13449: ZEND_VM_NEXT_OPCODE();
13450: }
13451:
13452: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13453: {
1.1.1.2 misho 13454: USE_OPLINE
1.1 misho 13455: zval *function_name;
13456: char *function_name_strval;
13457: int function_name_strlen;
13458: zend_free_op free_op1;
13459:
1.1.1.2 misho 13460: SAVE_OPLINE();
1.1 misho 13461: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
13462:
1.1.1.2 misho 13463: function_name = opline->op2.zv;
1.1 misho 13464:
1.1.1.2 misho 13465: if (IS_CONST != IS_CONST &&
13466: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 13467: zend_error_noreturn(E_ERROR, "Method name must be a string");
13468: }
13469:
13470: function_name_strval = Z_STRVAL_P(function_name);
13471: function_name_strlen = Z_STRLEN_P(function_name);
13472:
1.1.1.2 misho 13473: EX(object) = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13474:
1.1.1.2 misho 13475: if (EXPECTED(EX(object) != NULL) &&
13476: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
13477: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 13478:
1.1.1.2 misho 13479: if (IS_CONST != IS_CONST ||
13480: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
13481: zval *object = EX(object);
13482:
13483: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
13484: zend_error_noreturn(E_ERROR, "Object does not support method calls");
13485: }
13486:
13487: /* First, locate the function. */
13488: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
13489: if (UNEXPECTED(EX(fbc) == NULL)) {
13490: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
13491: }
13492: if (IS_CONST == IS_CONST &&
13493: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
13494: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
13495: EXPECTED(EX(object) == object)) {
13496: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
13497: }
1.1 misho 13498: }
13499: } else {
13500: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
13501: }
13502:
13503: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
13504: EX(object) = NULL;
13505: } else {
13506: if (!PZVAL_IS_REF(EX(object))) {
13507: Z_ADDREF_P(EX(object)); /* For $this pointer */
13508: } else {
13509: zval *this_ptr;
13510: ALLOC_ZVAL(this_ptr);
13511: INIT_PZVAL_COPY(this_ptr, EX(object));
13512: zval_copy_ctor(this_ptr);
13513: EX(object) = this_ptr;
13514: }
13515: }
13516:
13517: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13518:
1.1.1.2 misho 13519: CHECK_EXCEPTION();
1.1 misho 13520: ZEND_VM_NEXT_OPCODE();
13521: }
13522:
13523: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13524: {
1.1.1.2 misho 13525: USE_OPLINE
1.1 misho 13526: zval *function_name;
13527: zend_class_entry *ce;
13528:
1.1.1.2 misho 13529: SAVE_OPLINE();
1.1 misho 13530: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
13531:
13532: if (IS_VAR == IS_CONST) {
13533: /* no function found. try a static method in class */
1.1.1.2 misho 13534: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
13535: ce = CACHED_PTR(opline->op1.literal->cache_slot);
13536: } else {
13537: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 13538: if (UNEXPECTED(EG(exception) != NULL)) {
13539: HANDLE_EXCEPTION();
13540: }
1.1.1.2 misho 13541: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 13542: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 13543: }
13544: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 13545: }
13546: EX(called_scope) = ce;
13547: } else {
1.1.1.2 misho 13548: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 13549:
1.1.1.2 misho 13550: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 13551: EX(called_scope) = EG(called_scope);
13552: } else {
13553: EX(called_scope) = ce;
13554: }
13555: }
1.1.1.2 misho 13556:
13557: if (IS_VAR == IS_CONST &&
13558: IS_CONST == IS_CONST &&
13559: CACHED_PTR(opline->op2.literal->cache_slot)) {
13560: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
13561: } else if (IS_VAR != IS_CONST &&
13562: IS_CONST == IS_CONST &&
13563: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
13564: /* do nothing */
13565: } else if (IS_CONST != IS_UNUSED) {
1.1 misho 13566: char *function_name_strval = NULL;
13567: int function_name_strlen = 0;
13568:
13569:
13570: if (IS_CONST == IS_CONST) {
1.1.1.2 misho 13571: function_name_strval = Z_STRVAL_P(opline->op2.zv);
13572: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 13573: } else {
1.1.1.2 misho 13574: function_name = opline->op2.zv;
1.1 misho 13575:
1.1.1.2 misho 13576: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 13577: zend_error_noreturn(E_ERROR, "Function name must be a string");
13578: } else {
13579: function_name_strval = Z_STRVAL_P(function_name);
13580: function_name_strlen = Z_STRLEN_P(function_name);
13581: }
13582: }
13583:
13584: if (function_name_strval) {
13585: if (ce->get_static_method) {
13586: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
13587: } else {
1.1.1.2 misho 13588: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 13589: }
1.1.1.2 misho 13590: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 13591: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
13592: }
1.1.1.2 misho 13593: if (IS_CONST == IS_CONST &&
13594: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
13595: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
13596: if (IS_VAR == IS_CONST) {
13597: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
13598: } else {
13599: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
13600: }
13601: }
1.1 misho 13602: }
13603: if (IS_CONST != IS_CONST) {
13604:
13605: }
13606: } else {
1.1.1.2 misho 13607: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 13608: zend_error_noreturn(E_ERROR, "Cannot call constructor");
13609: }
13610: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 13611: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 13612: }
13613: EX(fbc) = ce->constructor;
13614: }
13615:
13616: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
13617: EX(object) = NULL;
13618: } else {
13619: if (EG(This) &&
13620: Z_OBJ_HT_P(EG(This))->get_class_entry &&
13621: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
13622: /* We are calling method of the other (incompatible) class,
13623: but passing $this. This is done for compatibility with php-4. */
13624: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 13625: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 13626: } else {
13627: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 13628: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 13629: }
13630: }
13631: if ((EX(object) = EG(This))) {
13632: Z_ADDREF_P(EX(object));
13633: EX(called_scope) = Z_OBJCE_P(EX(object));
13634: }
13635: }
13636:
1.1.1.2 misho 13637: CHECK_EXCEPTION();
1.1 misho 13638: ZEND_VM_NEXT_OPCODE();
13639: }
13640:
13641: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13642: {
1.1.1.2 misho 13643: USE_OPLINE
1.1 misho 13644: zend_free_op free_op1;
13645:
1.1.1.2 misho 13646: SAVE_OPLINE();
1.1 misho 13647: if (IS_VAR==IS_VAR) {
1.1.1.2 misho 13648: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 13649: }
1.1.1.2 misho 13650: is_equal_function(&EX_T(opline->result.var).tmp_var,
13651: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
13652: opline->op2.zv TSRMLS_CC);
13653:
13654: CHECK_EXCEPTION();
1.1 misho 13655: ZEND_VM_NEXT_OPCODE();
13656: }
13657:
13658: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13659: {
1.1.1.2 misho 13660: USE_OPLINE
1.1 misho 13661:
1.1.1.2 misho 13662: SAVE_OPLINE();
1.1 misho 13663: if (IS_VAR == IS_UNUSED) {
1.1.1.2 misho 13664: zend_constant *c;
13665: zval *retval;
13666:
13667: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
13668: c = CACHED_PTR(opline->op2.literal->cache_slot);
13669: } else if ((c = zend_quick_get_constant(opline->op2.literal + 1, opline->extended_value TSRMLS_CC)) == NULL) {
1.1 misho 13670: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
1.1.1.2 misho 13671: char *actual = (char *)zend_memrchr(Z_STRVAL_P(opline->op2.zv), '\\', Z_STRLEN_P(opline->op2.zv));
1.1 misho 13672: if(!actual) {
1.1.1.2 misho 13673: actual = Z_STRVAL_P(opline->op2.zv);
1.1 misho 13674: } else {
13675: actual++;
13676: }
13677: /* non-qualified constant - allow text substitution */
13678: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
1.1.1.2 misho 13679: ZVAL_STRINGL(&EX_T(opline->result.var).tmp_var, actual, Z_STRLEN_P(opline->op2.zv)-(actual - Z_STRVAL_P(opline->op2.zv)), 1);
13680: CHECK_EXCEPTION();
13681: ZEND_VM_NEXT_OPCODE();
1.1 misho 13682: } else {
1.1.1.2 misho 13683: zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 13684: }
1.1.1.2 misho 13685: } else {
13686: CACHE_PTR(opline->op2.literal->cache_slot, c);
1.1 misho 13687: }
1.1.1.2 misho 13688: retval = &EX_T(opline->result.var).tmp_var;
13689: ZVAL_COPY_VALUE(retval, &c->value);
13690: zval_copy_ctor(retval);
13691: CHECK_EXCEPTION();
1.1 misho 13692: ZEND_VM_NEXT_OPCODE();
13693: } else {
13694: /* class constant */
13695: zend_class_entry *ce;
13696: zval **value;
13697:
13698: if (IS_VAR == IS_CONST) {
1.1.1.2 misho 13699: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
13700: value = CACHED_PTR(opline->op2.literal->cache_slot);
13701: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
13702: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
13703: CHECK_EXCEPTION();
13704: ZEND_VM_NEXT_OPCODE();
13705: } else if (CACHED_PTR(opline->op1.literal->cache_slot)) {
13706: ce = CACHED_PTR(opline->op1.literal->cache_slot);
13707: } else {
13708: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 13709: if (UNEXPECTED(EG(exception) != NULL)) {
13710: HANDLE_EXCEPTION();
13711: }
1.1.1.2 misho 13712: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 13713: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 13714: }
13715: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 13716: }
13717: } else {
1.1.1.2 misho 13718: ce = EX_T(opline->op1.var).class_entry;
13719: if ((value = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce)) != NULL) {
13720: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
13721: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
13722: CHECK_EXCEPTION();
13723: ZEND_VM_NEXT_OPCODE();
13724: }
1.1 misho 13725: }
13726:
1.1.1.2 misho 13727: if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) {
1.1 misho 13728: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
13729: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
13730: zend_class_entry *old_scope = EG(scope);
13731:
13732: EG(scope) = ce;
13733: zval_update_constant(value, (void *) 1 TSRMLS_CC);
13734: EG(scope) = old_scope;
13735: }
1.1.1.2 misho 13736: if (IS_VAR == IS_CONST) {
13737: CACHE_PTR(opline->op2.literal->cache_slot, value);
13738: } else {
13739: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, value);
13740: }
13741: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
13742: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 13743: } else {
1.1.1.2 misho 13744: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 13745: }
13746:
1.1.1.2 misho 13747: CHECK_EXCEPTION();
1.1 misho 13748: ZEND_VM_NEXT_OPCODE();
13749: }
13750: }
13751:
13752: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13753: {
1.1.1.2 misho 13754: USE_OPLINE
1.1 misho 13755: zend_free_op free_op1;
13756: zval *expr_ptr;
13757:
1.1.1.2 misho 13758: SAVE_OPLINE();
13759: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
13760: zval **expr_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13761:
1.1.1.2 misho 13762: if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
13763: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
13764: }
13765: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 13766: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 13767: Z_ADDREF_P(expr_ptr);
1.1 misho 13768: } else {
1.1.1.2 misho 13769: expr_ptr=_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13770: if (0) { /* temporary variable */
13771: zval *new_expr;
1.1 misho 13772:
1.1.1.2 misho 13773: ALLOC_ZVAL(new_expr);
13774: INIT_PZVAL_COPY(new_expr, expr_ptr);
13775: expr_ptr = new_expr;
13776: } else if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 13777: zval *new_expr;
13778:
13779: ALLOC_ZVAL(new_expr);
13780: INIT_PZVAL_COPY(new_expr, expr_ptr);
13781: expr_ptr = new_expr;
13782: zendi_zval_copy_ctor(*expr_ptr);
13783: } else {
13784: Z_ADDREF_P(expr_ptr);
13785: }
13786: }
1.1.1.2 misho 13787:
13788: if (IS_CONST != IS_UNUSED) {
13789:
13790: zval *offset = opline->op2.zv;
13791: ulong hval;
13792:
1.1 misho 13793: switch (Z_TYPE_P(offset)) {
13794: case IS_DOUBLE:
1.1.1.2 misho 13795: hval = zend_dval_to_lval(Z_DVAL_P(offset));
13796: goto num_index;
1.1 misho 13797: case IS_LONG:
13798: case IS_BOOL:
1.1.1.2 misho 13799: hval = Z_LVAL_P(offset);
13800: num_index:
13801: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 13802: break;
13803: case IS_STRING:
1.1.1.2 misho 13804: if (IS_CONST == IS_CONST) {
13805: hval = Z_HASH_P(offset);
13806: } else {
13807: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
13808: if (IS_INTERNED(Z_STRVAL_P(offset))) {
13809: hval = INTERNED_HASH(Z_STRVAL_P(offset));
13810: } else {
13811: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
13812: }
13813: }
13814: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 13815: break;
13816: case IS_NULL:
1.1.1.2 misho 13817: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 13818: break;
13819: default:
13820: zend_error(E_WARNING, "Illegal offset type");
13821: zval_ptr_dtor(&expr_ptr);
13822: /* do nothing */
13823: break;
13824: }
13825:
13826: } else {
1.1.1.2 misho 13827: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 13828: }
1.1.1.2 misho 13829: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
1.1 misho 13830: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13831: } else {
13832: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13833: }
1.1.1.2 misho 13834: CHECK_EXCEPTION();
1.1 misho 13835: ZEND_VM_NEXT_OPCODE();
13836: }
13837:
13838: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13839: {
1.1.1.2 misho 13840: USE_OPLINE
1.1 misho 13841:
1.1.1.2 misho 13842: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 13843: if (IS_VAR == IS_UNUSED) {
13844: ZEND_VM_NEXT_OPCODE();
13845: #if 0 || IS_VAR != IS_UNUSED
13846: } else {
13847: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
13848: #endif
13849: }
13850: }
13851:
1.1.1.2 misho 13852: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13853: {
13854: USE_OPLINE
13855: zval tmp, *varname;
13856: HashTable *target_symbol_table;
13857: zend_free_op free_op1;
13858:
13859: SAVE_OPLINE();
13860: if (IS_VAR == IS_CV &&
13861: IS_CONST == IS_UNUSED &&
13862: (opline->extended_value & ZEND_QUICK_SET)) {
13863: if (EG(active_symbol_table)) {
13864: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
13865:
13866: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
13867: EX_CV(opline->op1.var) = NULL;
13868: } else if (EX_CV(opline->op1.var)) {
13869: zval_ptr_dtor(EX_CV(opline->op1.var));
13870: EX_CV(opline->op1.var) = NULL;
13871: }
13872: CHECK_EXCEPTION();
13873: ZEND_VM_NEXT_OPCODE();
13874: }
13875:
13876: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
13877:
13878: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
13879: ZVAL_COPY_VALUE(&tmp, varname);
13880: zval_copy_ctor(&tmp);
13881: convert_to_string(&tmp);
13882: varname = &tmp;
13883: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
13884: Z_ADDREF_P(varname);
13885: }
13886:
13887: if (IS_CONST != IS_UNUSED) {
13888: zend_class_entry *ce;
13889:
13890: if (IS_CONST == IS_CONST) {
13891: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
13892: ce = CACHED_PTR(opline->op2.literal->cache_slot);
13893: } else {
13894: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 13895: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 13896: if (IS_VAR != IS_CONST && varname == &tmp) {
13897: zval_dtor(&tmp);
13898: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
13899: zval_ptr_dtor(&varname);
13900: }
13901: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.4 misho 13902: HANDLE_EXCEPTION();
13903: }
13904: if (UNEXPECTED(ce == NULL)) {
13905: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 13906: }
13907: CACHE_PTR(opline->op2.literal->cache_slot, ce);
13908: }
13909: } else {
13910: ce = EX_T(opline->op2.var).class_entry;
13911: }
13912: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
13913: } else {
13914: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
13915:
13916: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
13917: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
13918: }
13919:
13920: if (IS_VAR != IS_CONST && varname == &tmp) {
13921: zval_dtor(&tmp);
13922: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
13923: zval_ptr_dtor(&varname);
13924: }
13925: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
13926: CHECK_EXCEPTION();
13927: ZEND_VM_NEXT_OPCODE();
13928: }
13929:
1.1 misho 13930: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
13931: {
1.1.1.2 misho 13932: USE_OPLINE
1.1 misho 13933: zend_free_op free_op1;
1.1.1.2 misho 13934: zval **container;
1.1 misho 13935: zval *offset;
1.1.1.2 misho 13936: ulong hval;
1.1 misho 13937:
1.1.1.2 misho 13938: SAVE_OPLINE();
13939: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 13940: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
13941: SEPARATE_ZVAL_IF_NOT_REF(container);
13942: }
1.1.1.2 misho 13943: offset = opline->op2.zv;
1.1 misho 13944:
13945: if (IS_VAR != IS_VAR || container) {
13946: switch (Z_TYPE_PP(container)) {
13947: case IS_ARRAY: {
13948: HashTable *ht = Z_ARRVAL_PP(container);
13949:
13950: switch (Z_TYPE_P(offset)) {
13951: case IS_DOUBLE:
1.1.1.2 misho 13952: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 13953: zend_hash_index_del(ht, hval);
13954: break;
1.1 misho 13955: case IS_RESOURCE:
13956: case IS_BOOL:
13957: case IS_LONG:
1.1.1.2 misho 13958: hval = Z_LVAL_P(offset);
13959: zend_hash_index_del(ht, hval);
1.1 misho 13960: break;
13961: case IS_STRING:
13962: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
13963: Z_ADDREF_P(offset);
13964: }
1.1.1.2 misho 13965: if (IS_CONST == IS_CONST) {
13966: hval = Z_HASH_P(offset);
13967: } else {
13968: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
13969: if (IS_INTERNED(Z_STRVAL_P(offset))) {
13970: hval = INTERNED_HASH(Z_STRVAL_P(offset));
13971: } else {
13972: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 13973: }
13974: }
1.1.1.2 misho 13975: if (ht == &EG(symbol_table)) {
13976: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
13977: } else {
13978: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
13979: }
13980: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
13981: zval_ptr_dtor(&offset);
13982: }
13983: break;
13984: num_index_dim:
13985: zend_hash_index_del(ht, hval);
1.1 misho 13986: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
13987: zval_ptr_dtor(&offset);
13988: }
13989: break;
13990: case IS_NULL:
13991: zend_hash_del(ht, "", sizeof(""));
13992: break;
13993: default:
13994: zend_error(E_WARNING, "Illegal offset type in unset");
13995: break;
13996: }
13997:
13998: break;
13999: }
14000: case IS_OBJECT:
1.1.1.2 misho 14001: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 14002: zend_error_noreturn(E_ERROR, "Cannot use object as array");
14003: }
14004: if (0) {
14005: MAKE_REAL_ZVAL_PTR(offset);
14006: }
14007: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
14008: if (0) {
14009: zval_ptr_dtor(&offset);
14010: } else {
14011:
14012: }
14013: break;
14014: case IS_STRING:
14015: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
14016: ZEND_VM_CONTINUE(); /* bailed out before */
14017: default:
14018:
14019: break;
14020: }
14021: } else {
14022:
14023: }
14024: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14025:
1.1.1.2 misho 14026: CHECK_EXCEPTION();
1.1 misho 14027: ZEND_VM_NEXT_OPCODE();
14028: }
14029:
14030: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14031: {
1.1.1.2 misho 14032: USE_OPLINE
1.1 misho 14033: zend_free_op free_op1;
1.1.1.2 misho 14034: zval **container;
14035: zval *offset;
14036:
14037: SAVE_OPLINE();
14038: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
14039: offset = opline->op2.zv;
1.1 misho 14040:
14041: if (IS_VAR != IS_VAR || container) {
14042: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
14043: SEPARATE_ZVAL_IF_NOT_REF(container);
14044: }
1.1.1.2 misho 14045: if (Z_TYPE_PP(container) == IS_OBJECT) {
14046: if (0) {
14047: MAKE_REAL_ZVAL_PTR(offset);
14048: }
14049: if (Z_OBJ_HT_P(*container)->unset_property) {
14050: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
14051: } else {
14052: zend_error(E_NOTICE, "Trying to unset property of non-object");
14053: }
14054: if (0) {
14055: zval_ptr_dtor(&offset);
14056: } else {
14057:
14058: }
14059: } else {
14060:
14061: }
14062: } else {
14063:
14064: }
14065: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14066:
14067: CHECK_EXCEPTION();
14068: ZEND_VM_NEXT_OPCODE();
14069: }
14070:
14071: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14072: {
14073: USE_OPLINE
14074: zval **value;
14075: zend_bool isset = 1;
14076:
14077: SAVE_OPLINE();
14078: if (IS_VAR == IS_CV &&
14079: IS_CONST == IS_UNUSED &&
14080: (opline->extended_value & ZEND_QUICK_SET)) {
14081: if (EX_CV(opline->op1.var)) {
14082: value = EX_CV(opline->op1.var);
14083: } else if (EG(active_symbol_table)) {
14084: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
14085:
14086: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
14087: isset = 0;
14088: }
14089: } else {
14090: isset = 0;
14091: }
14092: } else {
14093: HashTable *target_symbol_table;
14094: zend_free_op free_op1;
14095: zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
14096:
14097: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
14098: ZVAL_COPY_VALUE(&tmp, varname);
14099: zval_copy_ctor(&tmp);
14100: convert_to_string(&tmp);
14101: varname = &tmp;
14102: }
14103:
14104: if (IS_CONST != IS_UNUSED) {
14105: zend_class_entry *ce;
14106:
14107: if (IS_CONST == IS_CONST) {
14108: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
14109: ce = CACHED_PTR(opline->op2.literal->cache_slot);
14110: } else {
14111: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
14112: if (UNEXPECTED(ce == NULL)) {
14113: CHECK_EXCEPTION();
14114: ZEND_VM_NEXT_OPCODE();
14115: }
14116: CACHE_PTR(opline->op2.literal->cache_slot, ce);
14117: }
1.1 misho 14118: } else {
1.1.1.2 misho 14119: ce = EX_T(opline->op2.var).class_entry;
1.1 misho 14120: }
1.1.1.2 misho 14121: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
14122: if (!value) {
14123: isset = 0;
1.1 misho 14124: }
14125: } else {
1.1.1.2 misho 14126: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
14127: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
14128: isset = 0;
14129: }
14130: }
1.1 misho 14131:
1.1.1.2 misho 14132: if (IS_VAR != IS_CONST && varname == &tmp) {
14133: zval_dtor(&tmp);
1.1 misho 14134: }
1.1.1.2 misho 14135: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14136: }
1.1 misho 14137:
1.1.1.2 misho 14138: if (opline->extended_value & ZEND_ISSET) {
14139: if (isset && Z_TYPE_PP(value) != IS_NULL) {
14140: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
14141: } else {
14142: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
14143: }
14144: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
14145: if (!isset || !i_zend_is_true(*value)) {
14146: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
14147: } else {
14148: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
14149: }
1.1 misho 14150: }
14151:
1.1.1.2 misho 14152: CHECK_EXCEPTION();
1.1 misho 14153: ZEND_VM_NEXT_OPCODE();
14154: }
14155:
14156: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
14157: {
1.1.1.2 misho 14158: USE_OPLINE
1.1 misho 14159: zend_free_op free_op1;
1.1.1.2 misho 14160: zval **container;
1.1 misho 14161: zval **value = NULL;
14162: int result = 0;
1.1.1.2 misho 14163: ulong hval;
14164: zval *offset;
1.1 misho 14165:
1.1.1.2 misho 14166: SAVE_OPLINE();
14167: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 14168:
1.1.1.2 misho 14169: offset = opline->op2.zv;
1.1 misho 14170:
1.1.1.2 misho 14171: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
14172: HashTable *ht;
14173: int isset = 0;
1.1 misho 14174:
1.1.1.2 misho 14175: ht = Z_ARRVAL_PP(container);
1.1 misho 14176:
1.1.1.2 misho 14177: switch (Z_TYPE_P(offset)) {
14178: case IS_DOUBLE:
14179: hval = zend_dval_to_lval(Z_DVAL_P(offset));
14180: goto num_index_prop;
14181: case IS_RESOURCE:
14182: case IS_BOOL:
14183: case IS_LONG:
14184: hval = Z_LVAL_P(offset);
14185: num_index_prop:
14186: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
14187: isset = 1;
14188: }
14189: break;
14190: case IS_STRING:
14191: if (IS_CONST == IS_CONST) {
14192: hval = Z_HASH_P(offset);
14193: } else {
14194: if (!prop_dim) {
14195: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 14196: }
1.1.1.2 misho 14197: if (IS_INTERNED(Z_STRVAL_P(offset))) {
14198: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 14199: } else {
1.1.1.2 misho 14200: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 14201: }
14202: }
1.1.1.2 misho 14203: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
14204: isset = 1;
1.1 misho 14205: }
1.1.1.2 misho 14206: break;
14207: case IS_NULL:
14208: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
14209: isset = 1;
14210: }
14211: break;
14212: default:
14213: zend_error(E_WARNING, "Illegal offset type in isset or empty");
14214: break;
14215: }
14216:
14217: if (opline->extended_value & ZEND_ISSET) {
14218: if (isset && Z_TYPE_PP(value) == IS_NULL) {
14219: result = 0;
14220: } else {
14221: result = isset;
1.1 misho 14222: }
1.1.1.2 misho 14223: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
14224: if (!isset || !i_zend_is_true(*value)) {
14225: result = 0;
1.1 misho 14226: } else {
1.1.1.2 misho 14227: result = 1;
14228: }
14229: }
1.1 misho 14230:
1.1.1.2 misho 14231: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
14232: if (0) {
14233: MAKE_REAL_ZVAL_PTR(offset);
14234: }
14235: if (prop_dim) {
14236: if (Z_OBJ_HT_P(*container)->has_property) {
14237: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
14238: } else {
14239: zend_error(E_NOTICE, "Trying to check property of non-object");
14240: result = 0;
14241: }
14242: } else {
14243: if (Z_OBJ_HT_P(*container)->has_dimension) {
14244: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
14245: } else {
14246: zend_error(E_NOTICE, "Trying to check element of non-array");
14247: result = 0;
1.1 misho 14248: }
1.1.1.2 misho 14249: }
14250: if (0) {
14251: zval_ptr_dtor(&offset);
14252: } else {
14253:
14254: }
14255: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
14256: zval tmp;
1.1 misho 14257:
1.1.1.2 misho 14258: if (Z_TYPE_P(offset) != IS_LONG) {
14259: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
14260: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
14261: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
14262: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 14263: zval_copy_ctor(&tmp);
14264: convert_to_long(&tmp);
14265: offset = &tmp;
1.1.1.2 misho 14266: } else {
14267: /* can not be converted to proper offset, return "not set" */
14268: result = 0;
1.1 misho 14269: }
1.1.1.2 misho 14270: }
14271: if (Z_TYPE_P(offset) == IS_LONG) {
14272: if (opline->extended_value & ZEND_ISSET) {
14273: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
14274: result = 1;
14275: }
14276: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
14277: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
14278: result = 1;
1.1 misho 14279: }
14280: }
1.1.1.2 misho 14281: }
1.1 misho 14282:
1.1.1.2 misho 14283: } else {
1.1 misho 14284:
14285: }
14286:
1.1.1.2 misho 14287: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
14288: if (opline->extended_value & ZEND_ISSET) {
14289: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
14290: } else {
14291: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 14292: }
14293:
14294: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14295:
1.1.1.2 misho 14296: CHECK_EXCEPTION();
1.1 misho 14297: ZEND_VM_NEXT_OPCODE();
14298: }
14299:
14300: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14301: {
14302: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14303: }
14304:
14305: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14306: {
14307: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14308: }
14309:
14310: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14311: {
1.1.1.2 misho 14312: USE_OPLINE
1.1 misho 14313: zend_free_op free_op1, free_op2;
14314:
1.1.1.2 misho 14315: SAVE_OPLINE();
14316: fast_add_function(&EX_T(opline->result.var).tmp_var,
14317: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14318: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14319: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14320: zval_dtor(free_op2.var);
1.1.1.2 misho 14321: CHECK_EXCEPTION();
1.1 misho 14322: ZEND_VM_NEXT_OPCODE();
14323: }
14324:
14325: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14326: {
1.1.1.2 misho 14327: USE_OPLINE
1.1 misho 14328: zend_free_op free_op1, free_op2;
14329:
1.1.1.2 misho 14330: SAVE_OPLINE();
14331: fast_sub_function(&EX_T(opline->result.var).tmp_var,
14332: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14333: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14334: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14335: zval_dtor(free_op2.var);
1.1.1.2 misho 14336: CHECK_EXCEPTION();
1.1 misho 14337: ZEND_VM_NEXT_OPCODE();
14338: }
14339:
14340: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14341: {
1.1.1.2 misho 14342: USE_OPLINE
1.1 misho 14343: zend_free_op free_op1, free_op2;
14344:
1.1.1.2 misho 14345: SAVE_OPLINE();
14346: fast_mul_function(&EX_T(opline->result.var).tmp_var,
14347: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14348: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14349: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14350: zval_dtor(free_op2.var);
1.1.1.2 misho 14351: CHECK_EXCEPTION();
1.1 misho 14352: ZEND_VM_NEXT_OPCODE();
14353: }
14354:
14355: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14356: {
1.1.1.2 misho 14357: USE_OPLINE
1.1 misho 14358: zend_free_op free_op1, free_op2;
14359:
1.1.1.2 misho 14360: SAVE_OPLINE();
14361: fast_div_function(&EX_T(opline->result.var).tmp_var,
14362: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14363: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14364: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14365: zval_dtor(free_op2.var);
1.1.1.2 misho 14366: CHECK_EXCEPTION();
1.1 misho 14367: ZEND_VM_NEXT_OPCODE();
14368: }
14369:
14370: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14371: {
1.1.1.2 misho 14372: USE_OPLINE
1.1 misho 14373: zend_free_op free_op1, free_op2;
14374:
1.1.1.2 misho 14375: SAVE_OPLINE();
14376: fast_mod_function(&EX_T(opline->result.var).tmp_var,
14377: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14378: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14379: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14380: zval_dtor(free_op2.var);
1.1.1.2 misho 14381: CHECK_EXCEPTION();
1.1 misho 14382: ZEND_VM_NEXT_OPCODE();
14383: }
14384:
14385: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14386: {
1.1.1.2 misho 14387: USE_OPLINE
1.1 misho 14388: zend_free_op free_op1, free_op2;
14389:
1.1.1.2 misho 14390: SAVE_OPLINE();
14391: shift_left_function(&EX_T(opline->result.var).tmp_var,
14392: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14393: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14394: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14395: zval_dtor(free_op2.var);
1.1.1.2 misho 14396: CHECK_EXCEPTION();
1.1 misho 14397: ZEND_VM_NEXT_OPCODE();
14398: }
14399:
14400: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14401: {
1.1.1.2 misho 14402: USE_OPLINE
1.1 misho 14403: zend_free_op free_op1, free_op2;
14404:
1.1.1.2 misho 14405: SAVE_OPLINE();
14406: shift_right_function(&EX_T(opline->result.var).tmp_var,
14407: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14408: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14409: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14410: zval_dtor(free_op2.var);
1.1.1.2 misho 14411: CHECK_EXCEPTION();
1.1 misho 14412: ZEND_VM_NEXT_OPCODE();
14413: }
14414:
14415: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14416: {
1.1.1.2 misho 14417: USE_OPLINE
1.1 misho 14418: zend_free_op free_op1, free_op2;
14419:
1.1.1.2 misho 14420: SAVE_OPLINE();
14421: concat_function(&EX_T(opline->result.var).tmp_var,
14422: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14423: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14424: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14425: zval_dtor(free_op2.var);
1.1.1.2 misho 14426: CHECK_EXCEPTION();
1.1 misho 14427: ZEND_VM_NEXT_OPCODE();
14428: }
14429:
14430: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14431: {
1.1.1.2 misho 14432: USE_OPLINE
1.1 misho 14433: zend_free_op free_op1, free_op2;
14434:
1.1.1.2 misho 14435: SAVE_OPLINE();
14436: is_identical_function(&EX_T(opline->result.var).tmp_var,
14437: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14438: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14439: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14440: zval_dtor(free_op2.var);
1.1.1.2 misho 14441: CHECK_EXCEPTION();
1.1 misho 14442: ZEND_VM_NEXT_OPCODE();
14443: }
14444:
14445: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14446: {
1.1.1.2 misho 14447: USE_OPLINE
1.1 misho 14448: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14449: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 14450:
1.1.1.2 misho 14451: SAVE_OPLINE();
1.1 misho 14452: is_identical_function(result,
1.1.1.2 misho 14453: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14454: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14455: Z_LVAL_P(result) = !Z_LVAL_P(result);
14456: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14457: zval_dtor(free_op2.var);
1.1.1.2 misho 14458: CHECK_EXCEPTION();
1.1 misho 14459: ZEND_VM_NEXT_OPCODE();
14460: }
14461:
14462: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14463: {
1.1.1.2 misho 14464: USE_OPLINE
1.1 misho 14465: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14466: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 14467:
1.1.1.2 misho 14468: SAVE_OPLINE();
14469: ZVAL_BOOL(result, fast_equal_function(result,
14470: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14471: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 14472: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14473: zval_dtor(free_op2.var);
1.1.1.2 misho 14474: CHECK_EXCEPTION();
1.1 misho 14475: ZEND_VM_NEXT_OPCODE();
14476: }
14477:
14478: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14479: {
1.1.1.2 misho 14480: USE_OPLINE
1.1 misho 14481: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14482: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 14483:
1.1.1.2 misho 14484: SAVE_OPLINE();
14485: ZVAL_BOOL(result, fast_not_equal_function(result,
14486: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14487: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 14488: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14489: zval_dtor(free_op2.var);
1.1.1.2 misho 14490: CHECK_EXCEPTION();
1.1 misho 14491: ZEND_VM_NEXT_OPCODE();
14492: }
14493:
14494: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14495: {
1.1.1.2 misho 14496: USE_OPLINE
1.1 misho 14497: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14498: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 14499:
1.1.1.2 misho 14500: SAVE_OPLINE();
14501: ZVAL_BOOL(result, fast_is_smaller_function(result,
14502: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14503: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 14504: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14505: zval_dtor(free_op2.var);
1.1.1.2 misho 14506: CHECK_EXCEPTION();
1.1 misho 14507: ZEND_VM_NEXT_OPCODE();
14508: }
14509:
14510: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14511: {
1.1.1.2 misho 14512: USE_OPLINE
1.1 misho 14513: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14514: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 14515:
1.1.1.2 misho 14516: SAVE_OPLINE();
14517: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
14518: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14519: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 14520: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14521: zval_dtor(free_op2.var);
1.1.1.2 misho 14522: CHECK_EXCEPTION();
1.1 misho 14523: ZEND_VM_NEXT_OPCODE();
14524: }
14525:
14526: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14527: {
1.1.1.2 misho 14528: USE_OPLINE
1.1 misho 14529: zend_free_op free_op1, free_op2;
14530:
1.1.1.2 misho 14531: SAVE_OPLINE();
14532: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
14533: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14534: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14535: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14536: zval_dtor(free_op2.var);
1.1.1.2 misho 14537: CHECK_EXCEPTION();
1.1 misho 14538: ZEND_VM_NEXT_OPCODE();
14539: }
14540:
14541: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14542: {
1.1.1.2 misho 14543: USE_OPLINE
1.1 misho 14544: zend_free_op free_op1, free_op2;
14545:
1.1.1.2 misho 14546: SAVE_OPLINE();
14547: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
14548: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14549: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14550: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14551: zval_dtor(free_op2.var);
1.1.1.2 misho 14552: CHECK_EXCEPTION();
1.1 misho 14553: ZEND_VM_NEXT_OPCODE();
14554: }
14555:
14556: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14557: {
1.1.1.2 misho 14558: USE_OPLINE
1.1 misho 14559: zend_free_op free_op1, free_op2;
14560:
1.1.1.2 misho 14561: SAVE_OPLINE();
14562: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
14563: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14564: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14565: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14566: zval_dtor(free_op2.var);
1.1.1.2 misho 14567: CHECK_EXCEPTION();
1.1 misho 14568: ZEND_VM_NEXT_OPCODE();
14569: }
14570:
14571: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14572: {
1.1.1.2 misho 14573: USE_OPLINE
1.1 misho 14574: zend_free_op free_op1, free_op2;
14575:
1.1.1.2 misho 14576: SAVE_OPLINE();
14577: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
14578: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
14579: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 14580: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14581: zval_dtor(free_op2.var);
1.1.1.2 misho 14582: CHECK_EXCEPTION();
1.1 misho 14583: ZEND_VM_NEXT_OPCODE();
14584: }
14585:
14586: 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)
14587: {
1.1.1.2 misho 14588: USE_OPLINE
1.1 misho 14589: zend_free_op free_op1, free_op2, free_op_data1;
1.1.1.2 misho 14590: zval **object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 14591: zval *object;
1.1.1.2 misho 14592: zval *property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
14593: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 14594: int have_get_ptr = 0;
14595:
1.1.1.2 misho 14596: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 14597: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
14598: }
14599:
14600: make_real_object(object_ptr TSRMLS_CC);
14601: object = *object_ptr;
14602:
1.1.1.2 misho 14603: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 14604: zend_error(E_WARNING, "Attempt to assign property of non-object");
14605: zval_dtor(free_op2.var);
14606: FREE_OP(free_op_data1);
14607:
1.1.1.2 misho 14608: if (RETURN_VALUE_USED(opline)) {
14609: PZVAL_LOCK(&EG(uninitialized_zval));
14610: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
14611: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 14612: }
14613: } else {
14614: /* here we are sure we are dealing with an object */
14615: if (1) {
14616: MAKE_REAL_ZVAL_PTR(property);
14617: }
14618:
14619: /* here property is a string */
14620: if (opline->extended_value == ZEND_ASSIGN_OBJ
14621: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 14622: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14623: if (zptr != NULL) { /* NULL means no success in getting PTR */
14624: SEPARATE_ZVAL_IF_NOT_REF(zptr);
14625:
14626: have_get_ptr = 1;
14627: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 14628: if (RETURN_VALUE_USED(opline)) {
1.1 misho 14629: PZVAL_LOCK(*zptr);
1.1.1.2 misho 14630: EX_T(opline->result.var).var.ptr = *zptr;
14631: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 14632: }
14633: }
14634: }
14635:
14636: if (!have_get_ptr) {
14637: zval *z = NULL;
14638:
14639: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
14640: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 14641: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14642: }
14643: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
14644: if (Z_OBJ_HT_P(object)->read_dimension) {
14645: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
14646: }
14647: }
14648: if (z) {
14649: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
14650: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
14651:
14652: if (Z_REFCOUNT_P(z) == 0) {
14653: GC_REMOVE_ZVAL_FROM_BUFFER(z);
14654: zval_dtor(z);
14655: FREE_ZVAL(z);
14656: }
14657: z = value;
14658: }
14659: Z_ADDREF_P(z);
14660: SEPARATE_ZVAL_IF_NOT_REF(&z);
14661: binary_op(z, z, value TSRMLS_CC);
14662: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 14663: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14664: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
14665: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
14666: }
1.1.1.2 misho 14667: if (RETURN_VALUE_USED(opline)) {
1.1 misho 14668: PZVAL_LOCK(z);
1.1.1.2 misho 14669: EX_T(opline->result.var).var.ptr = z;
14670: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 14671: }
14672: zval_ptr_dtor(&z);
14673: } else {
14674: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 14675: if (RETURN_VALUE_USED(opline)) {
14676: PZVAL_LOCK(&EG(uninitialized_zval));
14677: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
14678: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 14679: }
14680: }
14681: }
14682:
14683: if (1) {
14684: zval_ptr_dtor(&property);
14685: } else {
14686: zval_dtor(free_op2.var);
14687: }
14688: FREE_OP(free_op_data1);
14689: }
14690:
14691: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14692: /* assign_obj has two opcodes! */
1.1.1.2 misho 14693: CHECK_EXCEPTION();
1.1 misho 14694: ZEND_VM_INC_OPCODE();
14695: ZEND_VM_NEXT_OPCODE();
14696: }
14697:
14698: 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)
14699: {
1.1.1.2 misho 14700: USE_OPLINE
1.1 misho 14701: zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
14702: zval **var_ptr;
14703: zval *value;
14704:
1.1.1.2 misho 14705: SAVE_OPLINE();
1.1 misho 14706: switch (opline->extended_value) {
14707: case ZEND_ASSIGN_OBJ:
14708: return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14709: break;
14710: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 14711: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 14712:
1.1.1.2 misho 14713: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 14714: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 14715: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 14716: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
14717: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
14718: }
14719: return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14720: } else {
1.1.1.2 misho 14721: zval *dim = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 14722:
1.1.1.2 misho 14723: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
14724: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
14725: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 14726: }
14727: }
14728: break;
14729: default:
1.1.1.2 misho 14730: value = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
14731: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 14732: /* do nothing */
14733: break;
14734: }
14735:
1.1.1.2 misho 14736: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 14737: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
14738: }
14739:
1.1.1.2 misho 14740: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
14741: if (RETURN_VALUE_USED(opline)) {
14742: PZVAL_LOCK(&EG(uninitialized_zval));
14743: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 14744: }
14745: zval_dtor(free_op2.var);
14746: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 14747: CHECK_EXCEPTION();
14748: if (opline->extended_value == ZEND_ASSIGN_DIM) {
14749: ZEND_VM_INC_OPCODE();
14750: }
1.1 misho 14751: ZEND_VM_NEXT_OPCODE();
14752: }
14753:
14754: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
14755:
1.1.1.2 misho 14756: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
14757: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 14758: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
14759: /* proxy object */
14760: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
14761: Z_ADDREF_P(objval);
14762: binary_op(objval, objval, value TSRMLS_CC);
14763: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
14764: zval_ptr_dtor(&objval);
14765: } else {
14766: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
14767: }
14768:
1.1.1.2 misho 14769: if (RETURN_VALUE_USED(opline)) {
1.1 misho 14770: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 14771: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 14772: }
14773: zval_dtor(free_op2.var);
14774:
14775: if (opline->extended_value == ZEND_ASSIGN_DIM) {
14776: FREE_OP(free_op_data1);
14777: FREE_OP_VAR_PTR(free_op_data2);
1.1.1.2 misho 14778: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14779: CHECK_EXCEPTION();
14780: ZEND_VM_INC_OPCODE();
14781: } else {
14782: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
14783: CHECK_EXCEPTION();
1.1 misho 14784: }
14785: ZEND_VM_NEXT_OPCODE();
14786: }
14787:
14788: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14789: {
14790: return zend_binary_assign_op_helper_SPEC_VAR_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14791: }
14792:
14793: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14794: {
14795: return zend_binary_assign_op_helper_SPEC_VAR_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14796: }
14797:
14798: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14799: {
14800: return zend_binary_assign_op_helper_SPEC_VAR_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14801: }
14802:
14803: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14804: {
14805: return zend_binary_assign_op_helper_SPEC_VAR_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14806: }
14807:
14808: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14809: {
14810: return zend_binary_assign_op_helper_SPEC_VAR_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14811: }
14812:
14813: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14814: {
14815: return zend_binary_assign_op_helper_SPEC_VAR_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14816: }
14817:
14818: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14819: {
14820: return zend_binary_assign_op_helper_SPEC_VAR_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14821: }
14822:
14823: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14824: {
14825: return zend_binary_assign_op_helper_SPEC_VAR_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14826: }
14827:
14828: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14829: {
14830: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14831: }
14832:
14833: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14834: {
14835: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14836: }
14837:
14838: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14839: {
14840: return zend_binary_assign_op_helper_SPEC_VAR_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14841: }
14842:
14843: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
14844: {
1.1.1.2 misho 14845: USE_OPLINE
1.1 misho 14846: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14847: zval **object_ptr;
1.1 misho 14848: zval *object;
1.1.1.2 misho 14849: zval *property;
14850: zval **retval;
1.1 misho 14851: int have_get_ptr = 0;
14852:
1.1.1.2 misho 14853: SAVE_OPLINE();
14854: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
14855: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
14856: retval = &EX_T(opline->result.var).var.ptr;
14857:
14858: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 14859: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
14860: }
14861:
14862: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
14863: object = *object_ptr;
14864:
1.1.1.2 misho 14865: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 14866: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
14867: zval_dtor(free_op2.var);
1.1.1.2 misho 14868: if (RETURN_VALUE_USED(opline)) {
14869: PZVAL_LOCK(&EG(uninitialized_zval));
14870: *retval = &EG(uninitialized_zval);
1.1 misho 14871: }
14872: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 14873: CHECK_EXCEPTION();
1.1 misho 14874: ZEND_VM_NEXT_OPCODE();
14875: }
14876:
14877: /* here we are sure we are dealing with an object */
14878:
14879: if (1) {
14880: MAKE_REAL_ZVAL_PTR(property);
14881: }
14882:
14883: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 14884: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14885: if (zptr != NULL) { /* NULL means no success in getting PTR */
14886: SEPARATE_ZVAL_IF_NOT_REF(zptr);
14887:
14888: have_get_ptr = 1;
14889: incdec_op(*zptr);
1.1.1.2 misho 14890: if (RETURN_VALUE_USED(opline)) {
1.1 misho 14891: *retval = *zptr;
14892: PZVAL_LOCK(*retval);
14893: }
14894: }
14895: }
14896:
14897: if (!have_get_ptr) {
14898: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 14899: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14900:
1.1.1.2 misho 14901: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 14902: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
14903:
14904: if (Z_REFCOUNT_P(z) == 0) {
14905: GC_REMOVE_ZVAL_FROM_BUFFER(z);
14906: zval_dtor(z);
14907: FREE_ZVAL(z);
14908: }
14909: z = value;
14910: }
14911: Z_ADDREF_P(z);
14912: SEPARATE_ZVAL_IF_NOT_REF(&z);
14913: incdec_op(z);
14914: *retval = z;
1.1.1.2 misho 14915: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
14916: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 14917: zval_ptr_dtor(&z);
14918: } else {
14919: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 14920: if (RETURN_VALUE_USED(opline)) {
14921: PZVAL_LOCK(&EG(uninitialized_zval));
14922: *retval = &EG(uninitialized_zval);
1.1 misho 14923: }
14924: }
14925: }
14926:
14927: if (1) {
14928: zval_ptr_dtor(&property);
14929: } else {
14930: zval_dtor(free_op2.var);
14931: }
14932: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 14933: CHECK_EXCEPTION();
1.1 misho 14934: ZEND_VM_NEXT_OPCODE();
14935: }
14936:
14937: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14938: {
14939: return zend_pre_incdec_property_helper_SPEC_VAR_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14940: }
14941:
14942: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
14943: {
14944: return zend_pre_incdec_property_helper_SPEC_VAR_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
14945: }
14946:
14947: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
14948: {
1.1.1.2 misho 14949: USE_OPLINE
1.1 misho 14950: zend_free_op free_op1, free_op2;
1.1.1.2 misho 14951: zval **object_ptr;
1.1 misho 14952: zval *object;
1.1.1.2 misho 14953: zval *property;
14954: zval *retval;
1.1 misho 14955: int have_get_ptr = 0;
14956:
1.1.1.2 misho 14957: SAVE_OPLINE();
14958: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
14959: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
14960: retval = &EX_T(opline->result.var).tmp_var;
14961:
14962: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 14963: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
14964: }
14965:
14966: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
14967: object = *object_ptr;
14968:
1.1.1.2 misho 14969: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 14970: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
14971: zval_dtor(free_op2.var);
1.1.1.2 misho 14972: ZVAL_NULL(retval);
1.1 misho 14973: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 14974: CHECK_EXCEPTION();
1.1 misho 14975: ZEND_VM_NEXT_OPCODE();
14976: }
14977:
14978: /* here we are sure we are dealing with an object */
14979:
14980: if (1) {
14981: MAKE_REAL_ZVAL_PTR(property);
14982: }
14983:
14984: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 14985: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 14986: if (zptr != NULL) { /* NULL means no success in getting PTR */
14987: have_get_ptr = 1;
14988: SEPARATE_ZVAL_IF_NOT_REF(zptr);
14989:
1.1.1.2 misho 14990: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 14991: zendi_zval_copy_ctor(*retval);
14992:
14993: incdec_op(*zptr);
14994:
14995: }
14996: }
14997:
14998: if (!have_get_ptr) {
14999: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 15000: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 15001: zval *z_copy;
15002:
1.1.1.2 misho 15003: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 15004: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
15005:
15006: if (Z_REFCOUNT_P(z) == 0) {
15007: GC_REMOVE_ZVAL_FROM_BUFFER(z);
15008: zval_dtor(z);
15009: FREE_ZVAL(z);
15010: }
15011: z = value;
15012: }
1.1.1.2 misho 15013: ZVAL_COPY_VALUE(retval, z);
1.1 misho 15014: zendi_zval_copy_ctor(*retval);
15015: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 15016: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 15017: zendi_zval_copy_ctor(*z_copy);
15018: incdec_op(z_copy);
15019: Z_ADDREF_P(z);
1.1.1.2 misho 15020: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 15021: zval_ptr_dtor(&z_copy);
15022: zval_ptr_dtor(&z);
15023: } else {
15024: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 15025: ZVAL_NULL(retval);
1.1 misho 15026: }
15027: }
15028:
15029: if (1) {
15030: zval_ptr_dtor(&property);
15031: } else {
15032: zval_dtor(free_op2.var);
15033: }
15034: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15035: CHECK_EXCEPTION();
1.1 misho 15036: ZEND_VM_NEXT_OPCODE();
15037: }
15038:
15039: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15040: {
15041: return zend_post_incdec_property_helper_SPEC_VAR_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
15042: }
15043:
15044: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15045: {
15046: return zend_post_incdec_property_helper_SPEC_VAR_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
15047: }
15048:
15049: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15050: {
1.1.1.2 misho 15051: USE_OPLINE
1.1 misho 15052: zend_free_op free_op1, free_op2;
1.1.1.5 ! misho 15053: zval *container;
1.1 misho 15054:
1.1.1.2 misho 15055: SAVE_OPLINE();
15056:
1.1.1.5 ! misho 15057: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 15058: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 15059: }
1.1.1.5 ! misho 15060: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 15061: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
1.1 misho 15062: zval_dtor(free_op2.var);
15063: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15064: CHECK_EXCEPTION();
1.1 misho 15065: ZEND_VM_NEXT_OPCODE();
15066: }
15067:
15068: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15069: {
1.1.1.2 misho 15070: USE_OPLINE
1.1 misho 15071: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15072: zval **container;
15073:
15074: SAVE_OPLINE();
15075: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15076:
1.1.1.2 misho 15077: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15078: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15079: }
1.1.1.2 misho 15080: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 15081: zval_dtor(free_op2.var);
1.1.1.2 misho 15082: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15083: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15084: }
15085: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15086:
15087: /* We are going to assign the result by reference */
1.1.1.2 misho 15088: if (UNEXPECTED(opline->extended_value != 0)) {
15089: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
15090:
15091: if (retval_ptr) {
15092: Z_DELREF_PP(retval_ptr);
15093: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
15094: Z_ADDREF_PP(retval_ptr);
15095: }
1.1 misho 15096: }
15097:
1.1.1.2 misho 15098: CHECK_EXCEPTION();
1.1 misho 15099: ZEND_VM_NEXT_OPCODE();
15100: }
15101:
15102: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15103: {
1.1.1.2 misho 15104: USE_OPLINE
1.1 misho 15105: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15106: zval **container;
1.1 misho 15107:
1.1.1.2 misho 15108: SAVE_OPLINE();
15109: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15110:
15111: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15112: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15113: }
1.1.1.2 misho 15114: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
1.1 misho 15115: zval_dtor(free_op2.var);
1.1.1.2 misho 15116: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15117: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15118: }
15119: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15120: CHECK_EXCEPTION();
1.1 misho 15121: ZEND_VM_NEXT_OPCODE();
15122: }
15123:
15124: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15125: {
1.1.1.2 misho 15126: USE_OPLINE
1.1 misho 15127: zend_free_op free_op1, free_op2;
1.1.1.5 ! misho 15128: zval *container;
1.1 misho 15129:
1.1.1.2 misho 15130: SAVE_OPLINE();
1.1.1.5 ! misho 15131: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 15132: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
1.1 misho 15133: zval_dtor(free_op2.var);
15134: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15135: CHECK_EXCEPTION();
1.1 misho 15136: ZEND_VM_NEXT_OPCODE();
15137: }
15138:
15139: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15140: {
1.1.1.2 misho 15141: USE_OPLINE
1.1 misho 15142: zend_free_op free_op1, free_op2;
15143:
1.1.1.2 misho 15144: SAVE_OPLINE();
15145:
15146: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 15147: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
! 15148:
1.1.1.2 misho 15149: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15150: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15151: }
1.1.1.2 misho 15152: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
15153: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15154: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15155: }
1.1.1.5 ! misho 15156: zval_dtor(free_op2.var);
! 15157: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 15158: } else {
1.1.1.5 ! misho 15159: zval *container;
! 15160:
1.1 misho 15161: if (IS_TMP_VAR == IS_UNUSED) {
15162: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
15163: }
1.1.1.5 ! misho 15164: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 15165: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
1.1.1.5 ! misho 15166: zval_dtor(free_op2.var);
! 15167: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 15168: }
1.1.1.2 misho 15169: CHECK_EXCEPTION();
1.1 misho 15170: ZEND_VM_NEXT_OPCODE();
15171: }
15172:
15173: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15174: {
1.1.1.2 misho 15175: USE_OPLINE
1.1 misho 15176: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15177: zval **container;
15178:
15179: SAVE_OPLINE();
15180: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15181:
15182: if (IS_VAR == IS_CV) {
15183: if (container != &EG(uninitialized_zval_ptr)) {
15184: SEPARATE_ZVAL_IF_NOT_REF(container);
15185: }
15186: }
1.1.1.2 misho 15187: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15188: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15189: }
1.1.1.2 misho 15190: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 15191: zval_dtor(free_op2.var);
1.1.1.2 misho 15192: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15193: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15194: }
15195: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15196: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 15197: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
15198: } else {
15199: zend_free_op free_res;
1.1.1.2 misho 15200: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 15201:
1.1.1.2 misho 15202: PZVAL_UNLOCK(*retval_ptr, &free_res);
15203: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
15204: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 15205: }
1.1.1.2 misho 15206: PZVAL_LOCK(*retval_ptr);
1.1 misho 15207: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 15208: CHECK_EXCEPTION();
15209: ZEND_VM_NEXT_OPCODE();
1.1 misho 15210: }
15211: }
15212:
1.1.1.2 misho 15213: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 15214: {
1.1.1.2 misho 15215: USE_OPLINE
1.1 misho 15216: zend_free_op free_op1;
1.1.1.2 misho 15217: zval *container;
1.1 misho 15218: zend_free_op free_op2;
1.1.1.2 misho 15219: zval *offset;
1.1 misho 15220:
1.1.1.2 misho 15221: SAVE_OPLINE();
15222: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15223: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15224:
15225: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
15226: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
15227: zend_error(E_NOTICE, "Trying to get property of non-object");
15228: PZVAL_LOCK(&EG(uninitialized_zval));
15229: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 15230: zval_dtor(free_op2.var);
15231: } else {
15232: zval *retval;
15233:
15234: if (1) {
15235: MAKE_REAL_ZVAL_PTR(offset);
15236: }
15237:
15238: /* here we are sure we are dealing with an object */
1.1.1.2 misho 15239: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 15240:
1.1.1.2 misho 15241: PZVAL_LOCK(retval);
15242: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 15243:
15244: if (1) {
15245: zval_ptr_dtor(&offset);
15246: } else {
15247: zval_dtor(free_op2.var);
15248: }
15249: }
15250:
15251: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15252: CHECK_EXCEPTION();
1.1 misho 15253: ZEND_VM_NEXT_OPCODE();
15254: }
15255:
15256: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15257: {
1.1.1.2 misho 15258: return zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 15259: }
15260:
15261: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15262: {
1.1.1.2 misho 15263: USE_OPLINE
1.1 misho 15264: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15265: zval *property;
1.1 misho 15266: zval **container;
15267:
1.1.1.2 misho 15268: SAVE_OPLINE();
15269: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15270:
1.1 misho 15271: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 15272: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
15273: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 15274: }
15275:
15276: if (1) {
15277: MAKE_REAL_ZVAL_PTR(property);
15278: }
1.1.1.2 misho 15279: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15280: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15281: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
15282: }
1.1.1.2 misho 15283:
15284: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 15285: if (1) {
15286: zval_ptr_dtor(&property);
15287: } else {
15288: zval_dtor(free_op2.var);
15289: }
1.1.1.2 misho 15290: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15291: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15292: }
15293: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15294:
15295: /* We are going to assign the result by reference */
15296: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 15297: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
15298:
15299: Z_DELREF_PP(retval_ptr);
15300: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
15301: Z_ADDREF_PP(retval_ptr);
15302: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
15303: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 15304: }
15305:
1.1.1.2 misho 15306: CHECK_EXCEPTION();
1.1 misho 15307: ZEND_VM_NEXT_OPCODE();
15308: }
15309:
15310: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15311: {
1.1.1.2 misho 15312: USE_OPLINE
1.1 misho 15313: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15314: zval *property;
15315: zval **container;
15316:
15317: SAVE_OPLINE();
15318: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15319: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15320:
15321: if (1) {
15322: MAKE_REAL_ZVAL_PTR(property);
15323: }
1.1.1.2 misho 15324: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15325: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
15326: }
1.1.1.2 misho 15327: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 15328: if (1) {
15329: zval_ptr_dtor(&property);
15330: } else {
15331: zval_dtor(free_op2.var);
15332: }
1.1.1.2 misho 15333: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15334: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15335: }
15336: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15337: CHECK_EXCEPTION();
1.1 misho 15338: ZEND_VM_NEXT_OPCODE();
15339: }
15340:
15341: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15342: {
1.1.1.2 misho 15343: USE_OPLINE
15344: zend_free_op free_op1;
15345: zval *container;
15346: zend_free_op free_op2;
15347: zval *offset;
15348:
15349: SAVE_OPLINE();
15350: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15351: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15352:
15353: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
15354: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
15355: PZVAL_LOCK(&EG(uninitialized_zval));
15356: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
15357: zval_dtor(free_op2.var);
15358: } else {
15359: zval *retval;
15360:
15361: if (1) {
15362: MAKE_REAL_ZVAL_PTR(offset);
15363: }
15364:
15365: /* here we are sure we are dealing with an object */
15366: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
15367:
15368: PZVAL_LOCK(retval);
15369: AI_SET_PTR(&EX_T(opline->result.var), retval);
15370:
15371: if (1) {
15372: zval_ptr_dtor(&offset);
15373: } else {
15374: zval_dtor(free_op2.var);
15375: }
15376: }
15377:
15378: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15379: CHECK_EXCEPTION();
15380: ZEND_VM_NEXT_OPCODE();
1.1 misho 15381: }
15382:
15383: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15384: {
1.1.1.2 misho 15385: USE_OPLINE
1.1 misho 15386:
1.1.1.2 misho 15387: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 15388: /* Behave like FETCH_OBJ_W */
15389: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15390: zval *property;
15391: zval **container;
15392:
15393: SAVE_OPLINE();
15394: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15395: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15396:
15397: if (1) {
15398: MAKE_REAL_ZVAL_PTR(property);
15399: }
1.1.1.2 misho 15400: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15401: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
15402: }
1.1.1.2 misho 15403: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 15404: if (1) {
15405: zval_ptr_dtor(&property);
15406: } else {
15407: zval_dtor(free_op2.var);
15408: }
1.1.1.2 misho 15409: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15410: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15411: }
15412: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 15413: CHECK_EXCEPTION();
1.1 misho 15414: ZEND_VM_NEXT_OPCODE();
15415: } else {
1.1.1.2 misho 15416: return zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 15417: }
15418: }
15419:
15420: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15421: {
1.1.1.2 misho 15422: USE_OPLINE
1.1 misho 15423: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 15424: zval **container;
15425: zval *property;
15426:
15427: SAVE_OPLINE();
15428: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15429: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15430:
15431: if (IS_VAR == IS_CV) {
15432: if (container != &EG(uninitialized_zval_ptr)) {
15433: SEPARATE_ZVAL_IF_NOT_REF(container);
15434: }
15435: }
15436: if (1) {
15437: MAKE_REAL_ZVAL_PTR(property);
15438: }
1.1.1.2 misho 15439: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 15440: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
15441: }
1.1.1.2 misho 15442: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 15443: if (1) {
15444: zval_ptr_dtor(&property);
15445: } else {
15446: zval_dtor(free_op2.var);
15447: }
1.1.1.2 misho 15448: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
15449: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 15450: }
15451: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15452:
1.1.1.2 misho 15453: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
15454: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
15455: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 15456: }
1.1.1.2 misho 15457: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 15458: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 15459: CHECK_EXCEPTION();
1.1 misho 15460: ZEND_VM_NEXT_OPCODE();
15461: }
15462:
15463: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15464: {
1.1.1.2 misho 15465: USE_OPLINE
1.1 misho 15466: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15467: zval **object_ptr;
15468: zval *property_name;
15469:
15470: SAVE_OPLINE();
15471: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15472: property_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15473:
15474: if (1) {
15475: MAKE_REAL_ZVAL_PTR(property_name);
15476: }
1.1.1.2 misho 15477: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 15478: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15479: }
1.1.1.2 misho 15480: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 15481: if (1) {
15482: zval_ptr_dtor(&property_name);
15483: } else {
15484: zval_dtor(free_op2.var);
15485: }
15486: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15487: /* assign_obj has two opcodes! */
1.1.1.2 misho 15488: CHECK_EXCEPTION();
1.1 misho 15489: ZEND_VM_INC_OPCODE();
15490: ZEND_VM_NEXT_OPCODE();
15491: }
15492:
15493: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15494: {
1.1.1.2 misho 15495: USE_OPLINE
1.1 misho 15496: zend_free_op free_op1;
1.1.1.2 misho 15497: zval **object_ptr;
1.1 misho 15498:
1.1.1.2 misho 15499: SAVE_OPLINE();
15500: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15501:
15502: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 15503: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
15504: }
15505: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
15506: zend_free_op free_op2;
1.1.1.2 misho 15507: zval *property_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15508:
15509: if (1) {
15510: MAKE_REAL_ZVAL_PTR(property_name);
15511: }
1.1.1.2 misho 15512: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 15513: if (1) {
15514: zval_ptr_dtor(&property_name);
15515: } else {
15516: zval_dtor(free_op2.var);
15517: }
15518: } else {
15519: zend_free_op free_op2, free_op_data1, free_op_data2;
15520: zval *value;
1.1.1.2 misho 15521: zval *dim = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15522: zval **variable_ptr_ptr;
15523:
1.1.1.2 misho 15524: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 15525: zval_dtor(free_op2.var);
15526:
1.1.1.2 misho 15527: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
15528: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
15529: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
15530: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
15531: if (RETURN_VALUE_USED(opline)) {
15532: zval *retval;
15533:
15534: ALLOC_ZVAL(retval);
15535: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
15536: INIT_PZVAL(retval);
15537: AI_SET_PTR(&EX_T(opline->result.var), retval);
15538: }
15539: } else if (RETURN_VALUE_USED(opline)) {
15540: PZVAL_LOCK(&EG(uninitialized_zval));
15541: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
15542: }
15543: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
15544: if (IS_TMP_FREE(free_op_data1)) {
15545: zval_dtor(value);
15546: }
15547: if (RETURN_VALUE_USED(opline)) {
15548: PZVAL_LOCK(&EG(uninitialized_zval));
15549: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
15550: }
15551: } else {
15552: if ((opline+1)->op1_type == IS_TMP_VAR) {
15553: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15554: } else if ((opline+1)->op1_type == IS_CONST) {
15555: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15556: } else {
15557: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15558: }
15559: if (RETURN_VALUE_USED(opline)) {
1.1 misho 15560: PZVAL_LOCK(value);
1.1.1.2 misho 15561: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 15562: }
15563: }
15564: FREE_OP_VAR_PTR(free_op_data2);
15565: FREE_OP_IF_VAR(free_op_data1);
15566: }
15567: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15568: /* assign_dim has two opcodes! */
1.1.1.2 misho 15569: CHECK_EXCEPTION();
1.1 misho 15570: ZEND_VM_INC_OPCODE();
15571: ZEND_VM_NEXT_OPCODE();
15572: }
15573:
15574: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15575: {
1.1.1.2 misho 15576: USE_OPLINE
1.1 misho 15577: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15578: zval *value;
15579: zval **variable_ptr_ptr;
1.1 misho 15580:
1.1.1.2 misho 15581: SAVE_OPLINE();
15582: value = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15583: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15584:
15585: if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
15586: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_TMP_VAR TSRMLS_CC)) {
15587: if (RETURN_VALUE_USED(opline)) {
15588: zval *retval;
15589:
15590: ALLOC_ZVAL(retval);
15591: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
15592: INIT_PZVAL(retval);
15593: AI_SET_PTR(&EX_T(opline->result.var), retval);
15594: }
15595: } else if (RETURN_VALUE_USED(opline)) {
15596: PZVAL_LOCK(&EG(uninitialized_zval));
15597: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
15598: }
15599: } else if (IS_VAR == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
15600: if (1) {
15601: zval_dtor(value);
15602: }
15603: if (RETURN_VALUE_USED(opline)) {
15604: PZVAL_LOCK(&EG(uninitialized_zval));
15605: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
15606: }
15607: } else {
15608: if (IS_TMP_VAR == IS_TMP_VAR) {
15609: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15610: } else if (IS_TMP_VAR == IS_CONST) {
15611: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15612: } else {
15613: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
15614: }
15615: if (RETURN_VALUE_USED(opline)) {
1.1 misho 15616: PZVAL_LOCK(value);
1.1.1.2 misho 15617: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 15618: }
15619: }
15620:
15621: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15622:
15623: /* zend_assign_to_variable() always takes care of op2, never free it! */
15624:
1.1.1.2 misho 15625: CHECK_EXCEPTION();
1.1 misho 15626: ZEND_VM_NEXT_OPCODE();
15627: }
15628:
15629: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15630: {
1.1.1.2 misho 15631: USE_OPLINE
1.1 misho 15632: zval *function_name;
15633: char *function_name_strval;
15634: int function_name_strlen;
15635: zend_free_op free_op1, free_op2;
15636:
1.1.1.2 misho 15637: SAVE_OPLINE();
1.1 misho 15638: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
15639:
1.1.1.2 misho 15640: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15641:
1.1.1.2 misho 15642: if (IS_TMP_VAR != IS_CONST &&
15643: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 15644: zend_error_noreturn(E_ERROR, "Method name must be a string");
15645: }
15646:
15647: function_name_strval = Z_STRVAL_P(function_name);
15648: function_name_strlen = Z_STRLEN_P(function_name);
15649:
1.1.1.2 misho 15650: EX(object) = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15651:
1.1.1.2 misho 15652: if (EXPECTED(EX(object) != NULL) &&
15653: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
15654: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 15655:
1.1.1.2 misho 15656: if (IS_TMP_VAR != IS_CONST ||
15657: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
15658: zval *object = EX(object);
15659:
15660: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
15661: zend_error_noreturn(E_ERROR, "Object does not support method calls");
15662: }
15663:
15664: /* First, locate the function. */
15665: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
15666: if (UNEXPECTED(EX(fbc) == NULL)) {
15667: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
15668: }
15669: if (IS_TMP_VAR == IS_CONST &&
15670: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
15671: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
15672: EXPECTED(EX(object) == object)) {
15673: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
15674: }
1.1 misho 15675: }
15676: } else {
15677: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
15678: }
15679:
15680: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
15681: EX(object) = NULL;
15682: } else {
15683: if (!PZVAL_IS_REF(EX(object))) {
15684: Z_ADDREF_P(EX(object)); /* For $this pointer */
15685: } else {
15686: zval *this_ptr;
15687: ALLOC_ZVAL(this_ptr);
15688: INIT_PZVAL_COPY(this_ptr, EX(object));
15689: zval_copy_ctor(this_ptr);
15690: EX(object) = this_ptr;
15691: }
15692: }
15693:
15694: zval_dtor(free_op2.var);
15695: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15696:
1.1.1.2 misho 15697: CHECK_EXCEPTION();
1.1 misho 15698: ZEND_VM_NEXT_OPCODE();
15699: }
15700:
15701: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15702: {
1.1.1.2 misho 15703: USE_OPLINE
1.1 misho 15704: zval *function_name;
15705: zend_class_entry *ce;
15706:
1.1.1.2 misho 15707: SAVE_OPLINE();
1.1 misho 15708: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
15709:
15710: if (IS_VAR == IS_CONST) {
15711: /* no function found. try a static method in class */
1.1.1.2 misho 15712: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
15713: ce = CACHED_PTR(opline->op1.literal->cache_slot);
15714: } else {
15715: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 15716: if (UNEXPECTED(EG(exception) != NULL)) {
15717: HANDLE_EXCEPTION();
15718: }
1.1.1.2 misho 15719: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 15720: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 15721: }
15722: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 15723: }
15724: EX(called_scope) = ce;
15725: } else {
1.1.1.2 misho 15726: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 15727:
1.1.1.2 misho 15728: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 15729: EX(called_scope) = EG(called_scope);
15730: } else {
15731: EX(called_scope) = ce;
15732: }
15733: }
1.1.1.2 misho 15734:
15735: if (IS_VAR == IS_CONST &&
15736: IS_TMP_VAR == IS_CONST &&
15737: CACHED_PTR(opline->op2.literal->cache_slot)) {
15738: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
15739: } else if (IS_VAR != IS_CONST &&
15740: IS_TMP_VAR == IS_CONST &&
15741: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
15742: /* do nothing */
15743: } else if (IS_TMP_VAR != IS_UNUSED) {
1.1 misho 15744: char *function_name_strval = NULL;
15745: int function_name_strlen = 0;
15746: zend_free_op free_op2;
15747:
15748: if (IS_TMP_VAR == IS_CONST) {
1.1.1.2 misho 15749: function_name_strval = Z_STRVAL_P(opline->op2.zv);
15750: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 15751: } else {
1.1.1.2 misho 15752: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15753:
1.1.1.2 misho 15754: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 15755: zend_error_noreturn(E_ERROR, "Function name must be a string");
15756: } else {
15757: function_name_strval = Z_STRVAL_P(function_name);
15758: function_name_strlen = Z_STRLEN_P(function_name);
15759: }
15760: }
15761:
15762: if (function_name_strval) {
15763: if (ce->get_static_method) {
15764: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
15765: } else {
1.1.1.2 misho 15766: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 15767: }
1.1.1.2 misho 15768: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 15769: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
15770: }
1.1.1.2 misho 15771: if (IS_TMP_VAR == IS_CONST &&
15772: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
15773: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
15774: if (IS_VAR == IS_CONST) {
15775: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
15776: } else {
15777: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
15778: }
15779: }
1.1 misho 15780: }
15781: if (IS_TMP_VAR != IS_CONST) {
15782: zval_dtor(free_op2.var);
15783: }
15784: } else {
1.1.1.2 misho 15785: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 15786: zend_error_noreturn(E_ERROR, "Cannot call constructor");
15787: }
15788: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 15789: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 15790: }
15791: EX(fbc) = ce->constructor;
15792: }
15793:
15794: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
15795: EX(object) = NULL;
15796: } else {
15797: if (EG(This) &&
15798: Z_OBJ_HT_P(EG(This))->get_class_entry &&
15799: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
15800: /* We are calling method of the other (incompatible) class,
15801: but passing $this. This is done for compatibility with php-4. */
15802: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 15803: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 15804: } else {
15805: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 15806: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 15807: }
15808: }
15809: if ((EX(object) = EG(This))) {
15810: Z_ADDREF_P(EX(object));
15811: EX(called_scope) = Z_OBJCE_P(EX(object));
15812: }
15813: }
15814:
1.1.1.2 misho 15815: CHECK_EXCEPTION();
1.1 misho 15816: ZEND_VM_NEXT_OPCODE();
15817: }
15818:
15819: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15820: {
1.1.1.2 misho 15821: USE_OPLINE
1.1 misho 15822: zend_free_op free_op1, free_op2;
15823:
1.1.1.2 misho 15824: SAVE_OPLINE();
1.1 misho 15825: if (IS_VAR==IS_VAR) {
1.1.1.2 misho 15826: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 15827: }
1.1.1.2 misho 15828: is_equal_function(&EX_T(opline->result.var).tmp_var,
15829: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
15830: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 15831:
15832: zval_dtor(free_op2.var);
1.1.1.2 misho 15833: CHECK_EXCEPTION();
1.1 misho 15834: ZEND_VM_NEXT_OPCODE();
15835: }
15836:
15837: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15838: {
1.1.1.2 misho 15839: USE_OPLINE
15840: zend_free_op free_op1;
1.1 misho 15841: zval *expr_ptr;
15842:
1.1.1.2 misho 15843: SAVE_OPLINE();
15844: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
15845: zval **expr_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15846:
1.1.1.2 misho 15847: if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
15848: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
15849: }
15850: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 15851: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 15852: Z_ADDREF_P(expr_ptr);
1.1 misho 15853: } else {
1.1.1.2 misho 15854: expr_ptr=_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
15855: if (0) { /* temporary variable */
15856: zval *new_expr;
1.1 misho 15857:
1.1.1.2 misho 15858: ALLOC_ZVAL(new_expr);
15859: INIT_PZVAL_COPY(new_expr, expr_ptr);
15860: expr_ptr = new_expr;
15861: } else if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 15862: zval *new_expr;
15863:
15864: ALLOC_ZVAL(new_expr);
15865: INIT_PZVAL_COPY(new_expr, expr_ptr);
15866: expr_ptr = new_expr;
15867: zendi_zval_copy_ctor(*expr_ptr);
15868: } else {
15869: Z_ADDREF_P(expr_ptr);
15870: }
15871: }
1.1.1.2 misho 15872:
15873: if (IS_TMP_VAR != IS_UNUSED) {
15874: zend_free_op free_op2;
15875: zval *offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
15876: ulong hval;
15877:
1.1 misho 15878: switch (Z_TYPE_P(offset)) {
15879: case IS_DOUBLE:
1.1.1.2 misho 15880: hval = zend_dval_to_lval(Z_DVAL_P(offset));
15881: goto num_index;
1.1 misho 15882: case IS_LONG:
15883: case IS_BOOL:
1.1.1.2 misho 15884: hval = Z_LVAL_P(offset);
15885: num_index:
15886: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 15887: break;
15888: case IS_STRING:
1.1.1.2 misho 15889: if (IS_TMP_VAR == IS_CONST) {
15890: hval = Z_HASH_P(offset);
15891: } else {
15892: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
15893: if (IS_INTERNED(Z_STRVAL_P(offset))) {
15894: hval = INTERNED_HASH(Z_STRVAL_P(offset));
15895: } else {
15896: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
15897: }
15898: }
15899: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 15900: break;
15901: case IS_NULL:
1.1.1.2 misho 15902: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 15903: break;
15904: default:
15905: zend_error(E_WARNING, "Illegal offset type");
15906: zval_ptr_dtor(&expr_ptr);
15907: /* do nothing */
15908: break;
15909: }
15910: zval_dtor(free_op2.var);
15911: } else {
1.1.1.2 misho 15912: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 15913: }
1.1.1.2 misho 15914: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
1.1 misho 15915: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15916: } else {
15917: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
15918: }
1.1.1.2 misho 15919: CHECK_EXCEPTION();
1.1 misho 15920: ZEND_VM_NEXT_OPCODE();
15921: }
15922:
15923: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15924: {
1.1.1.2 misho 15925: USE_OPLINE
1.1 misho 15926:
1.1.1.2 misho 15927: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 15928: if (IS_VAR == IS_UNUSED) {
15929: ZEND_VM_NEXT_OPCODE();
15930: #if 0 || IS_VAR != IS_UNUSED
15931: } else {
15932: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
15933: #endif
15934: }
15935: }
15936:
15937: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
15938: {
1.1.1.2 misho 15939: USE_OPLINE
1.1 misho 15940: zend_free_op free_op1, free_op2;
1.1.1.2 misho 15941: zval **container;
1.1 misho 15942: zval *offset;
1.1.1.2 misho 15943: ulong hval;
1.1 misho 15944:
1.1.1.2 misho 15945: SAVE_OPLINE();
15946: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 15947: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
15948: SEPARATE_ZVAL_IF_NOT_REF(container);
15949: }
1.1.1.2 misho 15950: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 15951:
15952: if (IS_VAR != IS_VAR || container) {
15953: switch (Z_TYPE_PP(container)) {
15954: case IS_ARRAY: {
15955: HashTable *ht = Z_ARRVAL_PP(container);
15956:
15957: switch (Z_TYPE_P(offset)) {
15958: case IS_DOUBLE:
1.1.1.2 misho 15959: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 15960: zend_hash_index_del(ht, hval);
15961: break;
1.1 misho 15962: case IS_RESOURCE:
15963: case IS_BOOL:
15964: case IS_LONG:
1.1.1.2 misho 15965: hval = Z_LVAL_P(offset);
15966: zend_hash_index_del(ht, hval);
1.1 misho 15967: break;
15968: case IS_STRING:
15969: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
15970: Z_ADDREF_P(offset);
15971: }
1.1.1.2 misho 15972: if (IS_TMP_VAR == IS_CONST) {
15973: hval = Z_HASH_P(offset);
15974: } else {
15975: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
15976: if (IS_INTERNED(Z_STRVAL_P(offset))) {
15977: hval = INTERNED_HASH(Z_STRVAL_P(offset));
15978: } else {
15979: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 15980: }
15981: }
1.1.1.2 misho 15982: if (ht == &EG(symbol_table)) {
15983: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
15984: } else {
15985: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
15986: }
15987: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
15988: zval_ptr_dtor(&offset);
15989: }
15990: break;
15991: num_index_dim:
15992: zend_hash_index_del(ht, hval);
1.1 misho 15993: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
15994: zval_ptr_dtor(&offset);
15995: }
15996: break;
15997: case IS_NULL:
15998: zend_hash_del(ht, "", sizeof(""));
15999: break;
16000: default:
16001: zend_error(E_WARNING, "Illegal offset type in unset");
16002: break;
16003: }
16004: zval_dtor(free_op2.var);
16005: break;
16006: }
16007: case IS_OBJECT:
1.1.1.2 misho 16008: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 16009: zend_error_noreturn(E_ERROR, "Cannot use object as array");
16010: }
16011: if (1) {
16012: MAKE_REAL_ZVAL_PTR(offset);
16013: }
16014: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
16015: if (1) {
16016: zval_ptr_dtor(&offset);
16017: } else {
16018: zval_dtor(free_op2.var);
16019: }
16020: break;
16021: case IS_STRING:
16022: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
16023: ZEND_VM_CONTINUE(); /* bailed out before */
16024: default:
16025: zval_dtor(free_op2.var);
16026: break;
16027: }
16028: } else {
16029: zval_dtor(free_op2.var);
16030: }
16031: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16032:
1.1.1.2 misho 16033: CHECK_EXCEPTION();
1.1 misho 16034: ZEND_VM_NEXT_OPCODE();
16035: }
16036:
16037: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16038: {
1.1.1.2 misho 16039: USE_OPLINE
1.1 misho 16040: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16041: zval **container;
16042: zval *offset;
16043:
16044: SAVE_OPLINE();
16045: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
16046: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 16047:
16048: if (IS_VAR != IS_VAR || container) {
16049: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
16050: SEPARATE_ZVAL_IF_NOT_REF(container);
16051: }
16052: if (Z_TYPE_PP(container) == IS_OBJECT) {
16053: if (1) {
16054: MAKE_REAL_ZVAL_PTR(offset);
16055: }
16056: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 16057: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16058: } else {
16059: zend_error(E_NOTICE, "Trying to unset property of non-object");
16060: }
16061: if (1) {
16062: zval_ptr_dtor(&offset);
16063: } else {
16064: zval_dtor(free_op2.var);
16065: }
16066: } else {
16067: zval_dtor(free_op2.var);
16068: }
16069: } else {
16070: zval_dtor(free_op2.var);
16071: }
16072: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16073:
1.1.1.2 misho 16074: CHECK_EXCEPTION();
1.1 misho 16075: ZEND_VM_NEXT_OPCODE();
16076: }
16077:
16078: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
16079: {
1.1.1.2 misho 16080: USE_OPLINE
16081: zend_free_op free_op1, free_op2;
16082: zval **container;
1.1 misho 16083: zval **value = NULL;
16084: int result = 0;
1.1.1.2 misho 16085: ulong hval;
16086: zval *offset;
1.1 misho 16087:
1.1.1.2 misho 16088: SAVE_OPLINE();
16089: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 16090:
1.1.1.2 misho 16091: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 16092:
1.1.1.2 misho 16093: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
16094: HashTable *ht;
16095: int isset = 0;
1.1 misho 16096:
1.1.1.2 misho 16097: ht = Z_ARRVAL_PP(container);
16098:
16099: switch (Z_TYPE_P(offset)) {
16100: case IS_DOUBLE:
16101: hval = zend_dval_to_lval(Z_DVAL_P(offset));
16102: goto num_index_prop;
16103: case IS_RESOURCE:
16104: case IS_BOOL:
16105: case IS_LONG:
16106: hval = Z_LVAL_P(offset);
16107: num_index_prop:
16108: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
16109: isset = 1;
16110: }
16111: break;
16112: case IS_STRING:
16113: if (IS_TMP_VAR == IS_CONST) {
16114: hval = Z_HASH_P(offset);
16115: } else {
16116: if (!prop_dim) {
16117: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 16118: }
1.1.1.2 misho 16119: if (IS_INTERNED(Z_STRVAL_P(offset))) {
16120: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 16121: } else {
1.1.1.2 misho 16122: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 16123: }
1.1.1.2 misho 16124: }
16125: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
16126: isset = 1;
16127: }
16128: break;
16129: case IS_NULL:
16130: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
16131: isset = 1;
16132: }
16133: break;
16134: default:
16135: zend_error(E_WARNING, "Illegal offset type in isset or empty");
16136: break;
16137: }
16138:
16139: if (opline->extended_value & ZEND_ISSET) {
16140: if (isset && Z_TYPE_PP(value) == IS_NULL) {
16141: result = 0;
16142: } else {
16143: result = isset;
1.1 misho 16144: }
1.1.1.2 misho 16145: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
16146: if (!isset || !i_zend_is_true(*value)) {
16147: result = 0;
16148: } else {
16149: result = 1;
1.1 misho 16150: }
1.1.1.2 misho 16151: }
16152: zval_dtor(free_op2.var);
16153: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
16154: if (1) {
16155: MAKE_REAL_ZVAL_PTR(offset);
16156: }
16157: if (prop_dim) {
16158: if (Z_OBJ_HT_P(*container)->has_property) {
16159: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16160: } else {
1.1.1.2 misho 16161: zend_error(E_NOTICE, "Trying to check property of non-object");
16162: result = 0;
1.1 misho 16163: }
1.1.1.2 misho 16164: } else {
16165: if (Z_OBJ_HT_P(*container)->has_dimension) {
16166: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 16167: } else {
1.1.1.2 misho 16168: zend_error(E_NOTICE, "Trying to check element of non-array");
16169: result = 0;
1.1 misho 16170: }
1.1.1.2 misho 16171: }
16172: if (1) {
16173: zval_ptr_dtor(&offset);
16174: } else {
16175: zval_dtor(free_op2.var);
16176: }
16177: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
16178: zval tmp;
1.1 misho 16179:
1.1.1.2 misho 16180: if (Z_TYPE_P(offset) != IS_LONG) {
16181: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
16182: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
16183: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
16184: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 16185: zval_copy_ctor(&tmp);
16186: convert_to_long(&tmp);
16187: offset = &tmp;
1.1.1.2 misho 16188: } else {
16189: /* can not be converted to proper offset, return "not set" */
16190: result = 0;
1.1 misho 16191: }
1.1.1.2 misho 16192: }
16193: if (Z_TYPE_P(offset) == IS_LONG) {
16194: if (opline->extended_value & ZEND_ISSET) {
16195: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
16196: result = 1;
16197: }
16198: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
16199: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
16200: result = 1;
1.1 misho 16201: }
16202: }
16203: }
1.1.1.2 misho 16204: zval_dtor(free_op2.var);
16205: } else {
16206: zval_dtor(free_op2.var);
1.1 misho 16207: }
16208:
1.1.1.2 misho 16209: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
16210: if (opline->extended_value & ZEND_ISSET) {
16211: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
16212: } else {
16213: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 16214: }
16215:
16216: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16217:
1.1.1.2 misho 16218: CHECK_EXCEPTION();
1.1 misho 16219: ZEND_VM_NEXT_OPCODE();
16220: }
16221:
16222: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16223: {
16224: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16225: }
16226:
16227: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16228: {
16229: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16230: }
16231:
16232: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16233: {
1.1.1.2 misho 16234: USE_OPLINE
1.1 misho 16235: zend_free_op free_op1, free_op2;
16236:
1.1.1.2 misho 16237: SAVE_OPLINE();
16238: fast_add_function(&EX_T(opline->result.var).tmp_var,
16239: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16240: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16241: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16242: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16243: CHECK_EXCEPTION();
1.1 misho 16244: ZEND_VM_NEXT_OPCODE();
16245: }
16246:
16247: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16248: {
1.1.1.2 misho 16249: USE_OPLINE
1.1 misho 16250: zend_free_op free_op1, free_op2;
16251:
1.1.1.2 misho 16252: SAVE_OPLINE();
16253: fast_sub_function(&EX_T(opline->result.var).tmp_var,
16254: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16255: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16256: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16257: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16258: CHECK_EXCEPTION();
1.1 misho 16259: ZEND_VM_NEXT_OPCODE();
16260: }
16261:
16262: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16263: {
1.1.1.2 misho 16264: USE_OPLINE
1.1 misho 16265: zend_free_op free_op1, free_op2;
16266:
1.1.1.2 misho 16267: SAVE_OPLINE();
16268: fast_mul_function(&EX_T(opline->result.var).tmp_var,
16269: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16270: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16271: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16272: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16273: CHECK_EXCEPTION();
1.1 misho 16274: ZEND_VM_NEXT_OPCODE();
16275: }
16276:
16277: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16278: {
1.1.1.2 misho 16279: USE_OPLINE
1.1 misho 16280: zend_free_op free_op1, free_op2;
16281:
1.1.1.2 misho 16282: SAVE_OPLINE();
16283: fast_div_function(&EX_T(opline->result.var).tmp_var,
16284: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16285: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16286: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16287: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16288: CHECK_EXCEPTION();
1.1 misho 16289: ZEND_VM_NEXT_OPCODE();
16290: }
16291:
16292: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16293: {
1.1.1.2 misho 16294: USE_OPLINE
1.1 misho 16295: zend_free_op free_op1, free_op2;
16296:
1.1.1.2 misho 16297: SAVE_OPLINE();
16298: fast_mod_function(&EX_T(opline->result.var).tmp_var,
16299: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16300: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16301: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16302: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16303: CHECK_EXCEPTION();
1.1 misho 16304: ZEND_VM_NEXT_OPCODE();
16305: }
16306:
16307: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16308: {
1.1.1.2 misho 16309: USE_OPLINE
1.1 misho 16310: zend_free_op free_op1, free_op2;
16311:
1.1.1.2 misho 16312: SAVE_OPLINE();
16313: shift_left_function(&EX_T(opline->result.var).tmp_var,
16314: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16315: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16316: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16317: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16318: CHECK_EXCEPTION();
1.1 misho 16319: ZEND_VM_NEXT_OPCODE();
16320: }
16321:
16322: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16323: {
1.1.1.2 misho 16324: USE_OPLINE
1.1 misho 16325: zend_free_op free_op1, free_op2;
16326:
1.1.1.2 misho 16327: SAVE_OPLINE();
16328: shift_right_function(&EX_T(opline->result.var).tmp_var,
16329: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16330: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16331: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16332: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16333: CHECK_EXCEPTION();
1.1 misho 16334: ZEND_VM_NEXT_OPCODE();
16335: }
16336:
16337: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16338: {
1.1.1.2 misho 16339: USE_OPLINE
1.1 misho 16340: zend_free_op free_op1, free_op2;
16341:
1.1.1.2 misho 16342: SAVE_OPLINE();
16343: concat_function(&EX_T(opline->result.var).tmp_var,
16344: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16345: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16346: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16347: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16348: CHECK_EXCEPTION();
1.1 misho 16349: ZEND_VM_NEXT_OPCODE();
16350: }
16351:
16352: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16353: {
1.1.1.2 misho 16354: USE_OPLINE
1.1 misho 16355: zend_free_op free_op1, free_op2;
16356:
1.1.1.2 misho 16357: SAVE_OPLINE();
16358: is_identical_function(&EX_T(opline->result.var).tmp_var,
16359: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16360: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16361: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16362: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16363: CHECK_EXCEPTION();
1.1 misho 16364: ZEND_VM_NEXT_OPCODE();
16365: }
16366:
16367: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16368: {
1.1.1.2 misho 16369: USE_OPLINE
1.1 misho 16370: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16371: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 16372:
1.1.1.2 misho 16373: SAVE_OPLINE();
1.1 misho 16374: is_identical_function(result,
1.1.1.2 misho 16375: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16376: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16377: Z_LVAL_P(result) = !Z_LVAL_P(result);
16378: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16379: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16380: CHECK_EXCEPTION();
1.1 misho 16381: ZEND_VM_NEXT_OPCODE();
16382: }
16383:
16384: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16385: {
1.1.1.2 misho 16386: USE_OPLINE
1.1 misho 16387: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16388: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 16389:
1.1.1.2 misho 16390: SAVE_OPLINE();
16391: ZVAL_BOOL(result, fast_equal_function(result,
16392: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16393: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 16394: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16395: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16396: CHECK_EXCEPTION();
1.1 misho 16397: ZEND_VM_NEXT_OPCODE();
16398: }
16399:
16400: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16401: {
1.1.1.2 misho 16402: USE_OPLINE
1.1 misho 16403: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16404: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 16405:
1.1.1.2 misho 16406: SAVE_OPLINE();
16407: ZVAL_BOOL(result, fast_not_equal_function(result,
16408: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16409: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 16410: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16411: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16412: CHECK_EXCEPTION();
1.1 misho 16413: ZEND_VM_NEXT_OPCODE();
16414: }
16415:
16416: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16417: {
1.1.1.2 misho 16418: USE_OPLINE
1.1 misho 16419: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16420: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 16421:
1.1.1.2 misho 16422: SAVE_OPLINE();
16423: ZVAL_BOOL(result, fast_is_smaller_function(result,
16424: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16425: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 16426: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16427: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16428: CHECK_EXCEPTION();
1.1 misho 16429: ZEND_VM_NEXT_OPCODE();
16430: }
16431:
16432: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16433: {
1.1.1.2 misho 16434: USE_OPLINE
1.1 misho 16435: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16436: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 16437:
1.1.1.2 misho 16438: SAVE_OPLINE();
16439: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
16440: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16441: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 16442: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16443: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16444: CHECK_EXCEPTION();
1.1 misho 16445: ZEND_VM_NEXT_OPCODE();
16446: }
16447:
16448: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16449: {
1.1.1.2 misho 16450: USE_OPLINE
1.1 misho 16451: zend_free_op free_op1, free_op2;
16452:
1.1.1.2 misho 16453: SAVE_OPLINE();
16454: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
16455: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16456: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16457: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16458: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16459: CHECK_EXCEPTION();
1.1 misho 16460: ZEND_VM_NEXT_OPCODE();
16461: }
16462:
16463: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16464: {
1.1.1.2 misho 16465: USE_OPLINE
1.1 misho 16466: zend_free_op free_op1, free_op2;
16467:
1.1.1.2 misho 16468: SAVE_OPLINE();
16469: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
16470: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16471: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16472: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16473: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16474: CHECK_EXCEPTION();
1.1 misho 16475: ZEND_VM_NEXT_OPCODE();
16476: }
16477:
16478: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16479: {
1.1.1.2 misho 16480: USE_OPLINE
1.1 misho 16481: zend_free_op free_op1, free_op2;
16482:
1.1.1.2 misho 16483: SAVE_OPLINE();
16484: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
16485: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16486: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16487: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16488: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16489: CHECK_EXCEPTION();
1.1 misho 16490: ZEND_VM_NEXT_OPCODE();
16491: }
16492:
16493: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16494: {
1.1.1.2 misho 16495: USE_OPLINE
1.1 misho 16496: zend_free_op free_op1, free_op2;
16497:
1.1.1.2 misho 16498: SAVE_OPLINE();
16499: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
16500: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
16501: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 16502: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16503: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16504: CHECK_EXCEPTION();
1.1 misho 16505: ZEND_VM_NEXT_OPCODE();
16506: }
16507:
16508: 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)
16509: {
1.1.1.2 misho 16510: USE_OPLINE
1.1 misho 16511: zend_free_op free_op1, free_op2, free_op_data1;
1.1.1.2 misho 16512: zval **object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 16513: zval *object;
1.1.1.2 misho 16514: zval *property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
16515: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 16516: int have_get_ptr = 0;
16517:
1.1.1.2 misho 16518: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 16519: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
16520: }
16521:
16522: make_real_object(object_ptr TSRMLS_CC);
16523: object = *object_ptr;
16524:
1.1.1.2 misho 16525: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 16526: zend_error(E_WARNING, "Attempt to assign property of non-object");
16527: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16528: FREE_OP(free_op_data1);
16529:
1.1.1.2 misho 16530: if (RETURN_VALUE_USED(opline)) {
16531: PZVAL_LOCK(&EG(uninitialized_zval));
16532: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
16533: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 16534: }
16535: } else {
16536: /* here we are sure we are dealing with an object */
16537: if (0) {
16538: MAKE_REAL_ZVAL_PTR(property);
16539: }
16540:
16541: /* here property is a string */
16542: if (opline->extended_value == ZEND_ASSIGN_OBJ
16543: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 16544: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16545: if (zptr != NULL) { /* NULL means no success in getting PTR */
16546: SEPARATE_ZVAL_IF_NOT_REF(zptr);
16547:
16548: have_get_ptr = 1;
16549: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 16550: if (RETURN_VALUE_USED(opline)) {
1.1 misho 16551: PZVAL_LOCK(*zptr);
1.1.1.2 misho 16552: EX_T(opline->result.var).var.ptr = *zptr;
16553: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 16554: }
16555: }
16556: }
16557:
16558: if (!have_get_ptr) {
16559: zval *z = NULL;
16560:
16561: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
16562: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 16563: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16564: }
16565: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
16566: if (Z_OBJ_HT_P(object)->read_dimension) {
16567: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
16568: }
16569: }
16570: if (z) {
16571: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
16572: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
16573:
16574: if (Z_REFCOUNT_P(z) == 0) {
16575: GC_REMOVE_ZVAL_FROM_BUFFER(z);
16576: zval_dtor(z);
16577: FREE_ZVAL(z);
16578: }
16579: z = value;
16580: }
16581: Z_ADDREF_P(z);
16582: SEPARATE_ZVAL_IF_NOT_REF(&z);
16583: binary_op(z, z, value TSRMLS_CC);
16584: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 16585: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16586: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
16587: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
16588: }
1.1.1.2 misho 16589: if (RETURN_VALUE_USED(opline)) {
1.1 misho 16590: PZVAL_LOCK(z);
1.1.1.2 misho 16591: EX_T(opline->result.var).var.ptr = z;
16592: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 16593: }
16594: zval_ptr_dtor(&z);
16595: } else {
16596: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 16597: if (RETURN_VALUE_USED(opline)) {
16598: PZVAL_LOCK(&EG(uninitialized_zval));
16599: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
16600: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 16601: }
16602: }
16603: }
16604:
16605: if (0) {
16606: zval_ptr_dtor(&property);
16607: } else {
16608: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16609: }
16610: FREE_OP(free_op_data1);
16611: }
16612:
16613: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16614: /* assign_obj has two opcodes! */
1.1.1.2 misho 16615: CHECK_EXCEPTION();
1.1 misho 16616: ZEND_VM_INC_OPCODE();
16617: ZEND_VM_NEXT_OPCODE();
16618: }
16619:
16620: 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)
16621: {
1.1.1.2 misho 16622: USE_OPLINE
1.1 misho 16623: zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
16624: zval **var_ptr;
16625: zval *value;
16626:
1.1.1.2 misho 16627: SAVE_OPLINE();
1.1 misho 16628: switch (opline->extended_value) {
16629: case ZEND_ASSIGN_OBJ:
16630: return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16631: break;
16632: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 16633: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 16634:
1.1.1.2 misho 16635: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 16636: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 16637: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 16638: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
16639: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
16640: }
16641: return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16642: } else {
1.1.1.2 misho 16643: zval *dim = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 16644:
1.1.1.2 misho 16645: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
16646: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
16647: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 16648: }
16649: }
16650: break;
16651: default:
1.1.1.2 misho 16652: value = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
16653: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 16654: /* do nothing */
16655: break;
16656: }
16657:
1.1.1.2 misho 16658: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 16659: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
16660: }
16661:
1.1.1.2 misho 16662: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
16663: if (RETURN_VALUE_USED(opline)) {
16664: PZVAL_LOCK(&EG(uninitialized_zval));
16665: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 16666: }
16667: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16668: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 16669: CHECK_EXCEPTION();
16670: if (opline->extended_value == ZEND_ASSIGN_DIM) {
16671: ZEND_VM_INC_OPCODE();
16672: }
1.1 misho 16673: ZEND_VM_NEXT_OPCODE();
16674: }
16675:
16676: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
16677:
1.1.1.2 misho 16678: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
16679: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 16680: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
16681: /* proxy object */
16682: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
16683: Z_ADDREF_P(objval);
16684: binary_op(objval, objval, value TSRMLS_CC);
16685: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
16686: zval_ptr_dtor(&objval);
16687: } else {
16688: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
16689: }
16690:
1.1.1.2 misho 16691: if (RETURN_VALUE_USED(opline)) {
1.1 misho 16692: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 16693: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 16694: }
16695: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16696:
16697: if (opline->extended_value == ZEND_ASSIGN_DIM) {
16698: FREE_OP(free_op_data1);
16699: FREE_OP_VAR_PTR(free_op_data2);
1.1.1.2 misho 16700: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16701: CHECK_EXCEPTION();
16702: ZEND_VM_INC_OPCODE();
16703: } else {
16704: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
16705: CHECK_EXCEPTION();
1.1 misho 16706: }
16707: ZEND_VM_NEXT_OPCODE();
16708: }
16709:
16710: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16711: {
16712: return zend_binary_assign_op_helper_SPEC_VAR_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16713: }
16714:
16715: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16716: {
16717: return zend_binary_assign_op_helper_SPEC_VAR_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16718: }
16719:
16720: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16721: {
16722: return zend_binary_assign_op_helper_SPEC_VAR_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16723: }
16724:
16725: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16726: {
16727: return zend_binary_assign_op_helper_SPEC_VAR_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16728: }
16729:
16730: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16731: {
16732: return zend_binary_assign_op_helper_SPEC_VAR_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16733: }
16734:
16735: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16736: {
16737: return zend_binary_assign_op_helper_SPEC_VAR_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16738: }
16739:
16740: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16741: {
16742: return zend_binary_assign_op_helper_SPEC_VAR_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16743: }
16744:
16745: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16746: {
16747: return zend_binary_assign_op_helper_SPEC_VAR_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16748: }
16749:
16750: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16751: {
16752: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16753: }
16754:
16755: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16756: {
16757: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16758: }
16759:
16760: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16761: {
16762: return zend_binary_assign_op_helper_SPEC_VAR_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16763: }
16764:
16765: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
16766: {
1.1.1.2 misho 16767: USE_OPLINE
1.1 misho 16768: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16769: zval **object_ptr;
1.1 misho 16770: zval *object;
1.1.1.2 misho 16771: zval *property;
16772: zval **retval;
1.1 misho 16773: int have_get_ptr = 0;
16774:
1.1.1.2 misho 16775: SAVE_OPLINE();
16776: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
16777: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
16778: retval = &EX_T(opline->result.var).var.ptr;
16779:
16780: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 16781: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
16782: }
16783:
16784: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
16785: object = *object_ptr;
16786:
1.1.1.2 misho 16787: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 16788: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
16789: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16790: if (RETURN_VALUE_USED(opline)) {
16791: PZVAL_LOCK(&EG(uninitialized_zval));
16792: *retval = &EG(uninitialized_zval);
1.1 misho 16793: }
16794: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 16795: CHECK_EXCEPTION();
1.1 misho 16796: ZEND_VM_NEXT_OPCODE();
16797: }
16798:
16799: /* here we are sure we are dealing with an object */
16800:
16801: if (0) {
16802: MAKE_REAL_ZVAL_PTR(property);
16803: }
16804:
16805: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 16806: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16807: if (zptr != NULL) { /* NULL means no success in getting PTR */
16808: SEPARATE_ZVAL_IF_NOT_REF(zptr);
16809:
16810: have_get_ptr = 1;
16811: incdec_op(*zptr);
1.1.1.2 misho 16812: if (RETURN_VALUE_USED(opline)) {
1.1 misho 16813: *retval = *zptr;
16814: PZVAL_LOCK(*retval);
16815: }
16816: }
16817: }
16818:
16819: if (!have_get_ptr) {
16820: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 16821: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16822:
1.1.1.2 misho 16823: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 16824: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
16825:
16826: if (Z_REFCOUNT_P(z) == 0) {
16827: GC_REMOVE_ZVAL_FROM_BUFFER(z);
16828: zval_dtor(z);
16829: FREE_ZVAL(z);
16830: }
16831: z = value;
16832: }
16833: Z_ADDREF_P(z);
16834: SEPARATE_ZVAL_IF_NOT_REF(&z);
16835: incdec_op(z);
16836: *retval = z;
1.1.1.2 misho 16837: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
16838: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 16839: zval_ptr_dtor(&z);
16840: } else {
16841: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 16842: if (RETURN_VALUE_USED(opline)) {
16843: PZVAL_LOCK(&EG(uninitialized_zval));
16844: *retval = &EG(uninitialized_zval);
1.1 misho 16845: }
16846: }
16847: }
16848:
16849: if (0) {
16850: zval_ptr_dtor(&property);
16851: } else {
16852: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16853: }
16854: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 16855: CHECK_EXCEPTION();
1.1 misho 16856: ZEND_VM_NEXT_OPCODE();
16857: }
16858:
16859: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16860: {
16861: return zend_pre_incdec_property_helper_SPEC_VAR_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16862: }
16863:
16864: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16865: {
16866: return zend_pre_incdec_property_helper_SPEC_VAR_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16867: }
16868:
16869: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
16870: {
1.1.1.2 misho 16871: USE_OPLINE
1.1 misho 16872: zend_free_op free_op1, free_op2;
1.1.1.2 misho 16873: zval **object_ptr;
1.1 misho 16874: zval *object;
1.1.1.2 misho 16875: zval *property;
16876: zval *retval;
1.1 misho 16877: int have_get_ptr = 0;
16878:
1.1.1.2 misho 16879: SAVE_OPLINE();
16880: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
16881: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
16882: retval = &EX_T(opline->result.var).tmp_var;
16883:
16884: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 16885: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
16886: }
16887:
16888: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
16889: object = *object_ptr;
16890:
1.1.1.2 misho 16891: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 16892: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
16893: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 16894: ZVAL_NULL(retval);
1.1 misho 16895: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 16896: CHECK_EXCEPTION();
1.1 misho 16897: ZEND_VM_NEXT_OPCODE();
16898: }
16899:
16900: /* here we are sure we are dealing with an object */
16901:
16902: if (0) {
16903: MAKE_REAL_ZVAL_PTR(property);
16904: }
16905:
16906: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 16907: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16908: if (zptr != NULL) { /* NULL means no success in getting PTR */
16909: have_get_ptr = 1;
16910: SEPARATE_ZVAL_IF_NOT_REF(zptr);
16911:
1.1.1.2 misho 16912: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 16913: zendi_zval_copy_ctor(*retval);
16914:
16915: incdec_op(*zptr);
16916:
16917: }
16918: }
16919:
16920: if (!have_get_ptr) {
16921: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 16922: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16923: zval *z_copy;
16924:
1.1.1.2 misho 16925: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 16926: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
16927:
16928: if (Z_REFCOUNT_P(z) == 0) {
16929: GC_REMOVE_ZVAL_FROM_BUFFER(z);
16930: zval_dtor(z);
16931: FREE_ZVAL(z);
16932: }
16933: z = value;
16934: }
1.1.1.2 misho 16935: ZVAL_COPY_VALUE(retval, z);
1.1 misho 16936: zendi_zval_copy_ctor(*retval);
16937: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 16938: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 16939: zendi_zval_copy_ctor(*z_copy);
16940: incdec_op(z_copy);
16941: Z_ADDREF_P(z);
1.1.1.2 misho 16942: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 16943: zval_ptr_dtor(&z_copy);
16944: zval_ptr_dtor(&z);
16945: } else {
16946: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 16947: ZVAL_NULL(retval);
1.1 misho 16948: }
16949: }
16950:
16951: if (0) {
16952: zval_ptr_dtor(&property);
16953: } else {
16954: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
16955: }
16956: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 16957: CHECK_EXCEPTION();
1.1 misho 16958: ZEND_VM_NEXT_OPCODE();
16959: }
16960:
16961: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16962: {
16963: return zend_post_incdec_property_helper_SPEC_VAR_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16964: }
16965:
16966: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
16967: {
16968: return zend_post_incdec_property_helper_SPEC_VAR_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
16969: }
16970:
1.1.1.2 misho 16971: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
16972: {
16973: USE_OPLINE
16974: zend_free_op free_op1;
16975: zval *varname;
16976: zval **retval;
16977: zval tmp_varname;
16978: HashTable *target_symbol_table;
16979: ulong hash_value;
16980:
16981: SAVE_OPLINE();
16982: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
16983:
16984: if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
16985: ZVAL_COPY_VALUE(&tmp_varname, varname);
16986: zval_copy_ctor(&tmp_varname);
16987: Z_SET_REFCOUNT(tmp_varname, 1);
16988: Z_UNSET_ISREF(tmp_varname);
16989: convert_to_string(&tmp_varname);
16990: varname = &tmp_varname;
16991: }
16992:
16993: if (IS_VAR != IS_UNUSED) {
16994: zend_class_entry *ce;
16995:
16996: if (IS_VAR == IS_CONST) {
16997: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
16998: ce = CACHED_PTR(opline->op2.literal->cache_slot);
16999: } else {
17000: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
17001: if (UNEXPECTED(ce == NULL)) {
17002: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
17003: zval_dtor(&tmp_varname);
17004: }
17005: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17006: CHECK_EXCEPTION();
17007: ZEND_VM_NEXT_OPCODE();
17008: }
17009: CACHE_PTR(opline->op2.literal->cache_slot, ce);
17010: }
17011: } else {
17012: ce = EX_T(opline->op2.var).class_entry;
17013: }
17014: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
17015: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17016: } else {
17017: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
17018: /*
17019: if (!target_symbol_table) {
17020: CHECK_EXCEPTION();
17021: ZEND_VM_NEXT_OPCODE();
17022: }
17023: */
17024: if (IS_VAR == IS_CONST) {
17025: hash_value = Z_HASH_P(varname);
17026: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
17027: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
17028: } else {
17029: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
17030: }
17031:
17032: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
17033: switch (type) {
17034: case BP_VAR_R:
17035: case BP_VAR_UNSET:
17036: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
17037: /* break missing intentionally */
17038: case BP_VAR_IS:
17039: retval = &EG(uninitialized_zval_ptr);
17040: break;
17041: case BP_VAR_RW:
17042: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
17043: /* break missing intentionally */
17044: case BP_VAR_W:
17045: Z_ADDREF_P(&EG(uninitialized_zval));
17046: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
17047: break;
17048: EMPTY_SWITCH_DEFAULT_CASE()
17049: }
17050: }
17051: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
17052: case ZEND_FETCH_GLOBAL:
17053: if (IS_VAR != IS_TMP_VAR) {
17054: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17055: }
17056: break;
17057: case ZEND_FETCH_LOCAL:
17058: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17059: break;
17060: case ZEND_FETCH_STATIC:
17061: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
17062: break;
17063: case ZEND_FETCH_GLOBAL_LOCK:
17064: if (IS_VAR == IS_VAR && !free_op1.var) {
17065: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
17066: }
17067: break;
17068: }
17069: }
17070:
17071:
17072: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
17073: zval_dtor(&tmp_varname);
17074: }
17075: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
17076: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
17077: }
17078: PZVAL_LOCK(*retval);
17079: switch (type) {
17080: case BP_VAR_R:
17081: case BP_VAR_IS:
17082: AI_SET_PTR(&EX_T(opline->result.var), *retval);
17083: break;
17084: case BP_VAR_UNSET: {
17085: zend_free_op free_res;
17086:
17087: PZVAL_UNLOCK(*retval, &free_res);
17088: if (retval != &EG(uninitialized_zval_ptr)) {
17089: SEPARATE_ZVAL_IF_NOT_REF(retval);
17090: }
17091: PZVAL_LOCK(*retval);
17092: FREE_OP_VAR_PTR(free_res);
17093: }
17094: /* break missing intentionally */
17095: default:
17096: EX_T(opline->result.var).var.ptr_ptr = retval;
17097: break;
17098: }
17099: CHECK_EXCEPTION();
17100: ZEND_VM_NEXT_OPCODE();
17101: }
17102:
17103: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17104: {
17105: return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17106: }
17107:
17108: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17109: {
17110: return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17111: }
17112:
17113: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17114: {
17115: return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17116: }
17117:
17118: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17119: {
17120: USE_OPLINE
17121:
17122: return zend_fetch_var_address_helper_SPEC_VAR_VAR(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17123: }
17124:
17125: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17126: {
17127: return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17128: }
17129:
17130: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17131: {
17132: return zend_fetch_var_address_helper_SPEC_VAR_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17133: }
17134:
1.1 misho 17135: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17136: {
1.1.1.2 misho 17137: USE_OPLINE
1.1 misho 17138: zend_free_op free_op1, free_op2;
1.1.1.5 ! misho 17139: zval *container;
1.1 misho 17140:
1.1.1.2 misho 17141: SAVE_OPLINE();
17142:
1.1.1.5 ! misho 17143: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 17144: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 17145: }
1.1.1.5 ! misho 17146: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 17147: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
1.1 misho 17148: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17149: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17150: CHECK_EXCEPTION();
1.1 misho 17151: ZEND_VM_NEXT_OPCODE();
17152: }
17153:
17154: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17155: {
1.1.1.2 misho 17156: USE_OPLINE
1.1 misho 17157: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17158: zval **container;
1.1 misho 17159:
1.1.1.2 misho 17160: SAVE_OPLINE();
17161: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17162:
17163: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17164: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17165: }
1.1.1.2 misho 17166: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 17167: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 17168: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17169: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17170: }
17171: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17172:
17173: /* We are going to assign the result by reference */
1.1.1.2 misho 17174: if (UNEXPECTED(opline->extended_value != 0)) {
17175: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
17176:
17177: if (retval_ptr) {
17178: Z_DELREF_PP(retval_ptr);
17179: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
17180: Z_ADDREF_PP(retval_ptr);
17181: }
1.1 misho 17182: }
17183:
1.1.1.2 misho 17184: CHECK_EXCEPTION();
1.1 misho 17185: ZEND_VM_NEXT_OPCODE();
17186: }
17187:
17188: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17189: {
1.1.1.2 misho 17190: USE_OPLINE
1.1 misho 17191: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17192: zval **container;
17193:
17194: SAVE_OPLINE();
17195: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17196:
1.1.1.2 misho 17197: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17198: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17199: }
1.1.1.2 misho 17200: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
1.1 misho 17201: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 17202: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17203: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17204: }
17205: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17206: CHECK_EXCEPTION();
1.1 misho 17207: ZEND_VM_NEXT_OPCODE();
17208: }
17209:
17210: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17211: {
1.1.1.2 misho 17212: USE_OPLINE
1.1 misho 17213: zend_free_op free_op1, free_op2;
1.1.1.5 ! misho 17214: zval *container;
1.1 misho 17215:
1.1.1.2 misho 17216: SAVE_OPLINE();
1.1.1.5 ! misho 17217: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 17218: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
1.1 misho 17219: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17220: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17221: CHECK_EXCEPTION();
1.1 misho 17222: ZEND_VM_NEXT_OPCODE();
17223: }
17224:
17225: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17226: {
1.1.1.2 misho 17227: USE_OPLINE
1.1 misho 17228: zend_free_op free_op1, free_op2;
17229:
1.1.1.2 misho 17230: SAVE_OPLINE();
17231:
17232: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 17233: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
! 17234:
1.1.1.2 misho 17235: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17236: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17237: }
1.1.1.2 misho 17238: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
17239: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17240: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17241: }
1.1.1.5 ! misho 17242: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 17243: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 17244: } else {
1.1.1.5 ! misho 17245: zval *container;
! 17246:
1.1 misho 17247: if (IS_VAR == IS_UNUSED) {
17248: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
17249: }
1.1.1.5 ! misho 17250: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 17251: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
1.1.1.5 ! misho 17252: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 17253: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 17254: }
1.1.1.2 misho 17255: CHECK_EXCEPTION();
1.1 misho 17256: ZEND_VM_NEXT_OPCODE();
17257: }
17258:
17259: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17260: {
1.1.1.2 misho 17261: USE_OPLINE
1.1 misho 17262: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17263: zval **container;
17264:
17265: SAVE_OPLINE();
17266: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17267:
17268: if (IS_VAR == IS_CV) {
17269: if (container != &EG(uninitialized_zval_ptr)) {
17270: SEPARATE_ZVAL_IF_NOT_REF(container);
17271: }
17272: }
1.1.1.2 misho 17273: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17274: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17275: }
1.1.1.2 misho 17276: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 17277: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 17278: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17279: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17280: }
17281: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17282: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 17283: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
17284: } else {
17285: zend_free_op free_res;
1.1.1.2 misho 17286: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 17287:
1.1.1.2 misho 17288: PZVAL_UNLOCK(*retval_ptr, &free_res);
17289: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
17290: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 17291: }
1.1.1.2 misho 17292: PZVAL_LOCK(*retval_ptr);
1.1 misho 17293: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 17294: CHECK_EXCEPTION();
17295: ZEND_VM_NEXT_OPCODE();
1.1 misho 17296: }
17297: }
17298:
1.1.1.2 misho 17299: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 17300: {
1.1.1.2 misho 17301: USE_OPLINE
1.1 misho 17302: zend_free_op free_op1;
1.1.1.2 misho 17303: zval *container;
1.1 misho 17304: zend_free_op free_op2;
1.1.1.2 misho 17305: zval *offset;
1.1 misho 17306:
1.1.1.2 misho 17307: SAVE_OPLINE();
17308: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17309: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17310:
17311: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
17312: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
17313: zend_error(E_NOTICE, "Trying to get property of non-object");
17314: PZVAL_LOCK(&EG(uninitialized_zval));
17315: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 17316: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17317: } else {
17318: zval *retval;
17319:
17320: if (0) {
17321: MAKE_REAL_ZVAL_PTR(offset);
17322: }
17323:
17324: /* here we are sure we are dealing with an object */
1.1.1.2 misho 17325: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 17326:
1.1.1.2 misho 17327: PZVAL_LOCK(retval);
17328: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 17329:
17330: if (0) {
17331: zval_ptr_dtor(&offset);
17332: } else {
17333: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17334: }
17335: }
17336:
17337: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17338: CHECK_EXCEPTION();
1.1 misho 17339: ZEND_VM_NEXT_OPCODE();
17340: }
17341:
17342: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17343: {
1.1.1.2 misho 17344: return zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 17345: }
17346:
17347: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17348: {
1.1.1.2 misho 17349: USE_OPLINE
1.1 misho 17350: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17351: zval *property;
1.1 misho 17352: zval **container;
17353:
1.1.1.2 misho 17354: SAVE_OPLINE();
17355: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17356:
1.1 misho 17357: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 17358: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
17359: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 17360: }
17361:
17362: if (0) {
17363: MAKE_REAL_ZVAL_PTR(property);
17364: }
1.1.1.2 misho 17365: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17366: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17367: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
17368: }
1.1.1.2 misho 17369:
17370: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 17371: if (0) {
17372: zval_ptr_dtor(&property);
17373: } else {
17374: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17375: }
1.1.1.2 misho 17376: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17377: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17378: }
17379: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17380:
17381: /* We are going to assign the result by reference */
17382: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 17383: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
17384:
17385: Z_DELREF_PP(retval_ptr);
17386: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
17387: Z_ADDREF_PP(retval_ptr);
17388: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
17389: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 17390: }
17391:
1.1.1.2 misho 17392: CHECK_EXCEPTION();
1.1 misho 17393: ZEND_VM_NEXT_OPCODE();
17394: }
17395:
17396: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17397: {
1.1.1.2 misho 17398: USE_OPLINE
1.1 misho 17399: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17400: zval *property;
17401: zval **container;
17402:
17403: SAVE_OPLINE();
17404: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17405: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17406:
17407: if (0) {
17408: MAKE_REAL_ZVAL_PTR(property);
17409: }
1.1.1.2 misho 17410: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17411: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
17412: }
1.1.1.2 misho 17413: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 17414: if (0) {
17415: zval_ptr_dtor(&property);
17416: } else {
17417: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17418: }
1.1.1.2 misho 17419: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17420: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17421: }
17422: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17423: CHECK_EXCEPTION();
1.1 misho 17424: ZEND_VM_NEXT_OPCODE();
17425: }
17426:
17427: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17428: {
1.1.1.2 misho 17429: USE_OPLINE
17430: zend_free_op free_op1;
17431: zval *container;
17432: zend_free_op free_op2;
17433: zval *offset;
17434:
17435: SAVE_OPLINE();
17436: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17437: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17438:
17439: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
17440: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
17441: PZVAL_LOCK(&EG(uninitialized_zval));
17442: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
17443: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17444: } else {
17445: zval *retval;
17446:
17447: if (0) {
17448: MAKE_REAL_ZVAL_PTR(offset);
17449: }
17450:
17451: /* here we are sure we are dealing with an object */
17452: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
17453:
17454: PZVAL_LOCK(retval);
17455: AI_SET_PTR(&EX_T(opline->result.var), retval);
17456:
17457: if (0) {
17458: zval_ptr_dtor(&offset);
17459: } else {
17460: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17461: }
17462: }
17463:
17464: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17465: CHECK_EXCEPTION();
17466: ZEND_VM_NEXT_OPCODE();
1.1 misho 17467: }
17468:
17469: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17470: {
1.1.1.2 misho 17471: USE_OPLINE
1.1 misho 17472:
1.1.1.2 misho 17473: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 17474: /* Behave like FETCH_OBJ_W */
17475: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17476: zval *property;
17477: zval **container;
17478:
17479: SAVE_OPLINE();
17480: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17481: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17482:
17483: if (0) {
17484: MAKE_REAL_ZVAL_PTR(property);
17485: }
1.1.1.2 misho 17486: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17487: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
17488: }
1.1.1.2 misho 17489: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 17490: if (0) {
17491: zval_ptr_dtor(&property);
17492: } else {
17493: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17494: }
1.1.1.2 misho 17495: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17496: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17497: }
17498: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 17499: CHECK_EXCEPTION();
1.1 misho 17500: ZEND_VM_NEXT_OPCODE();
17501: } else {
1.1.1.2 misho 17502: return zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 17503: }
17504: }
17505:
17506: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17507: {
1.1.1.2 misho 17508: USE_OPLINE
1.1 misho 17509: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 17510: zval **container;
17511: zval *property;
17512:
17513: SAVE_OPLINE();
17514: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17515: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17516:
17517: if (IS_VAR == IS_CV) {
17518: if (container != &EG(uninitialized_zval_ptr)) {
17519: SEPARATE_ZVAL_IF_NOT_REF(container);
17520: }
17521: }
17522: if (0) {
17523: MAKE_REAL_ZVAL_PTR(property);
17524: }
1.1.1.2 misho 17525: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 17526: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
17527: }
1.1.1.2 misho 17528: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 17529: if (0) {
17530: zval_ptr_dtor(&property);
17531: } else {
17532: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17533: }
1.1.1.2 misho 17534: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
17535: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 17536: }
17537: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17538:
1.1.1.2 misho 17539: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
17540: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
17541: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 17542: }
1.1.1.2 misho 17543: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 17544: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 17545: CHECK_EXCEPTION();
1.1 misho 17546: ZEND_VM_NEXT_OPCODE();
17547: }
17548:
17549: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17550: {
1.1.1.2 misho 17551: USE_OPLINE
1.1 misho 17552: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17553: zval **object_ptr;
17554: zval *property_name;
17555:
17556: SAVE_OPLINE();
17557: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17558: property_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17559:
17560: if (0) {
17561: MAKE_REAL_ZVAL_PTR(property_name);
17562: }
1.1.1.2 misho 17563: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 17564: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17565: }
1.1.1.2 misho 17566: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 17567: if (0) {
17568: zval_ptr_dtor(&property_name);
17569: } else {
17570: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17571: }
17572: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17573: /* assign_obj has two opcodes! */
1.1.1.2 misho 17574: CHECK_EXCEPTION();
1.1 misho 17575: ZEND_VM_INC_OPCODE();
17576: ZEND_VM_NEXT_OPCODE();
17577: }
17578:
17579: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17580: {
1.1.1.2 misho 17581: USE_OPLINE
1.1 misho 17582: zend_free_op free_op1;
1.1.1.2 misho 17583: zval **object_ptr;
17584:
17585: SAVE_OPLINE();
17586: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17587:
1.1.1.2 misho 17588: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 17589: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
17590: }
17591: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
17592: zend_free_op free_op2;
1.1.1.2 misho 17593: zval *property_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17594:
17595: if (0) {
17596: MAKE_REAL_ZVAL_PTR(property_name);
17597: }
1.1.1.2 misho 17598: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 17599: if (0) {
17600: zval_ptr_dtor(&property_name);
17601: } else {
17602: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17603: }
17604: } else {
17605: zend_free_op free_op2, free_op_data1, free_op_data2;
17606: zval *value;
1.1.1.2 misho 17607: zval *dim = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17608: zval **variable_ptr_ptr;
17609:
1.1.1.2 misho 17610: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 17611: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17612:
1.1.1.2 misho 17613: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
17614: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
17615: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
17616: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
17617: if (RETURN_VALUE_USED(opline)) {
17618: zval *retval;
17619:
17620: ALLOC_ZVAL(retval);
17621: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
17622: INIT_PZVAL(retval);
17623: AI_SET_PTR(&EX_T(opline->result.var), retval);
17624: }
17625: } else if (RETURN_VALUE_USED(opline)) {
17626: PZVAL_LOCK(&EG(uninitialized_zval));
17627: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
17628: }
17629: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
17630: if (IS_TMP_FREE(free_op_data1)) {
17631: zval_dtor(value);
17632: }
17633: if (RETURN_VALUE_USED(opline)) {
17634: PZVAL_LOCK(&EG(uninitialized_zval));
17635: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
17636: }
17637: } else {
17638: if ((opline+1)->op1_type == IS_TMP_VAR) {
17639: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17640: } else if ((opline+1)->op1_type == IS_CONST) {
17641: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17642: } else {
17643: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17644: }
17645: if (RETURN_VALUE_USED(opline)) {
1.1 misho 17646: PZVAL_LOCK(value);
1.1.1.2 misho 17647: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 17648: }
17649: }
17650: FREE_OP_VAR_PTR(free_op_data2);
17651: FREE_OP_IF_VAR(free_op_data1);
17652: }
17653: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17654: /* assign_dim has two opcodes! */
1.1.1.2 misho 17655: CHECK_EXCEPTION();
1.1 misho 17656: ZEND_VM_INC_OPCODE();
17657: ZEND_VM_NEXT_OPCODE();
17658: }
17659:
17660: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17661: {
1.1.1.2 misho 17662: USE_OPLINE
1.1 misho 17663: zend_free_op free_op1, free_op2;
1.1.1.2 misho 17664: zval *value;
17665: zval **variable_ptr_ptr;
1.1 misho 17666:
1.1.1.2 misho 17667: SAVE_OPLINE();
17668: value = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
17669: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17670:
17671: if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
17672: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_VAR TSRMLS_CC)) {
17673: if (RETURN_VALUE_USED(opline)) {
17674: zval *retval;
17675:
17676: ALLOC_ZVAL(retval);
17677: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
17678: INIT_PZVAL(retval);
17679: AI_SET_PTR(&EX_T(opline->result.var), retval);
17680: }
17681: } else if (RETURN_VALUE_USED(opline)) {
17682: PZVAL_LOCK(&EG(uninitialized_zval));
17683: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
17684: }
17685: } else if (IS_VAR == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
17686: if (0) {
17687: zval_dtor(value);
17688: }
17689: if (RETURN_VALUE_USED(opline)) {
17690: PZVAL_LOCK(&EG(uninitialized_zval));
17691: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
17692: }
17693: } else {
17694: if (IS_VAR == IS_TMP_VAR) {
17695: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17696: } else if (IS_VAR == IS_CONST) {
17697: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17698: } else {
17699: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
17700: }
17701: if (RETURN_VALUE_USED(opline)) {
1.1 misho 17702: PZVAL_LOCK(value);
1.1.1.2 misho 17703: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 17704: }
17705: }
17706:
17707: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17708:
17709: /* zend_assign_to_variable() always takes care of op2, never free it! */
17710: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17711:
1.1.1.2 misho 17712: CHECK_EXCEPTION();
1.1 misho 17713: ZEND_VM_NEXT_OPCODE();
17714: }
17715:
17716: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17717: {
1.1.1.2 misho 17718: USE_OPLINE
1.1 misho 17719: zend_free_op free_op1, free_op2;
17720: zval **variable_ptr_ptr;
1.1.1.2 misho 17721: zval **value_ptr_ptr;
17722:
17723: SAVE_OPLINE();
17724: value_ptr_ptr = _get_zval_ptr_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17725:
17726: if (IS_VAR == IS_VAR &&
17727: value_ptr_ptr &&
17728: !Z_ISREF_PP(value_ptr_ptr) &&
17729: opline->extended_value == ZEND_RETURNS_FUNCTION &&
1.1.1.2 misho 17730: !EX_T(opline->op2.var).var.fcall_returned_reference) {
1.1 misho 17731: if (free_op2.var == NULL) {
17732: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
17733: }
17734: zend_error(E_STRICT, "Only variables should be assigned by reference");
17735: if (UNEXPECTED(EG(exception) != NULL)) {
17736: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 17737: HANDLE_EXCEPTION();
1.1 misho 17738: }
17739: return ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
17740: } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
17741: PZVAL_LOCK(*value_ptr_ptr);
17742: }
1.1.1.2 misho 17743: if (IS_VAR == IS_VAR && UNEXPECTED(EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr)) {
1.1 misho 17744: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
17745: }
17746:
1.1.1.2 misho 17747: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17748: if ((IS_VAR == IS_VAR && UNEXPECTED(value_ptr_ptr == NULL)) ||
17749: (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL))) {
1.1 misho 17750: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
17751: }
17752: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
17753:
17754: if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
17755: Z_DELREF_PP(variable_ptr_ptr);
17756: }
17757:
1.1.1.2 misho 17758: if (RETURN_VALUE_USED(opline)) {
1.1 misho 17759: PZVAL_LOCK(*variable_ptr_ptr);
1.1.1.2 misho 17760: AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr);
1.1 misho 17761: }
17762:
17763: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17764: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17765:
1.1.1.2 misho 17766: CHECK_EXCEPTION();
1.1 misho 17767: ZEND_VM_NEXT_OPCODE();
17768: }
17769:
17770: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17771: {
1.1.1.2 misho 17772: USE_OPLINE
1.1 misho 17773: zval *function_name;
17774: char *function_name_strval;
17775: int function_name_strlen;
17776: zend_free_op free_op1, free_op2;
17777:
1.1.1.2 misho 17778: SAVE_OPLINE();
1.1 misho 17779: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
17780:
1.1.1.2 misho 17781: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17782:
1.1.1.2 misho 17783: if (IS_VAR != IS_CONST &&
17784: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 17785: zend_error_noreturn(E_ERROR, "Method name must be a string");
17786: }
17787:
17788: function_name_strval = Z_STRVAL_P(function_name);
17789: function_name_strlen = Z_STRLEN_P(function_name);
17790:
1.1.1.2 misho 17791: EX(object) = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17792:
1.1.1.2 misho 17793: if (EXPECTED(EX(object) != NULL) &&
17794: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
17795: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 17796:
1.1.1.2 misho 17797: if (IS_VAR != IS_CONST ||
17798: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
17799: zval *object = EX(object);
17800:
17801: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
17802: zend_error_noreturn(E_ERROR, "Object does not support method calls");
17803: }
17804:
17805: /* First, locate the function. */
17806: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
17807: if (UNEXPECTED(EX(fbc) == NULL)) {
17808: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
17809: }
17810: if (IS_VAR == IS_CONST &&
17811: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
17812: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
17813: EXPECTED(EX(object) == object)) {
17814: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
17815: }
1.1 misho 17816: }
17817: } else {
17818: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
17819: }
17820:
17821: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
17822: EX(object) = NULL;
17823: } else {
17824: if (!PZVAL_IS_REF(EX(object))) {
17825: Z_ADDREF_P(EX(object)); /* For $this pointer */
17826: } else {
17827: zval *this_ptr;
17828: ALLOC_ZVAL(this_ptr);
17829: INIT_PZVAL_COPY(this_ptr, EX(object));
17830: zval_copy_ctor(this_ptr);
17831: EX(object) = this_ptr;
17832: }
17833: }
17834:
17835: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17836: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
17837:
1.1.1.2 misho 17838: CHECK_EXCEPTION();
1.1 misho 17839: ZEND_VM_NEXT_OPCODE();
17840: }
17841:
17842: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17843: {
1.1.1.2 misho 17844: USE_OPLINE
1.1 misho 17845: zval *function_name;
17846: zend_class_entry *ce;
17847:
1.1.1.2 misho 17848: SAVE_OPLINE();
1.1 misho 17849: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
17850:
17851: if (IS_VAR == IS_CONST) {
17852: /* no function found. try a static method in class */
1.1.1.2 misho 17853: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
17854: ce = CACHED_PTR(opline->op1.literal->cache_slot);
17855: } else {
17856: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 17857: if (UNEXPECTED(EG(exception) != NULL)) {
17858: HANDLE_EXCEPTION();
17859: }
1.1.1.2 misho 17860: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 17861: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 17862: }
17863: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 17864: }
17865: EX(called_scope) = ce;
17866: } else {
1.1.1.2 misho 17867: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 17868:
1.1.1.2 misho 17869: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 17870: EX(called_scope) = EG(called_scope);
17871: } else {
17872: EX(called_scope) = ce;
17873: }
17874: }
1.1.1.2 misho 17875:
17876: if (IS_VAR == IS_CONST &&
17877: IS_VAR == IS_CONST &&
17878: CACHED_PTR(opline->op2.literal->cache_slot)) {
17879: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
17880: } else if (IS_VAR != IS_CONST &&
17881: IS_VAR == IS_CONST &&
17882: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
17883: /* do nothing */
17884: } else if (IS_VAR != IS_UNUSED) {
1.1 misho 17885: char *function_name_strval = NULL;
17886: int function_name_strlen = 0;
17887: zend_free_op free_op2;
17888:
17889: if (IS_VAR == IS_CONST) {
1.1.1.2 misho 17890: function_name_strval = Z_STRVAL_P(opline->op2.zv);
17891: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 17892: } else {
1.1.1.2 misho 17893: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 17894:
1.1.1.2 misho 17895: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 17896: zend_error_noreturn(E_ERROR, "Function name must be a string");
17897: } else {
17898: function_name_strval = Z_STRVAL_P(function_name);
17899: function_name_strlen = Z_STRLEN_P(function_name);
17900: }
17901: }
17902:
17903: if (function_name_strval) {
17904: if (ce->get_static_method) {
17905: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
17906: } else {
1.1.1.2 misho 17907: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 17908: }
1.1.1.2 misho 17909: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 17910: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
17911: }
1.1.1.2 misho 17912: if (IS_VAR == IS_CONST &&
17913: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
17914: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
17915: if (IS_VAR == IS_CONST) {
17916: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
17917: } else {
17918: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
17919: }
17920: }
1.1 misho 17921: }
17922: if (IS_VAR != IS_CONST) {
17923: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
17924: }
17925: } else {
1.1.1.2 misho 17926: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 17927: zend_error_noreturn(E_ERROR, "Cannot call constructor");
17928: }
17929: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 17930: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 17931: }
17932: EX(fbc) = ce->constructor;
17933: }
17934:
17935: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
17936: EX(object) = NULL;
17937: } else {
17938: if (EG(This) &&
17939: Z_OBJ_HT_P(EG(This))->get_class_entry &&
17940: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
17941: /* We are calling method of the other (incompatible) class,
17942: but passing $this. This is done for compatibility with php-4. */
17943: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 17944: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 17945: } else {
17946: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 17947: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 17948: }
17949: }
17950: if ((EX(object) = EG(This))) {
17951: Z_ADDREF_P(EX(object));
17952: EX(called_scope) = Z_OBJCE_P(EX(object));
17953: }
17954: }
17955:
1.1.1.2 misho 17956: CHECK_EXCEPTION();
1.1 misho 17957: ZEND_VM_NEXT_OPCODE();
17958: }
17959:
17960: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17961: {
1.1.1.2 misho 17962: USE_OPLINE
1.1 misho 17963: zend_free_op free_op1, free_op2;
17964:
1.1.1.2 misho 17965: SAVE_OPLINE();
1.1 misho 17966: if (IS_VAR==IS_VAR) {
1.1.1.2 misho 17967: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 17968: }
1.1.1.2 misho 17969: is_equal_function(&EX_T(opline->result.var).tmp_var,
17970: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
17971: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 17972:
17973: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 17974: CHECK_EXCEPTION();
1.1 misho 17975: ZEND_VM_NEXT_OPCODE();
17976: }
17977:
17978: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
17979: {
1.1.1.2 misho 17980: USE_OPLINE
17981: zend_free_op free_op1;
1.1 misho 17982: zval *expr_ptr;
17983:
1.1.1.2 misho 17984: SAVE_OPLINE();
17985: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
17986: zval **expr_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 17987:
1.1.1.2 misho 17988: if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
17989: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
17990: }
17991: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 17992: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 17993: Z_ADDREF_P(expr_ptr);
1.1 misho 17994: } else {
1.1.1.2 misho 17995: expr_ptr=_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
17996: if (0) { /* temporary variable */
17997: zval *new_expr;
1.1 misho 17998:
1.1.1.2 misho 17999: ALLOC_ZVAL(new_expr);
18000: INIT_PZVAL_COPY(new_expr, expr_ptr);
18001: expr_ptr = new_expr;
18002: } else if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 18003: zval *new_expr;
18004:
18005: ALLOC_ZVAL(new_expr);
18006: INIT_PZVAL_COPY(new_expr, expr_ptr);
18007: expr_ptr = new_expr;
18008: zendi_zval_copy_ctor(*expr_ptr);
18009: } else {
18010: Z_ADDREF_P(expr_ptr);
18011: }
18012: }
1.1.1.2 misho 18013:
18014: if (IS_VAR != IS_UNUSED) {
18015: zend_free_op free_op2;
18016: zval *offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
18017: ulong hval;
18018:
1.1 misho 18019: switch (Z_TYPE_P(offset)) {
18020: case IS_DOUBLE:
1.1.1.2 misho 18021: hval = zend_dval_to_lval(Z_DVAL_P(offset));
18022: goto num_index;
1.1 misho 18023: case IS_LONG:
18024: case IS_BOOL:
1.1.1.2 misho 18025: hval = Z_LVAL_P(offset);
18026: num_index:
18027: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 18028: break;
18029: case IS_STRING:
1.1.1.2 misho 18030: if (IS_VAR == IS_CONST) {
18031: hval = Z_HASH_P(offset);
18032: } else {
18033: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
18034: if (IS_INTERNED(Z_STRVAL_P(offset))) {
18035: hval = INTERNED_HASH(Z_STRVAL_P(offset));
18036: } else {
18037: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
18038: }
18039: }
18040: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 18041: break;
18042: case IS_NULL:
1.1.1.2 misho 18043: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 18044: break;
18045: default:
18046: zend_error(E_WARNING, "Illegal offset type");
18047: zval_ptr_dtor(&expr_ptr);
18048: /* do nothing */
18049: break;
18050: }
18051: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18052: } else {
1.1.1.2 misho 18053: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 18054: }
1.1.1.2 misho 18055: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
1.1 misho 18056: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18057: } else {
18058: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18059: }
1.1.1.2 misho 18060: CHECK_EXCEPTION();
1.1 misho 18061: ZEND_VM_NEXT_OPCODE();
18062: }
18063:
18064: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18065: {
1.1.1.2 misho 18066: USE_OPLINE
1.1 misho 18067:
1.1.1.2 misho 18068: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 18069: if (IS_VAR == IS_UNUSED) {
18070: ZEND_VM_NEXT_OPCODE();
18071: #if 0 || IS_VAR != IS_UNUSED
18072: } else {
18073: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18074: #endif
18075: }
18076: }
18077:
1.1.1.2 misho 18078: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18079: {
18080: USE_OPLINE
18081: zval tmp, *varname;
18082: HashTable *target_symbol_table;
18083: zend_free_op free_op1;
18084:
18085: SAVE_OPLINE();
18086: if (IS_VAR == IS_CV &&
18087: IS_VAR == IS_UNUSED &&
18088: (opline->extended_value & ZEND_QUICK_SET)) {
18089: if (EG(active_symbol_table)) {
18090: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
18091:
18092: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
18093: EX_CV(opline->op1.var) = NULL;
18094: } else if (EX_CV(opline->op1.var)) {
18095: zval_ptr_dtor(EX_CV(opline->op1.var));
18096: EX_CV(opline->op1.var) = NULL;
18097: }
18098: CHECK_EXCEPTION();
18099: ZEND_VM_NEXT_OPCODE();
18100: }
18101:
18102: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
18103:
18104: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
18105: ZVAL_COPY_VALUE(&tmp, varname);
18106: zval_copy_ctor(&tmp);
18107: convert_to_string(&tmp);
18108: varname = &tmp;
18109: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
18110: Z_ADDREF_P(varname);
18111: }
18112:
18113: if (IS_VAR != IS_UNUSED) {
18114: zend_class_entry *ce;
18115:
18116: if (IS_VAR == IS_CONST) {
18117: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
18118: ce = CACHED_PTR(opline->op2.literal->cache_slot);
18119: } else {
18120: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 18121: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 18122: if (IS_VAR != IS_CONST && varname == &tmp) {
18123: zval_dtor(&tmp);
18124: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
18125: zval_ptr_dtor(&varname);
18126: }
18127: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.4 misho 18128: HANDLE_EXCEPTION();
18129: }
18130: if (UNEXPECTED(ce == NULL)) {
18131: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 18132: }
18133: CACHE_PTR(opline->op2.literal->cache_slot, ce);
18134: }
18135: } else {
18136: ce = EX_T(opline->op2.var).class_entry;
18137: }
18138: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
18139: } else {
18140: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
18141:
18142: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
18143: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
18144: }
18145:
18146: if (IS_VAR != IS_CONST && varname == &tmp) {
18147: zval_dtor(&tmp);
18148: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
18149: zval_ptr_dtor(&varname);
18150: }
18151: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18152: CHECK_EXCEPTION();
18153: ZEND_VM_NEXT_OPCODE();
18154: }
18155:
1.1 misho 18156: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18157: {
1.1.1.2 misho 18158: USE_OPLINE
1.1 misho 18159: zend_free_op free_op1, free_op2;
1.1.1.2 misho 18160: zval **container;
1.1 misho 18161: zval *offset;
1.1.1.2 misho 18162: ulong hval;
1.1 misho 18163:
1.1.1.2 misho 18164: SAVE_OPLINE();
18165: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18166: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
18167: SEPARATE_ZVAL_IF_NOT_REF(container);
18168: }
1.1.1.2 misho 18169: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 18170:
18171: if (IS_VAR != IS_VAR || container) {
18172: switch (Z_TYPE_PP(container)) {
18173: case IS_ARRAY: {
18174: HashTable *ht = Z_ARRVAL_PP(container);
18175:
18176: switch (Z_TYPE_P(offset)) {
18177: case IS_DOUBLE:
1.1.1.2 misho 18178: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 18179: zend_hash_index_del(ht, hval);
18180: break;
1.1 misho 18181: case IS_RESOURCE:
18182: case IS_BOOL:
18183: case IS_LONG:
1.1.1.2 misho 18184: hval = Z_LVAL_P(offset);
18185: zend_hash_index_del(ht, hval);
1.1 misho 18186: break;
18187: case IS_STRING:
18188: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
18189: Z_ADDREF_P(offset);
18190: }
1.1.1.2 misho 18191: if (IS_VAR == IS_CONST) {
18192: hval = Z_HASH_P(offset);
18193: } else {
18194: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
18195: if (IS_INTERNED(Z_STRVAL_P(offset))) {
18196: hval = INTERNED_HASH(Z_STRVAL_P(offset));
18197: } else {
18198: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 18199: }
18200: }
1.1.1.2 misho 18201: if (ht == &EG(symbol_table)) {
18202: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
18203: } else {
18204: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
18205: }
18206: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
18207: zval_ptr_dtor(&offset);
18208: }
18209: break;
18210: num_index_dim:
18211: zend_hash_index_del(ht, hval);
1.1 misho 18212: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
18213: zval_ptr_dtor(&offset);
18214: }
18215: break;
18216: case IS_NULL:
18217: zend_hash_del(ht, "", sizeof(""));
18218: break;
18219: default:
18220: zend_error(E_WARNING, "Illegal offset type in unset");
18221: break;
18222: }
18223: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18224: break;
18225: }
18226: case IS_OBJECT:
1.1.1.2 misho 18227: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 18228: zend_error_noreturn(E_ERROR, "Cannot use object as array");
18229: }
18230: if (0) {
18231: MAKE_REAL_ZVAL_PTR(offset);
18232: }
18233: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
18234: if (0) {
18235: zval_ptr_dtor(&offset);
18236: } else {
18237: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18238: }
18239: break;
18240: case IS_STRING:
18241: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
18242: ZEND_VM_CONTINUE(); /* bailed out before */
18243: default:
18244: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18245: break;
18246: }
18247: } else {
18248: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18249: }
18250: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18251:
1.1.1.2 misho 18252: CHECK_EXCEPTION();
1.1 misho 18253: ZEND_VM_NEXT_OPCODE();
18254: }
18255:
18256: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18257: {
1.1.1.2 misho 18258: USE_OPLINE
1.1 misho 18259: zend_free_op free_op1, free_op2;
1.1.1.2 misho 18260: zval **container;
18261: zval *offset;
18262:
18263: SAVE_OPLINE();
18264: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
18265: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 18266:
18267: if (IS_VAR != IS_VAR || container) {
18268: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
18269: SEPARATE_ZVAL_IF_NOT_REF(container);
18270: }
18271: if (Z_TYPE_PP(container) == IS_OBJECT) {
18272: if (0) {
18273: MAKE_REAL_ZVAL_PTR(offset);
18274: }
18275: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 18276: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 18277: } else {
18278: zend_error(E_NOTICE, "Trying to unset property of non-object");
18279: }
18280: if (0) {
18281: zval_ptr_dtor(&offset);
18282: } else {
18283: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18284: }
18285: } else {
18286: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18287: }
18288: } else {
18289: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18290: }
18291: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18292:
1.1.1.2 misho 18293: CHECK_EXCEPTION();
18294: ZEND_VM_NEXT_OPCODE();
18295: }
18296:
18297: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18298: {
18299: USE_OPLINE
18300: zval **value;
18301: zend_bool isset = 1;
18302:
18303: SAVE_OPLINE();
18304: if (IS_VAR == IS_CV &&
18305: IS_VAR == IS_UNUSED &&
18306: (opline->extended_value & ZEND_QUICK_SET)) {
18307: if (EX_CV(opline->op1.var)) {
18308: value = EX_CV(opline->op1.var);
18309: } else if (EG(active_symbol_table)) {
18310: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
18311:
18312: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
18313: isset = 0;
18314: }
18315: } else {
18316: isset = 0;
18317: }
18318: } else {
18319: HashTable *target_symbol_table;
18320: zend_free_op free_op1;
18321: zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
18322:
18323: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
18324: ZVAL_COPY_VALUE(&tmp, varname);
18325: zval_copy_ctor(&tmp);
18326: convert_to_string(&tmp);
18327: varname = &tmp;
18328: }
18329:
18330: if (IS_VAR != IS_UNUSED) {
18331: zend_class_entry *ce;
18332:
18333: if (IS_VAR == IS_CONST) {
18334: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
18335: ce = CACHED_PTR(opline->op2.literal->cache_slot);
18336: } else {
18337: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
18338: if (UNEXPECTED(ce == NULL)) {
18339: CHECK_EXCEPTION();
18340: ZEND_VM_NEXT_OPCODE();
18341: }
18342: CACHE_PTR(opline->op2.literal->cache_slot, ce);
18343: }
18344: } else {
18345: ce = EX_T(opline->op2.var).class_entry;
18346: }
18347: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
18348: if (!value) {
18349: isset = 0;
18350: }
18351: } else {
18352: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
18353: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
18354: isset = 0;
18355: }
18356: }
18357:
18358: if (IS_VAR != IS_CONST && varname == &tmp) {
18359: zval_dtor(&tmp);
18360: }
18361: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18362: }
18363:
18364: if (opline->extended_value & ZEND_ISSET) {
18365: if (isset && Z_TYPE_PP(value) != IS_NULL) {
18366: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
18367: } else {
18368: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
18369: }
18370: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
18371: if (!isset || !i_zend_is_true(*value)) {
18372: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
18373: } else {
18374: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
18375: }
18376: }
18377:
18378: CHECK_EXCEPTION();
1.1 misho 18379: ZEND_VM_NEXT_OPCODE();
18380: }
18381:
18382: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
18383: {
1.1.1.2 misho 18384: USE_OPLINE
18385: zend_free_op free_op1, free_op2;
18386: zval **container;
1.1 misho 18387: zval **value = NULL;
18388: int result = 0;
1.1.1.2 misho 18389: ulong hval;
18390: zval *offset;
1.1 misho 18391:
1.1.1.2 misho 18392: SAVE_OPLINE();
18393: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18394:
1.1.1.2 misho 18395: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 18396:
1.1.1.2 misho 18397: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
18398: HashTable *ht;
18399: int isset = 0;
1.1 misho 18400:
1.1.1.2 misho 18401: ht = Z_ARRVAL_PP(container);
18402:
18403: switch (Z_TYPE_P(offset)) {
18404: case IS_DOUBLE:
18405: hval = zend_dval_to_lval(Z_DVAL_P(offset));
18406: goto num_index_prop;
18407: case IS_RESOURCE:
18408: case IS_BOOL:
18409: case IS_LONG:
18410: hval = Z_LVAL_P(offset);
18411: num_index_prop:
18412: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
18413: isset = 1;
18414: }
18415: break;
18416: case IS_STRING:
18417: if (IS_VAR == IS_CONST) {
18418: hval = Z_HASH_P(offset);
18419: } else {
18420: if (!prop_dim) {
18421: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 18422: }
1.1.1.2 misho 18423: if (IS_INTERNED(Z_STRVAL_P(offset))) {
18424: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 18425: } else {
1.1.1.2 misho 18426: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 18427: }
1.1.1.2 misho 18428: }
18429: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
18430: isset = 1;
18431: }
18432: break;
18433: case IS_NULL:
18434: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
18435: isset = 1;
18436: }
18437: break;
18438: default:
18439: zend_error(E_WARNING, "Illegal offset type in isset or empty");
18440: break;
18441: }
18442:
18443: if (opline->extended_value & ZEND_ISSET) {
18444: if (isset && Z_TYPE_PP(value) == IS_NULL) {
18445: result = 0;
18446: } else {
18447: result = isset;
1.1 misho 18448: }
1.1.1.2 misho 18449: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
18450: if (!isset || !i_zend_is_true(*value)) {
18451: result = 0;
18452: } else {
18453: result = 1;
1.1 misho 18454: }
1.1.1.2 misho 18455: }
18456: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18457: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
18458: if (0) {
18459: MAKE_REAL_ZVAL_PTR(offset);
18460: }
18461: if (prop_dim) {
18462: if (Z_OBJ_HT_P(*container)->has_property) {
18463: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 18464: } else {
1.1.1.2 misho 18465: zend_error(E_NOTICE, "Trying to check property of non-object");
18466: result = 0;
1.1 misho 18467: }
1.1.1.2 misho 18468: } else {
18469: if (Z_OBJ_HT_P(*container)->has_dimension) {
18470: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 18471: } else {
1.1.1.2 misho 18472: zend_error(E_NOTICE, "Trying to check element of non-array");
18473: result = 0;
1.1 misho 18474: }
1.1.1.2 misho 18475: }
18476: if (0) {
18477: zval_ptr_dtor(&offset);
18478: } else {
18479: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18480: }
18481: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
18482: zval tmp;
1.1 misho 18483:
1.1.1.2 misho 18484: if (Z_TYPE_P(offset) != IS_LONG) {
18485: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
18486: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
18487: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
18488: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 18489: zval_copy_ctor(&tmp);
18490: convert_to_long(&tmp);
18491: offset = &tmp;
1.1.1.2 misho 18492: } else {
18493: /* can not be converted to proper offset, return "not set" */
18494: result = 0;
1.1 misho 18495: }
1.1.1.2 misho 18496: }
18497: if (Z_TYPE_P(offset) == IS_LONG) {
18498: if (opline->extended_value & ZEND_ISSET) {
18499: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
18500: result = 1;
18501: }
18502: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
18503: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
18504: result = 1;
1.1 misho 18505: }
18506: }
18507: }
1.1.1.2 misho 18508: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
18509: } else {
18510: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 18511: }
18512:
1.1.1.2 misho 18513: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
18514: if (opline->extended_value & ZEND_ISSET) {
18515: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
18516: } else {
18517: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 18518: }
18519:
18520: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18521:
1.1.1.2 misho 18522: CHECK_EXCEPTION();
1.1 misho 18523: ZEND_VM_NEXT_OPCODE();
18524: }
18525:
18526: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18527: {
18528: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18529: }
18530:
18531: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18532: {
18533: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18534: }
18535:
18536: 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)
18537: {
1.1.1.2 misho 18538: USE_OPLINE
1.1 misho 18539: zend_free_op free_op1, free_op_data1;
1.1.1.2 misho 18540: zval **object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18541: zval *object;
18542: zval *property = NULL;
1.1.1.2 misho 18543: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 18544: int have_get_ptr = 0;
18545:
1.1.1.2 misho 18546: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 18547: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
18548: }
18549:
18550: make_real_object(object_ptr TSRMLS_CC);
18551: object = *object_ptr;
18552:
1.1.1.2 misho 18553: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 18554: zend_error(E_WARNING, "Attempt to assign property of non-object");
18555:
18556: FREE_OP(free_op_data1);
18557:
1.1.1.2 misho 18558: if (RETURN_VALUE_USED(opline)) {
18559: PZVAL_LOCK(&EG(uninitialized_zval));
18560: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
18561: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 18562: }
18563: } else {
18564: /* here we are sure we are dealing with an object */
18565: if (0) {
18566: MAKE_REAL_ZVAL_PTR(property);
18567: }
18568:
18569: /* here property is a string */
18570: if (opline->extended_value == ZEND_ASSIGN_OBJ
18571: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 18572: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 18573: if (zptr != NULL) { /* NULL means no success in getting PTR */
18574: SEPARATE_ZVAL_IF_NOT_REF(zptr);
18575:
18576: have_get_ptr = 1;
18577: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 18578: if (RETURN_VALUE_USED(opline)) {
1.1 misho 18579: PZVAL_LOCK(*zptr);
1.1.1.2 misho 18580: EX_T(opline->result.var).var.ptr = *zptr;
18581: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 18582: }
18583: }
18584: }
18585:
18586: if (!have_get_ptr) {
18587: zval *z = NULL;
18588:
18589: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
18590: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 18591: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 18592: }
18593: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
18594: if (Z_OBJ_HT_P(object)->read_dimension) {
18595: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
18596: }
18597: }
18598: if (z) {
18599: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
18600: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
18601:
18602: if (Z_REFCOUNT_P(z) == 0) {
18603: GC_REMOVE_ZVAL_FROM_BUFFER(z);
18604: zval_dtor(z);
18605: FREE_ZVAL(z);
18606: }
18607: z = value;
18608: }
18609: Z_ADDREF_P(z);
18610: SEPARATE_ZVAL_IF_NOT_REF(&z);
18611: binary_op(z, z, value TSRMLS_CC);
18612: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 18613: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 18614: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
18615: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
18616: }
1.1.1.2 misho 18617: if (RETURN_VALUE_USED(opline)) {
1.1 misho 18618: PZVAL_LOCK(z);
1.1.1.2 misho 18619: EX_T(opline->result.var).var.ptr = z;
18620: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 18621: }
18622: zval_ptr_dtor(&z);
18623: } else {
18624: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 18625: if (RETURN_VALUE_USED(opline)) {
18626: PZVAL_LOCK(&EG(uninitialized_zval));
18627: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
18628: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 18629: }
18630: }
18631: }
18632:
18633: if (0) {
18634: zval_ptr_dtor(&property);
18635: } else {
18636:
18637: }
18638: FREE_OP(free_op_data1);
18639: }
18640:
18641: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18642: /* assign_obj has two opcodes! */
1.1.1.2 misho 18643: CHECK_EXCEPTION();
1.1 misho 18644: ZEND_VM_INC_OPCODE();
18645: ZEND_VM_NEXT_OPCODE();
18646: }
18647:
18648: 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)
18649: {
1.1.1.2 misho 18650: USE_OPLINE
1.1 misho 18651: zend_free_op free_op1, free_op_data2, free_op_data1;
18652: zval **var_ptr;
18653: zval *value;
18654:
1.1.1.2 misho 18655: SAVE_OPLINE();
1.1 misho 18656: switch (opline->extended_value) {
18657: case ZEND_ASSIGN_OBJ:
18658: return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18659: break;
18660: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 18661: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18662:
1.1.1.2 misho 18663: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 18664: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 18665: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 18666: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
18667: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
18668: }
18669: return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18670: } else {
18671: zval *dim = NULL;
18672:
1.1.1.2 misho 18673: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
18674: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
18675: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 18676: }
18677: }
18678: break;
18679: default:
18680: value = NULL;
1.1.1.2 misho 18681: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18682: /* do nothing */
18683: break;
18684: }
18685:
1.1.1.2 misho 18686: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 18687: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
18688: }
18689:
1.1.1.2 misho 18690: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
18691: if (RETURN_VALUE_USED(opline)) {
18692: PZVAL_LOCK(&EG(uninitialized_zval));
18693: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 18694: }
18695:
18696: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 18697: CHECK_EXCEPTION();
18698: if (opline->extended_value == ZEND_ASSIGN_DIM) {
18699: ZEND_VM_INC_OPCODE();
18700: }
1.1 misho 18701: ZEND_VM_NEXT_OPCODE();
18702: }
18703:
18704: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
18705:
1.1.1.2 misho 18706: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
18707: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 18708: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
18709: /* proxy object */
18710: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
18711: Z_ADDREF_P(objval);
18712: binary_op(objval, objval, value TSRMLS_CC);
18713: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
18714: zval_ptr_dtor(&objval);
18715: } else {
18716: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
18717: }
18718:
1.1.1.2 misho 18719: if (RETURN_VALUE_USED(opline)) {
1.1 misho 18720: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 18721: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 18722: }
18723:
18724: if (opline->extended_value == ZEND_ASSIGN_DIM) {
18725: FREE_OP(free_op_data1);
18726: FREE_OP_VAR_PTR(free_op_data2);
1.1.1.2 misho 18727: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18728: CHECK_EXCEPTION();
18729: ZEND_VM_INC_OPCODE();
18730: } else {
18731: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18732: CHECK_EXCEPTION();
1.1 misho 18733: }
18734: ZEND_VM_NEXT_OPCODE();
18735: }
18736:
18737: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18738: {
18739: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18740: }
18741:
18742: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18743: {
18744: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18745: }
18746:
18747: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18748: {
18749: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18750: }
18751:
18752: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18753: {
18754: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18755: }
18756:
18757: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18758: {
18759: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18760: }
18761:
18762: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18763: {
18764: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18765: }
18766:
18767: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18768: {
18769: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18770: }
18771:
18772: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18773: {
18774: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18775: }
18776:
18777: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18778: {
18779: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18780: }
18781:
18782: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18783: {
18784: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18785: }
18786:
18787: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18788: {
18789: return zend_binary_assign_op_helper_SPEC_VAR_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18790: }
18791:
1.1.1.2 misho 18792: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS)
18793: {
18794: USE_OPLINE
18795: zend_free_op free_op1;
18796: zval *varname;
18797: zval **retval;
18798: zval tmp_varname;
18799: HashTable *target_symbol_table;
18800: ulong hash_value;
18801:
18802: SAVE_OPLINE();
18803: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
18804:
18805: if (IS_VAR != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
18806: ZVAL_COPY_VALUE(&tmp_varname, varname);
18807: zval_copy_ctor(&tmp_varname);
18808: Z_SET_REFCOUNT(tmp_varname, 1);
18809: Z_UNSET_ISREF(tmp_varname);
18810: convert_to_string(&tmp_varname);
18811: varname = &tmp_varname;
18812: }
18813:
18814: if (IS_UNUSED != IS_UNUSED) {
18815: zend_class_entry *ce;
18816:
18817: if (IS_UNUSED == IS_CONST) {
18818: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
18819: ce = CACHED_PTR(opline->op2.literal->cache_slot);
18820: } else {
18821: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
18822: if (UNEXPECTED(ce == NULL)) {
18823: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
18824: zval_dtor(&tmp_varname);
18825: }
18826: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18827: CHECK_EXCEPTION();
18828: ZEND_VM_NEXT_OPCODE();
18829: }
18830: CACHE_PTR(opline->op2.literal->cache_slot, ce);
18831: }
18832: } else {
18833: ce = EX_T(opline->op2.var).class_entry;
18834: }
18835: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
18836: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18837: } else {
18838: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
18839: /*
18840: if (!target_symbol_table) {
18841: CHECK_EXCEPTION();
18842: ZEND_VM_NEXT_OPCODE();
18843: }
18844: */
18845: if (IS_VAR == IS_CONST) {
18846: hash_value = Z_HASH_P(varname);
18847: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
18848: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
18849: } else {
18850: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
18851: }
18852:
18853: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
18854: switch (type) {
18855: case BP_VAR_R:
18856: case BP_VAR_UNSET:
18857: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
18858: /* break missing intentionally */
18859: case BP_VAR_IS:
18860: retval = &EG(uninitialized_zval_ptr);
18861: break;
18862: case BP_VAR_RW:
18863: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
18864: /* break missing intentionally */
18865: case BP_VAR_W:
18866: Z_ADDREF_P(&EG(uninitialized_zval));
18867: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
18868: break;
18869: EMPTY_SWITCH_DEFAULT_CASE()
18870: }
18871: }
18872: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
18873: case ZEND_FETCH_GLOBAL:
18874: if (IS_VAR != IS_TMP_VAR) {
18875: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18876: }
18877: break;
18878: case ZEND_FETCH_LOCAL:
18879: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18880: break;
18881: case ZEND_FETCH_STATIC:
18882: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
18883: break;
18884: case ZEND_FETCH_GLOBAL_LOCK:
18885: if (IS_VAR == IS_VAR && !free_op1.var) {
18886: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
18887: }
18888: break;
18889: }
18890: }
18891:
18892:
18893: if (IS_VAR != IS_CONST && varname == &tmp_varname) {
18894: zval_dtor(&tmp_varname);
18895: }
18896: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
18897: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
18898: }
18899: PZVAL_LOCK(*retval);
18900: switch (type) {
18901: case BP_VAR_R:
18902: case BP_VAR_IS:
18903: AI_SET_PTR(&EX_T(opline->result.var), *retval);
18904: break;
18905: case BP_VAR_UNSET: {
18906: zend_free_op free_res;
18907:
18908: PZVAL_UNLOCK(*retval, &free_res);
18909: if (retval != &EG(uninitialized_zval_ptr)) {
18910: SEPARATE_ZVAL_IF_NOT_REF(retval);
18911: }
18912: PZVAL_LOCK(*retval);
18913: FREE_OP_VAR_PTR(free_res);
18914: }
18915: /* break missing intentionally */
18916: default:
18917: EX_T(opline->result.var).var.ptr_ptr = retval;
18918: break;
18919: }
18920: CHECK_EXCEPTION();
18921: ZEND_VM_NEXT_OPCODE();
18922: }
18923:
18924: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18925: {
18926: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18927: }
18928:
18929: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18930: {
18931: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18932: }
18933:
18934: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18935: {
18936: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18937: }
18938:
18939: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18940: {
18941: USE_OPLINE
18942:
18943: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18944: }
18945:
18946: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18947: {
18948: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18949: }
18950:
18951: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18952: {
18953: return zend_fetch_var_address_helper_SPEC_VAR_UNUSED(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
18954: }
18955:
1.1 misho 18956: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18957: {
1.1.1.2 misho 18958: USE_OPLINE
1.1 misho 18959: zend_free_op free_op1;
1.1.1.2 misho 18960: zval **container;
18961:
18962: SAVE_OPLINE();
18963: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 18964:
1.1.1.2 misho 18965: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 18966: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
18967: }
1.1.1.2 misho 18968: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
1.1 misho 18969:
1.1.1.2 misho 18970: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
18971: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 18972: }
18973: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
18974:
18975: /* We are going to assign the result by reference */
1.1.1.2 misho 18976: if (UNEXPECTED(opline->extended_value != 0)) {
18977: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
18978:
18979: if (retval_ptr) {
18980: Z_DELREF_PP(retval_ptr);
18981: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
18982: Z_ADDREF_PP(retval_ptr);
18983: }
1.1 misho 18984: }
18985:
1.1.1.2 misho 18986: CHECK_EXCEPTION();
1.1 misho 18987: ZEND_VM_NEXT_OPCODE();
18988: }
18989:
18990: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
18991: {
1.1.1.2 misho 18992: USE_OPLINE
1.1 misho 18993: zend_free_op free_op1;
1.1.1.2 misho 18994: zval **container;
1.1 misho 18995:
1.1.1.2 misho 18996: SAVE_OPLINE();
18997: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
18998:
18999: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 19000: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
19001: }
1.1.1.2 misho 19002: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
1.1 misho 19003:
1.1.1.2 misho 19004: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
19005: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 19006: }
19007: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 19008: CHECK_EXCEPTION();
1.1 misho 19009: ZEND_VM_NEXT_OPCODE();
19010: }
19011:
19012: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19013: {
1.1.1.2 misho 19014: USE_OPLINE
1.1 misho 19015: zend_free_op free_op1;
19016:
1.1.1.2 misho 19017: SAVE_OPLINE();
19018:
19019: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 19020: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
! 19021:
1.1.1.2 misho 19022: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 19023: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
19024: }
1.1.1.2 misho 19025: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
19026: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
19027: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 19028: }
1.1.1.5 ! misho 19029:
! 19030: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 19031: } else {
1.1.1.5 ! misho 19032: zval *container;
! 19033:
1.1 misho 19034: if (IS_UNUSED == IS_UNUSED) {
19035: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
19036: }
1.1.1.5 ! misho 19037: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 19038: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
1.1 misho 19039:
1.1.1.5 ! misho 19040: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 19041: }
1.1.1.2 misho 19042: CHECK_EXCEPTION();
1.1 misho 19043: ZEND_VM_NEXT_OPCODE();
19044: }
19045:
19046: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19047: {
1.1.1.2 misho 19048: USE_OPLINE
1.1 misho 19049: zend_free_op free_op1;
1.1.1.2 misho 19050: zval **object_ptr;
1.1 misho 19051:
1.1.1.2 misho 19052: SAVE_OPLINE();
19053: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
19054:
19055: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 19056: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
19057: }
19058: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
19059:
19060: zval *property_name = NULL;
19061:
19062: if (0) {
19063: MAKE_REAL_ZVAL_PTR(property_name);
19064: }
1.1.1.2 misho 19065: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 19066: if (0) {
19067: zval_ptr_dtor(&property_name);
19068: } else {
19069:
19070: }
19071: } else {
19072: zend_free_op free_op_data1, free_op_data2;
19073: zval *value;
19074: zval *dim = NULL;
19075: zval **variable_ptr_ptr;
19076:
1.1.1.2 misho 19077: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W TSRMLS_CC);
19078:
19079: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
19080: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
19081: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
19082: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
19083: if (RETURN_VALUE_USED(opline)) {
19084: zval *retval;
1.1 misho 19085:
1.1.1.2 misho 19086: ALLOC_ZVAL(retval);
19087: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
19088: INIT_PZVAL(retval);
19089: AI_SET_PTR(&EX_T(opline->result.var), retval);
19090: }
19091: } else if (RETURN_VALUE_USED(opline)) {
19092: PZVAL_LOCK(&EG(uninitialized_zval));
19093: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
19094: }
19095: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
19096: if (IS_TMP_FREE(free_op_data1)) {
19097: zval_dtor(value);
19098: }
19099: if (RETURN_VALUE_USED(opline)) {
19100: PZVAL_LOCK(&EG(uninitialized_zval));
19101: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
19102: }
19103: } else {
19104: if ((opline+1)->op1_type == IS_TMP_VAR) {
19105: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
19106: } else if ((opline+1)->op1_type == IS_CONST) {
19107: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
19108: } else {
19109: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
19110: }
19111: if (RETURN_VALUE_USED(opline)) {
1.1 misho 19112: PZVAL_LOCK(value);
1.1.1.2 misho 19113: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 19114: }
19115: }
19116: FREE_OP_VAR_PTR(free_op_data2);
19117: FREE_OP_IF_VAR(free_op_data1);
19118: }
19119: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19120: /* assign_dim has two opcodes! */
1.1.1.2 misho 19121: CHECK_EXCEPTION();
1.1 misho 19122: ZEND_VM_INC_OPCODE();
19123: ZEND_VM_NEXT_OPCODE();
19124: }
19125:
19126: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19127: {
1.1.1.2 misho 19128: USE_OPLINE
1.1 misho 19129: zval *function_name;
19130: zend_class_entry *ce;
19131:
1.1.1.2 misho 19132: SAVE_OPLINE();
1.1 misho 19133: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
19134:
19135: if (IS_VAR == IS_CONST) {
19136: /* no function found. try a static method in class */
1.1.1.2 misho 19137: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
19138: ce = CACHED_PTR(opline->op1.literal->cache_slot);
19139: } else {
19140: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 19141: if (UNEXPECTED(EG(exception) != NULL)) {
19142: HANDLE_EXCEPTION();
19143: }
1.1.1.2 misho 19144: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 19145: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 19146: }
19147: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 19148: }
19149: EX(called_scope) = ce;
19150: } else {
1.1.1.2 misho 19151: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 19152:
1.1.1.2 misho 19153: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 19154: EX(called_scope) = EG(called_scope);
19155: } else {
19156: EX(called_scope) = ce;
19157: }
19158: }
1.1.1.2 misho 19159:
19160: if (IS_VAR == IS_CONST &&
19161: IS_UNUSED == IS_CONST &&
19162: CACHED_PTR(opline->op2.literal->cache_slot)) {
19163: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
19164: } else if (IS_VAR != IS_CONST &&
19165: IS_UNUSED == IS_CONST &&
19166: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
19167: /* do nothing */
19168: } else if (IS_UNUSED != IS_UNUSED) {
1.1 misho 19169: char *function_name_strval = NULL;
19170: int function_name_strlen = 0;
19171:
19172:
19173: if (IS_UNUSED == IS_CONST) {
1.1.1.2 misho 19174: function_name_strval = Z_STRVAL_P(opline->op2.zv);
19175: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 19176: } else {
19177: function_name = NULL;
19178:
1.1.1.2 misho 19179: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 19180: zend_error_noreturn(E_ERROR, "Function name must be a string");
19181: } else {
19182: function_name_strval = Z_STRVAL_P(function_name);
19183: function_name_strlen = Z_STRLEN_P(function_name);
19184: }
19185: }
19186:
19187: if (function_name_strval) {
19188: if (ce->get_static_method) {
19189: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
19190: } else {
1.1.1.2 misho 19191: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_UNUSED == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 19192: }
1.1.1.2 misho 19193: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 19194: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
19195: }
1.1.1.2 misho 19196: if (IS_UNUSED == IS_CONST &&
19197: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
19198: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
19199: if (IS_VAR == IS_CONST) {
19200: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
19201: } else {
19202: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
19203: }
19204: }
1.1 misho 19205: }
19206: if (IS_UNUSED != IS_CONST) {
19207:
19208: }
19209: } else {
1.1.1.2 misho 19210: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 19211: zend_error_noreturn(E_ERROR, "Cannot call constructor");
19212: }
19213: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 19214: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 19215: }
19216: EX(fbc) = ce->constructor;
19217: }
19218:
19219: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
19220: EX(object) = NULL;
19221: } else {
19222: if (EG(This) &&
19223: Z_OBJ_HT_P(EG(This))->get_class_entry &&
19224: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
19225: /* We are calling method of the other (incompatible) class,
19226: but passing $this. This is done for compatibility with php-4. */
19227: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 19228: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 19229: } else {
19230: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 19231: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 19232: }
19233: }
19234: if ((EX(object) = EG(This))) {
19235: Z_ADDREF_P(EX(object));
19236: EX(called_scope) = Z_OBJCE_P(EX(object));
19237: }
19238: }
19239:
1.1.1.2 misho 19240: CHECK_EXCEPTION();
1.1 misho 19241: ZEND_VM_NEXT_OPCODE();
19242: }
19243:
19244: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19245: {
1.1.1.2 misho 19246: USE_OPLINE
1.1 misho 19247: zend_free_op free_op1;
19248: zval *expr_ptr;
19249:
1.1.1.2 misho 19250: SAVE_OPLINE();
19251: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
19252: zval **expr_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 19253:
1.1.1.2 misho 19254: if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
19255: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
19256: }
19257: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 19258: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 19259: Z_ADDREF_P(expr_ptr);
1.1 misho 19260: } else {
1.1.1.2 misho 19261: expr_ptr=_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
19262: if (0) { /* temporary variable */
19263: zval *new_expr;
1.1 misho 19264:
1.1.1.2 misho 19265: ALLOC_ZVAL(new_expr);
19266: INIT_PZVAL_COPY(new_expr, expr_ptr);
19267: expr_ptr = new_expr;
19268: } else if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 19269: zval *new_expr;
19270:
19271: ALLOC_ZVAL(new_expr);
19272: INIT_PZVAL_COPY(new_expr, expr_ptr);
19273: expr_ptr = new_expr;
19274: zendi_zval_copy_ctor(*expr_ptr);
19275: } else {
19276: Z_ADDREF_P(expr_ptr);
19277: }
19278: }
1.1.1.2 misho 19279:
19280: if (IS_UNUSED != IS_UNUSED) {
19281:
19282: zval *offset = NULL;
19283: ulong hval;
19284:
1.1 misho 19285: switch (Z_TYPE_P(offset)) {
19286: case IS_DOUBLE:
1.1.1.2 misho 19287: hval = zend_dval_to_lval(Z_DVAL_P(offset));
19288: goto num_index;
1.1 misho 19289: case IS_LONG:
19290: case IS_BOOL:
1.1.1.2 misho 19291: hval = Z_LVAL_P(offset);
19292: num_index:
19293: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 19294: break;
19295: case IS_STRING:
1.1.1.2 misho 19296: if (IS_UNUSED == IS_CONST) {
19297: hval = Z_HASH_P(offset);
19298: } else {
19299: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
19300: if (IS_INTERNED(Z_STRVAL_P(offset))) {
19301: hval = INTERNED_HASH(Z_STRVAL_P(offset));
19302: } else {
19303: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
19304: }
19305: }
19306: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 19307: break;
19308: case IS_NULL:
1.1.1.2 misho 19309: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 19310: break;
19311: default:
19312: zend_error(E_WARNING, "Illegal offset type");
19313: zval_ptr_dtor(&expr_ptr);
19314: /* do nothing */
19315: break;
19316: }
1.1.1.2 misho 19317:
19318: } else {
19319: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
19320: }
19321: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
19322: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19323: } else {
19324: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19325: }
19326: CHECK_EXCEPTION();
19327: ZEND_VM_NEXT_OPCODE();
19328: }
19329:
19330: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19331: {
19332: USE_OPLINE
19333:
19334: array_init(&EX_T(opline->result.var).tmp_var);
19335: if (IS_VAR == IS_UNUSED) {
19336: ZEND_VM_NEXT_OPCODE();
19337: #if 0 || IS_VAR != IS_UNUSED
19338: } else {
19339: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
19340: #endif
19341: }
19342: }
19343:
19344: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19345: {
19346: USE_OPLINE
19347: zval tmp, *varname;
19348: HashTable *target_symbol_table;
19349: zend_free_op free_op1;
19350:
19351: SAVE_OPLINE();
19352: if (IS_VAR == IS_CV &&
19353: IS_UNUSED == IS_UNUSED &&
19354: (opline->extended_value & ZEND_QUICK_SET)) {
19355: if (EG(active_symbol_table)) {
19356: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
19357:
19358: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
19359: EX_CV(opline->op1.var) = NULL;
19360: } else if (EX_CV(opline->op1.var)) {
19361: zval_ptr_dtor(EX_CV(opline->op1.var));
19362: EX_CV(opline->op1.var) = NULL;
19363: }
19364: CHECK_EXCEPTION();
19365: ZEND_VM_NEXT_OPCODE();
19366: }
19367:
19368: varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
19369:
19370: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
19371: ZVAL_COPY_VALUE(&tmp, varname);
19372: zval_copy_ctor(&tmp);
19373: convert_to_string(&tmp);
19374: varname = &tmp;
19375: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
19376: Z_ADDREF_P(varname);
19377: }
19378:
19379: if (IS_UNUSED != IS_UNUSED) {
19380: zend_class_entry *ce;
19381:
19382: if (IS_UNUSED == IS_CONST) {
19383: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
19384: ce = CACHED_PTR(opline->op2.literal->cache_slot);
19385: } else {
19386: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 19387: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 19388: if (IS_VAR != IS_CONST && varname == &tmp) {
19389: zval_dtor(&tmp);
19390: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
19391: zval_ptr_dtor(&varname);
19392: }
19393: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.4 misho 19394: HANDLE_EXCEPTION();
19395: }
19396: if (UNEXPECTED(ce == NULL)) {
19397: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 19398: }
19399: CACHE_PTR(opline->op2.literal->cache_slot, ce);
19400: }
19401: } else {
19402: ce = EX_T(opline->op2.var).class_entry;
19403: }
19404: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
19405: } else {
19406: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
19407:
19408: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
19409: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
19410: }
19411:
19412: if (IS_VAR != IS_CONST && varname == &tmp) {
19413: zval_dtor(&tmp);
19414: } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
19415: zval_ptr_dtor(&varname);
19416: }
19417: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19418: CHECK_EXCEPTION();
19419: ZEND_VM_NEXT_OPCODE();
19420: }
19421:
19422: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19423: {
19424: USE_OPLINE
19425: zval **value;
19426: zend_bool isset = 1;
19427:
19428: SAVE_OPLINE();
19429: if (IS_VAR == IS_CV &&
19430: IS_UNUSED == IS_UNUSED &&
19431: (opline->extended_value & ZEND_QUICK_SET)) {
19432: if (EX_CV(opline->op1.var)) {
19433: value = EX_CV(opline->op1.var);
19434: } else if (EG(active_symbol_table)) {
19435: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
19436:
19437: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
19438: isset = 0;
19439: }
19440: } else {
19441: isset = 0;
19442: }
19443: } else {
19444: HashTable *target_symbol_table;
19445: zend_free_op free_op1;
19446: zval tmp, *varname = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
19447:
19448: if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
19449: ZVAL_COPY_VALUE(&tmp, varname);
19450: zval_copy_ctor(&tmp);
19451: convert_to_string(&tmp);
19452: varname = &tmp;
19453: }
19454:
19455: if (IS_UNUSED != IS_UNUSED) {
19456: zend_class_entry *ce;
19457:
19458: if (IS_UNUSED == IS_CONST) {
19459: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
19460: ce = CACHED_PTR(opline->op2.literal->cache_slot);
19461: } else {
19462: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
19463: if (UNEXPECTED(ce == NULL)) {
19464: CHECK_EXCEPTION();
19465: ZEND_VM_NEXT_OPCODE();
19466: }
19467: CACHE_PTR(opline->op2.literal->cache_slot, ce);
19468: }
19469: } else {
19470: ce = EX_T(opline->op2.var).class_entry;
19471: }
19472: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_VAR == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
19473: if (!value) {
19474: isset = 0;
19475: }
19476: } else {
19477: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
19478: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
19479: isset = 0;
19480: }
19481: }
19482:
19483: if (IS_VAR != IS_CONST && varname == &tmp) {
19484: zval_dtor(&tmp);
19485: }
1.1 misho 19486: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19487: }
1.1.1.2 misho 19488:
19489: if (opline->extended_value & ZEND_ISSET) {
19490: if (isset && Z_TYPE_PP(value) != IS_NULL) {
19491: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
19492: } else {
19493: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
19494: }
19495: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
19496: if (!isset || !i_zend_is_true(*value)) {
19497: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
19498: } else {
19499: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
19500: }
19501: }
19502:
19503: CHECK_EXCEPTION();
1.1 misho 19504: ZEND_VM_NEXT_OPCODE();
19505: }
19506:
1.1.1.2 misho 19507: static int ZEND_FASTCALL ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 19508: {
1.1.1.2 misho 19509: USE_OPLINE
19510: zval *var_ptr, *new_zv;
1.1 misho 19511:
1.1.1.2 misho 19512: SAVE_OPLINE();
19513: var_ptr = EX_T(opline->op1.var).var.ptr;
19514: if (Z_TYPE_P(var_ptr) != IS_OBJECT &&
19515: !PZVAL_IS_REF(var_ptr) &&
19516: Z_REFCOUNT_P(var_ptr) > 1) {
19517:
19518: Z_DELREF_P(var_ptr);
19519: ALLOC_ZVAL(new_zv);
19520: INIT_PZVAL_COPY(new_zv, var_ptr);
19521: var_ptr = new_zv;
19522: zval_copy_ctor(var_ptr);
19523: EX_T(opline->op1.var).var.ptr = var_ptr;
1.1 misho 19524: }
1.1.1.2 misho 19525: ZEND_VM_NEXT_OPCODE();
1.1 misho 19526: }
19527:
19528: static int ZEND_FASTCALL ZEND_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19529: {
1.1.1.2 misho 19530: USE_OPLINE
1.1 misho 19531: zend_free_op free_op1;
19532:
1.1.1.2 misho 19533: SAVE_OPLINE();
19534: fast_add_function(&EX_T(opline->result.var).tmp_var,
19535: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19536: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19537: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19538:
1.1.1.2 misho 19539: CHECK_EXCEPTION();
1.1 misho 19540: ZEND_VM_NEXT_OPCODE();
19541: }
19542:
19543: static int ZEND_FASTCALL ZEND_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19544: {
1.1.1.2 misho 19545: USE_OPLINE
1.1 misho 19546: zend_free_op free_op1;
19547:
1.1.1.2 misho 19548: SAVE_OPLINE();
19549: fast_sub_function(&EX_T(opline->result.var).tmp_var,
19550: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19551: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19552: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19553:
1.1.1.2 misho 19554: CHECK_EXCEPTION();
1.1 misho 19555: ZEND_VM_NEXT_OPCODE();
19556: }
19557:
19558: static int ZEND_FASTCALL ZEND_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19559: {
1.1.1.2 misho 19560: USE_OPLINE
1.1 misho 19561: zend_free_op free_op1;
19562:
1.1.1.2 misho 19563: SAVE_OPLINE();
19564: fast_mul_function(&EX_T(opline->result.var).tmp_var,
19565: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19566: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19567: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19568:
1.1.1.2 misho 19569: CHECK_EXCEPTION();
1.1 misho 19570: ZEND_VM_NEXT_OPCODE();
19571: }
19572:
19573: static int ZEND_FASTCALL ZEND_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19574: {
1.1.1.2 misho 19575: USE_OPLINE
1.1 misho 19576: zend_free_op free_op1;
19577:
1.1.1.2 misho 19578: SAVE_OPLINE();
19579: fast_div_function(&EX_T(opline->result.var).tmp_var,
19580: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19581: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19582: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19583:
1.1.1.2 misho 19584: CHECK_EXCEPTION();
1.1 misho 19585: ZEND_VM_NEXT_OPCODE();
19586: }
19587:
19588: static int ZEND_FASTCALL ZEND_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19589: {
1.1.1.2 misho 19590: USE_OPLINE
1.1 misho 19591: zend_free_op free_op1;
19592:
1.1.1.2 misho 19593: SAVE_OPLINE();
19594: fast_mod_function(&EX_T(opline->result.var).tmp_var,
19595: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19596: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19597: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19598:
1.1.1.2 misho 19599: CHECK_EXCEPTION();
1.1 misho 19600: ZEND_VM_NEXT_OPCODE();
19601: }
19602:
19603: static int ZEND_FASTCALL ZEND_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19604: {
1.1.1.2 misho 19605: USE_OPLINE
1.1 misho 19606: zend_free_op free_op1;
19607:
1.1.1.2 misho 19608: SAVE_OPLINE();
19609: shift_left_function(&EX_T(opline->result.var).tmp_var,
19610: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19611: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19612: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19613:
1.1.1.2 misho 19614: CHECK_EXCEPTION();
1.1 misho 19615: ZEND_VM_NEXT_OPCODE();
19616: }
19617:
19618: static int ZEND_FASTCALL ZEND_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19619: {
1.1.1.2 misho 19620: USE_OPLINE
1.1 misho 19621: zend_free_op free_op1;
19622:
1.1.1.2 misho 19623: SAVE_OPLINE();
19624: shift_right_function(&EX_T(opline->result.var).tmp_var,
19625: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19626: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19627: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19628:
1.1.1.2 misho 19629: CHECK_EXCEPTION();
1.1 misho 19630: ZEND_VM_NEXT_OPCODE();
19631: }
19632:
19633: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19634: {
1.1.1.2 misho 19635: USE_OPLINE
1.1 misho 19636: zend_free_op free_op1;
19637:
1.1.1.2 misho 19638: SAVE_OPLINE();
19639: concat_function(&EX_T(opline->result.var).tmp_var,
19640: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19641: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19642: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19643:
1.1.1.2 misho 19644: CHECK_EXCEPTION();
1.1 misho 19645: ZEND_VM_NEXT_OPCODE();
19646: }
19647:
19648: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19649: {
1.1.1.2 misho 19650: USE_OPLINE
1.1 misho 19651: zend_free_op free_op1;
19652:
1.1.1.2 misho 19653: SAVE_OPLINE();
19654: is_identical_function(&EX_T(opline->result.var).tmp_var,
19655: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19656: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19657: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19658:
1.1.1.2 misho 19659: CHECK_EXCEPTION();
1.1 misho 19660: ZEND_VM_NEXT_OPCODE();
19661: }
19662:
19663: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19664: {
1.1.1.2 misho 19665: USE_OPLINE
1.1 misho 19666: zend_free_op free_op1;
1.1.1.2 misho 19667: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 19668:
1.1.1.2 misho 19669: SAVE_OPLINE();
1.1 misho 19670: is_identical_function(result,
1.1.1.2 misho 19671: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19672: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19673: Z_LVAL_P(result) = !Z_LVAL_P(result);
19674: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19675:
1.1.1.2 misho 19676: CHECK_EXCEPTION();
1.1 misho 19677: ZEND_VM_NEXT_OPCODE();
19678: }
19679:
19680: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19681: {
1.1.1.2 misho 19682: USE_OPLINE
1.1 misho 19683: zend_free_op free_op1;
1.1.1.2 misho 19684: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 19685:
1.1.1.2 misho 19686: SAVE_OPLINE();
19687: ZVAL_BOOL(result, fast_equal_function(result,
19688: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19689: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 19690: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19691:
1.1.1.2 misho 19692: CHECK_EXCEPTION();
1.1 misho 19693: ZEND_VM_NEXT_OPCODE();
19694: }
19695:
19696: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19697: {
1.1.1.2 misho 19698: USE_OPLINE
1.1 misho 19699: zend_free_op free_op1;
1.1.1.2 misho 19700: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 19701:
1.1.1.2 misho 19702: SAVE_OPLINE();
19703: ZVAL_BOOL(result, fast_not_equal_function(result,
19704: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19705: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 19706: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19707:
1.1.1.2 misho 19708: CHECK_EXCEPTION();
1.1 misho 19709: ZEND_VM_NEXT_OPCODE();
19710: }
19711:
19712: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19713: {
1.1.1.2 misho 19714: USE_OPLINE
1.1 misho 19715: zend_free_op free_op1;
1.1.1.2 misho 19716: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 19717:
1.1.1.2 misho 19718: SAVE_OPLINE();
19719: ZVAL_BOOL(result, fast_is_smaller_function(result,
19720: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19721: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 19722: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19723:
1.1.1.2 misho 19724: CHECK_EXCEPTION();
1.1 misho 19725: ZEND_VM_NEXT_OPCODE();
19726: }
19727:
19728: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19729: {
1.1.1.2 misho 19730: USE_OPLINE
1.1 misho 19731: zend_free_op free_op1;
1.1.1.2 misho 19732: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 19733:
1.1.1.2 misho 19734: SAVE_OPLINE();
19735: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
19736: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19737: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 19738: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19739:
1.1.1.2 misho 19740: CHECK_EXCEPTION();
1.1 misho 19741: ZEND_VM_NEXT_OPCODE();
19742: }
19743:
19744: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19745: {
1.1.1.2 misho 19746: USE_OPLINE
1.1 misho 19747: zend_free_op free_op1;
19748:
1.1.1.2 misho 19749: SAVE_OPLINE();
19750: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
19751: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19752: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19753: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19754:
1.1.1.2 misho 19755: CHECK_EXCEPTION();
1.1 misho 19756: ZEND_VM_NEXT_OPCODE();
19757: }
19758:
19759: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19760: {
1.1.1.2 misho 19761: USE_OPLINE
1.1 misho 19762: zend_free_op free_op1;
19763:
1.1.1.2 misho 19764: SAVE_OPLINE();
19765: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
19766: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19767: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19768: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19769:
1.1.1.2 misho 19770: CHECK_EXCEPTION();
1.1 misho 19771: ZEND_VM_NEXT_OPCODE();
19772: }
19773:
19774: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19775: {
1.1.1.2 misho 19776: USE_OPLINE
1.1 misho 19777: zend_free_op free_op1;
19778:
1.1.1.2 misho 19779: SAVE_OPLINE();
19780: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
19781: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19782: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19783: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19784:
1.1.1.2 misho 19785: CHECK_EXCEPTION();
1.1 misho 19786: ZEND_VM_NEXT_OPCODE();
19787: }
19788:
19789: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
19790: {
1.1.1.2 misho 19791: USE_OPLINE
1.1 misho 19792: zend_free_op free_op1;
19793:
1.1.1.2 misho 19794: SAVE_OPLINE();
19795: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
19796: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
19797: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 19798: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19799:
1.1.1.2 misho 19800: CHECK_EXCEPTION();
1.1 misho 19801: ZEND_VM_NEXT_OPCODE();
19802: }
19803:
19804: 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)
19805: {
1.1.1.2 misho 19806: USE_OPLINE
1.1 misho 19807: zend_free_op free_op1, free_op_data1;
1.1.1.2 misho 19808: zval **object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 19809: zval *object;
1.1.1.2 misho 19810: zval *property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
19811: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 19812: int have_get_ptr = 0;
19813:
1.1.1.2 misho 19814: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 19815: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
19816: }
19817:
19818: make_real_object(object_ptr TSRMLS_CC);
19819: object = *object_ptr;
19820:
1.1.1.2 misho 19821: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 19822: zend_error(E_WARNING, "Attempt to assign property of non-object");
19823:
19824: FREE_OP(free_op_data1);
19825:
1.1.1.2 misho 19826: if (RETURN_VALUE_USED(opline)) {
19827: PZVAL_LOCK(&EG(uninitialized_zval));
19828: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
19829: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 19830: }
19831: } else {
19832: /* here we are sure we are dealing with an object */
19833: if (0) {
19834: MAKE_REAL_ZVAL_PTR(property);
19835: }
19836:
19837: /* here property is a string */
19838: if (opline->extended_value == ZEND_ASSIGN_OBJ
19839: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 19840: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 19841: if (zptr != NULL) { /* NULL means no success in getting PTR */
19842: SEPARATE_ZVAL_IF_NOT_REF(zptr);
19843:
19844: have_get_ptr = 1;
19845: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 19846: if (RETURN_VALUE_USED(opline)) {
1.1 misho 19847: PZVAL_LOCK(*zptr);
1.1.1.2 misho 19848: EX_T(opline->result.var).var.ptr = *zptr;
19849: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 19850: }
19851: }
19852: }
19853:
19854: if (!have_get_ptr) {
19855: zval *z = NULL;
19856:
19857: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
19858: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 19859: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 19860: }
19861: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
19862: if (Z_OBJ_HT_P(object)->read_dimension) {
19863: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
19864: }
19865: }
19866: if (z) {
19867: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
19868: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
19869:
19870: if (Z_REFCOUNT_P(z) == 0) {
19871: GC_REMOVE_ZVAL_FROM_BUFFER(z);
19872: zval_dtor(z);
19873: FREE_ZVAL(z);
19874: }
19875: z = value;
19876: }
19877: Z_ADDREF_P(z);
19878: SEPARATE_ZVAL_IF_NOT_REF(&z);
19879: binary_op(z, z, value TSRMLS_CC);
19880: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 19881: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 19882: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
19883: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
19884: }
1.1.1.2 misho 19885: if (RETURN_VALUE_USED(opline)) {
1.1 misho 19886: PZVAL_LOCK(z);
1.1.1.2 misho 19887: EX_T(opline->result.var).var.ptr = z;
19888: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 19889: }
19890: zval_ptr_dtor(&z);
19891: } else {
19892: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 19893: if (RETURN_VALUE_USED(opline)) {
19894: PZVAL_LOCK(&EG(uninitialized_zval));
19895: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
19896: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 19897: }
19898: }
19899: }
19900:
19901: if (0) {
19902: zval_ptr_dtor(&property);
19903: } else {
19904:
19905: }
19906: FREE_OP(free_op_data1);
19907: }
19908:
19909: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19910: /* assign_obj has two opcodes! */
1.1.1.2 misho 19911: CHECK_EXCEPTION();
1.1 misho 19912: ZEND_VM_INC_OPCODE();
19913: ZEND_VM_NEXT_OPCODE();
19914: }
19915:
19916: 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)
19917: {
1.1.1.2 misho 19918: USE_OPLINE
1.1 misho 19919: zend_free_op free_op1, free_op_data2, free_op_data1;
19920: zval **var_ptr;
19921: zval *value;
19922:
1.1.1.2 misho 19923: SAVE_OPLINE();
1.1 misho 19924: switch (opline->extended_value) {
19925: case ZEND_ASSIGN_OBJ:
19926: return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
19927: break;
19928: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 19929: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 19930:
1.1.1.2 misho 19931: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 19932: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 19933: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 19934: if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
19935: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
19936: }
19937: return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
19938: } else {
1.1.1.2 misho 19939: zval *dim = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 19940:
1.1.1.2 misho 19941: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
19942: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
19943: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 19944: }
19945: }
19946: break;
19947: default:
1.1.1.2 misho 19948: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
19949: var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 19950: /* do nothing */
19951: break;
19952: }
19953:
1.1.1.2 misho 19954: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 19955: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
19956: }
19957:
1.1.1.2 misho 19958: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
19959: if (RETURN_VALUE_USED(opline)) {
19960: PZVAL_LOCK(&EG(uninitialized_zval));
19961: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 19962: }
19963:
19964: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 19965: CHECK_EXCEPTION();
19966: if (opline->extended_value == ZEND_ASSIGN_DIM) {
19967: ZEND_VM_INC_OPCODE();
19968: }
1.1 misho 19969: ZEND_VM_NEXT_OPCODE();
19970: }
19971:
19972: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
19973:
1.1.1.2 misho 19974: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
19975: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 19976: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
19977: /* proxy object */
19978: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
19979: Z_ADDREF_P(objval);
19980: binary_op(objval, objval, value TSRMLS_CC);
19981: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
19982: zval_ptr_dtor(&objval);
19983: } else {
19984: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
19985: }
19986:
1.1.1.2 misho 19987: if (RETURN_VALUE_USED(opline)) {
1.1 misho 19988: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 19989: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 19990: }
19991:
19992: if (opline->extended_value == ZEND_ASSIGN_DIM) {
19993: FREE_OP(free_op_data1);
19994: FREE_OP_VAR_PTR(free_op_data2);
1.1.1.2 misho 19995: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
19996: CHECK_EXCEPTION();
19997: ZEND_VM_INC_OPCODE();
19998: } else {
19999: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20000: CHECK_EXCEPTION();
1.1 misho 20001: }
20002: ZEND_VM_NEXT_OPCODE();
20003: }
20004:
20005: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20006: {
20007: return zend_binary_assign_op_helper_SPEC_VAR_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20008: }
20009:
20010: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20011: {
20012: return zend_binary_assign_op_helper_SPEC_VAR_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20013: }
20014:
20015: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20016: {
20017: return zend_binary_assign_op_helper_SPEC_VAR_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20018: }
20019:
20020: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20021: {
20022: return zend_binary_assign_op_helper_SPEC_VAR_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20023: }
20024:
20025: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20026: {
20027: return zend_binary_assign_op_helper_SPEC_VAR_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20028: }
20029:
20030: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20031: {
20032: return zend_binary_assign_op_helper_SPEC_VAR_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20033: }
20034:
20035: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20036: {
20037: return zend_binary_assign_op_helper_SPEC_VAR_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20038: }
20039:
20040: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20041: {
20042: return zend_binary_assign_op_helper_SPEC_VAR_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20043: }
20044:
20045: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20046: {
20047: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20048: }
20049:
20050: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20051: {
20052: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20053: }
20054:
20055: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20056: {
20057: return zend_binary_assign_op_helper_SPEC_VAR_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20058: }
20059:
20060: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
20061: {
1.1.1.2 misho 20062: USE_OPLINE
1.1 misho 20063: zend_free_op free_op1;
1.1.1.2 misho 20064: zval **object_ptr;
1.1 misho 20065: zval *object;
1.1.1.2 misho 20066: zval *property;
20067: zval **retval;
1.1 misho 20068: int have_get_ptr = 0;
20069:
1.1.1.2 misho 20070: SAVE_OPLINE();
20071: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20072: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20073: retval = &EX_T(opline->result.var).var.ptr;
20074:
20075: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 20076: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
20077: }
20078:
20079: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
20080: object = *object_ptr;
20081:
1.1.1.2 misho 20082: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 20083: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
20084:
1.1.1.2 misho 20085: if (RETURN_VALUE_USED(opline)) {
20086: PZVAL_LOCK(&EG(uninitialized_zval));
20087: *retval = &EG(uninitialized_zval);
1.1 misho 20088: }
20089: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20090: CHECK_EXCEPTION();
1.1 misho 20091: ZEND_VM_NEXT_OPCODE();
20092: }
20093:
20094: /* here we are sure we are dealing with an object */
20095:
20096: if (0) {
20097: MAKE_REAL_ZVAL_PTR(property);
20098: }
20099:
20100: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 20101: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20102: if (zptr != NULL) { /* NULL means no success in getting PTR */
20103: SEPARATE_ZVAL_IF_NOT_REF(zptr);
20104:
20105: have_get_ptr = 1;
20106: incdec_op(*zptr);
1.1.1.2 misho 20107: if (RETURN_VALUE_USED(opline)) {
1.1 misho 20108: *retval = *zptr;
20109: PZVAL_LOCK(*retval);
20110: }
20111: }
20112: }
20113:
20114: if (!have_get_ptr) {
20115: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 20116: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20117:
1.1.1.2 misho 20118: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 20119: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
20120:
20121: if (Z_REFCOUNT_P(z) == 0) {
20122: GC_REMOVE_ZVAL_FROM_BUFFER(z);
20123: zval_dtor(z);
20124: FREE_ZVAL(z);
20125: }
20126: z = value;
20127: }
20128: Z_ADDREF_P(z);
20129: SEPARATE_ZVAL_IF_NOT_REF(&z);
20130: incdec_op(z);
20131: *retval = z;
1.1.1.2 misho 20132: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
20133: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 20134: zval_ptr_dtor(&z);
20135: } else {
20136: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 20137: if (RETURN_VALUE_USED(opline)) {
20138: PZVAL_LOCK(&EG(uninitialized_zval));
20139: *retval = &EG(uninitialized_zval);
1.1 misho 20140: }
20141: }
20142: }
20143:
20144: if (0) {
20145: zval_ptr_dtor(&property);
20146: } else {
20147:
20148: }
20149: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20150: CHECK_EXCEPTION();
1.1 misho 20151: ZEND_VM_NEXT_OPCODE();
20152: }
20153:
20154: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20155: {
20156: return zend_pre_incdec_property_helper_SPEC_VAR_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20157: }
20158:
20159: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20160: {
20161: return zend_pre_incdec_property_helper_SPEC_VAR_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20162: }
20163:
20164: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
20165: {
1.1.1.2 misho 20166: USE_OPLINE
1.1 misho 20167: zend_free_op free_op1;
1.1.1.2 misho 20168: zval **object_ptr;
1.1 misho 20169: zval *object;
1.1.1.2 misho 20170: zval *property;
20171: zval *retval;
1.1 misho 20172: int have_get_ptr = 0;
20173:
1.1.1.2 misho 20174: SAVE_OPLINE();
20175: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20176: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20177: retval = &EX_T(opline->result.var).tmp_var;
20178:
20179: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 20180: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
20181: }
20182:
20183: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
20184: object = *object_ptr;
20185:
1.1.1.2 misho 20186: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 20187: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
20188:
1.1.1.2 misho 20189: ZVAL_NULL(retval);
1.1 misho 20190: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20191: CHECK_EXCEPTION();
1.1 misho 20192: ZEND_VM_NEXT_OPCODE();
20193: }
20194:
20195: /* here we are sure we are dealing with an object */
20196:
20197: if (0) {
20198: MAKE_REAL_ZVAL_PTR(property);
20199: }
20200:
20201: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 20202: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20203: if (zptr != NULL) { /* NULL means no success in getting PTR */
20204: have_get_ptr = 1;
20205: SEPARATE_ZVAL_IF_NOT_REF(zptr);
20206:
1.1.1.2 misho 20207: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 20208: zendi_zval_copy_ctor(*retval);
20209:
20210: incdec_op(*zptr);
20211:
20212: }
20213: }
20214:
20215: if (!have_get_ptr) {
20216: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 20217: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20218: zval *z_copy;
20219:
1.1.1.2 misho 20220: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 20221: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
20222:
20223: if (Z_REFCOUNT_P(z) == 0) {
20224: GC_REMOVE_ZVAL_FROM_BUFFER(z);
20225: zval_dtor(z);
20226: FREE_ZVAL(z);
20227: }
20228: z = value;
20229: }
1.1.1.2 misho 20230: ZVAL_COPY_VALUE(retval, z);
1.1 misho 20231: zendi_zval_copy_ctor(*retval);
20232: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 20233: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 20234: zendi_zval_copy_ctor(*z_copy);
20235: incdec_op(z_copy);
20236: Z_ADDREF_P(z);
1.1.1.2 misho 20237: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20238: zval_ptr_dtor(&z_copy);
20239: zval_ptr_dtor(&z);
20240: } else {
20241: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 20242: ZVAL_NULL(retval);
1.1 misho 20243: }
20244: }
20245:
20246: if (0) {
20247: zval_ptr_dtor(&property);
20248: } else {
20249:
20250: }
20251: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20252: CHECK_EXCEPTION();
1.1 misho 20253: ZEND_VM_NEXT_OPCODE();
20254: }
20255:
20256: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20257: {
20258: return zend_post_incdec_property_helper_SPEC_VAR_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20259: }
20260:
20261: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20262: {
20263: return zend_post_incdec_property_helper_SPEC_VAR_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20264: }
20265:
20266: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20267: {
1.1.1.2 misho 20268: USE_OPLINE
1.1 misho 20269: zend_free_op free_op1;
1.1.1.5 ! misho 20270: zval *container;
1.1 misho 20271:
1.1.1.2 misho 20272: SAVE_OPLINE();
20273:
1.1.1.5 ! misho 20274: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 20275: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 20276: }
1.1.1.5 ! misho 20277: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 20278: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
1.1 misho 20279:
20280: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20281: CHECK_EXCEPTION();
1.1 misho 20282: ZEND_VM_NEXT_OPCODE();
20283: }
20284:
20285: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20286: {
1.1.1.2 misho 20287: USE_OPLINE
1.1 misho 20288: zend_free_op free_op1;
1.1.1.2 misho 20289: zval **container;
1.1 misho 20290:
1.1.1.2 misho 20291: SAVE_OPLINE();
20292: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20293:
20294: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20295: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20296: }
1.1.1.2 misho 20297: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
1.1 misho 20298:
1.1.1.2 misho 20299: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20300: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20301: }
20302: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20303:
20304: /* We are going to assign the result by reference */
1.1.1.2 misho 20305: if (UNEXPECTED(opline->extended_value != 0)) {
20306: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
20307:
20308: if (retval_ptr) {
20309: Z_DELREF_PP(retval_ptr);
20310: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
20311: Z_ADDREF_PP(retval_ptr);
20312: }
1.1 misho 20313: }
20314:
1.1.1.2 misho 20315: CHECK_EXCEPTION();
1.1 misho 20316: ZEND_VM_NEXT_OPCODE();
20317: }
20318:
20319: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20320: {
1.1.1.2 misho 20321: USE_OPLINE
1.1 misho 20322: zend_free_op free_op1;
1.1.1.2 misho 20323: zval **container;
20324:
20325: SAVE_OPLINE();
20326: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20327:
1.1.1.2 misho 20328: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20329: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20330: }
1.1.1.2 misho 20331: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW TSRMLS_CC);
1.1 misho 20332:
1.1.1.2 misho 20333: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20334: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20335: }
20336: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20337: CHECK_EXCEPTION();
1.1 misho 20338: ZEND_VM_NEXT_OPCODE();
20339: }
20340:
20341: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20342: {
1.1.1.2 misho 20343: USE_OPLINE
1.1 misho 20344: zend_free_op free_op1;
1.1.1.5 ! misho 20345: zval *container;
1.1 misho 20346:
1.1.1.2 misho 20347: SAVE_OPLINE();
1.1.1.5 ! misho 20348: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 20349: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
1.1 misho 20350:
20351: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20352: CHECK_EXCEPTION();
1.1 misho 20353: ZEND_VM_NEXT_OPCODE();
20354: }
20355:
20356: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20357: {
1.1.1.2 misho 20358: USE_OPLINE
1.1 misho 20359: zend_free_op free_op1;
20360:
1.1.1.2 misho 20361: SAVE_OPLINE();
20362:
20363: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 20364: zval **container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
! 20365:
1.1.1.2 misho 20366: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20367: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20368: }
1.1.1.2 misho 20369: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
20370: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20371: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20372: }
1.1.1.5 ! misho 20373:
! 20374: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1 misho 20375: } else {
1.1.1.5 ! misho 20376: zval *container;
! 20377:
1.1 misho 20378: if (IS_CV == IS_UNUSED) {
20379: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
20380: }
1.1.1.5 ! misho 20381: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1.1.2 misho 20382: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
1.1 misho 20383:
1.1.1.5 ! misho 20384: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
! 20385: }
1.1.1.2 misho 20386: CHECK_EXCEPTION();
1.1 misho 20387: ZEND_VM_NEXT_OPCODE();
20388: }
20389:
20390: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20391: {
1.1.1.2 misho 20392: USE_OPLINE
1.1 misho 20393: zend_free_op free_op1;
1.1.1.2 misho 20394: zval **container;
20395:
20396: SAVE_OPLINE();
20397: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20398:
20399: if (IS_VAR == IS_CV) {
20400: if (container != &EG(uninitialized_zval_ptr)) {
20401: SEPARATE_ZVAL_IF_NOT_REF(container);
20402: }
20403: }
1.1.1.2 misho 20404: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20405: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20406: }
1.1.1.2 misho 20407: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 20408:
1.1.1.2 misho 20409: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20410: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20411: }
20412: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20413: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 20414: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
20415: } else {
20416: zend_free_op free_res;
1.1.1.2 misho 20417: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 20418:
1.1.1.2 misho 20419: PZVAL_UNLOCK(*retval_ptr, &free_res);
20420: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
20421: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 20422: }
1.1.1.2 misho 20423: PZVAL_LOCK(*retval_ptr);
1.1 misho 20424: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 20425: CHECK_EXCEPTION();
20426: ZEND_VM_NEXT_OPCODE();
1.1 misho 20427: }
20428: }
20429:
1.1.1.2 misho 20430: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 20431: {
1.1.1.2 misho 20432: USE_OPLINE
1.1 misho 20433: zend_free_op free_op1;
1.1.1.2 misho 20434: zval *container;
1.1 misho 20435:
1.1.1.2 misho 20436: zval *offset;
1.1 misho 20437:
1.1.1.2 misho 20438: SAVE_OPLINE();
20439: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20440: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20441:
20442: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
20443: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
20444: zend_error(E_NOTICE, "Trying to get property of non-object");
20445: PZVAL_LOCK(&EG(uninitialized_zval));
20446: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 20447:
20448: } else {
20449: zval *retval;
20450:
20451: if (0) {
20452: MAKE_REAL_ZVAL_PTR(offset);
20453: }
20454:
20455: /* here we are sure we are dealing with an object */
1.1.1.2 misho 20456: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20457:
1.1.1.2 misho 20458: PZVAL_LOCK(retval);
20459: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 20460:
20461: if (0) {
20462: zval_ptr_dtor(&offset);
20463: } else {
20464:
20465: }
20466: }
20467:
20468: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20469: CHECK_EXCEPTION();
1.1 misho 20470: ZEND_VM_NEXT_OPCODE();
20471: }
20472:
20473: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20474: {
1.1.1.2 misho 20475: return zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 20476: }
20477:
20478: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20479: {
1.1.1.2 misho 20480: USE_OPLINE
1.1 misho 20481: zend_free_op free_op1;
1.1.1.2 misho 20482: zval *property;
1.1 misho 20483: zval **container;
20484:
1.1.1.2 misho 20485: SAVE_OPLINE();
20486: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20487:
1.1 misho 20488: if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 20489: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
20490: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 20491: }
20492:
20493: if (0) {
20494: MAKE_REAL_ZVAL_PTR(property);
20495: }
1.1.1.2 misho 20496: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20497: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20498: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
20499: }
1.1.1.2 misho 20500:
20501: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 20502: if (0) {
20503: zval_ptr_dtor(&property);
20504: } else {
20505:
20506: }
1.1.1.2 misho 20507: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20508: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20509: }
20510: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20511:
20512: /* We are going to assign the result by reference */
20513: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 20514: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
20515:
20516: Z_DELREF_PP(retval_ptr);
20517: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
20518: Z_ADDREF_PP(retval_ptr);
20519: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
20520: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 20521: }
20522:
1.1.1.2 misho 20523: CHECK_EXCEPTION();
1.1 misho 20524: ZEND_VM_NEXT_OPCODE();
20525: }
20526:
20527: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20528: {
1.1.1.2 misho 20529: USE_OPLINE
1.1 misho 20530: zend_free_op free_op1;
1.1.1.2 misho 20531: zval *property;
20532: zval **container;
20533:
20534: SAVE_OPLINE();
20535: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20536: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20537:
20538: if (0) {
20539: MAKE_REAL_ZVAL_PTR(property);
20540: }
1.1.1.2 misho 20541: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20542: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
20543: }
1.1.1.2 misho 20544: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 20545: if (0) {
20546: zval_ptr_dtor(&property);
20547: } else {
20548:
20549: }
1.1.1.2 misho 20550: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20551: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20552: }
20553: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20554: CHECK_EXCEPTION();
1.1 misho 20555: ZEND_VM_NEXT_OPCODE();
20556: }
20557:
20558: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20559: {
1.1.1.2 misho 20560: USE_OPLINE
20561: zend_free_op free_op1;
20562: zval *container;
20563:
20564: zval *offset;
20565:
20566: SAVE_OPLINE();
20567: container = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20568: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20569:
20570: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
20571: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
20572: PZVAL_LOCK(&EG(uninitialized_zval));
20573: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
20574:
20575: } else {
20576: zval *retval;
20577:
20578: if (0) {
20579: MAKE_REAL_ZVAL_PTR(offset);
20580: }
20581:
20582: /* here we are sure we are dealing with an object */
20583: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
20584:
20585: PZVAL_LOCK(retval);
20586: AI_SET_PTR(&EX_T(opline->result.var), retval);
20587:
20588: if (0) {
20589: zval_ptr_dtor(&offset);
20590: } else {
20591:
20592: }
20593: }
20594:
20595: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20596: CHECK_EXCEPTION();
20597: ZEND_VM_NEXT_OPCODE();
1.1 misho 20598: }
20599:
20600: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20601: {
1.1.1.2 misho 20602: USE_OPLINE
1.1 misho 20603:
1.1.1.2 misho 20604: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 20605: /* Behave like FETCH_OBJ_W */
20606: zend_free_op free_op1;
1.1.1.2 misho 20607: zval *property;
20608: zval **container;
20609:
20610: SAVE_OPLINE();
20611: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20612: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20613:
20614: if (0) {
20615: MAKE_REAL_ZVAL_PTR(property);
20616: }
1.1.1.2 misho 20617: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20618: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
20619: }
1.1.1.2 misho 20620: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 20621: if (0) {
20622: zval_ptr_dtor(&property);
20623: } else {
20624:
20625: }
1.1.1.2 misho 20626: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20627: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20628: }
20629: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
1.1.1.2 misho 20630: CHECK_EXCEPTION();
1.1 misho 20631: ZEND_VM_NEXT_OPCODE();
20632: } else {
1.1.1.2 misho 20633: return zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 20634: }
20635: }
20636:
20637: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20638: {
1.1.1.2 misho 20639: USE_OPLINE
1.1 misho 20640: zend_free_op free_op1, free_res;
1.1.1.2 misho 20641: zval **container;
20642: zval *property;
20643:
20644: SAVE_OPLINE();
20645: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20646: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20647:
20648: if (IS_VAR == IS_CV) {
20649: if (container != &EG(uninitialized_zval_ptr)) {
20650: SEPARATE_ZVAL_IF_NOT_REF(container);
20651: }
20652: }
20653: if (0) {
20654: MAKE_REAL_ZVAL_PTR(property);
20655: }
1.1.1.2 misho 20656: if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 20657: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
20658: }
1.1.1.2 misho 20659: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 20660: if (0) {
20661: zval_ptr_dtor(&property);
20662: } else {
20663:
20664: }
1.1.1.2 misho 20665: if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
20666: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 20667: }
20668: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20669:
1.1.1.2 misho 20670: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
20671: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
20672: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 20673: }
1.1.1.2 misho 20674: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 20675: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 20676: CHECK_EXCEPTION();
1.1 misho 20677: ZEND_VM_NEXT_OPCODE();
20678: }
20679:
20680: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20681: {
1.1.1.2 misho 20682: USE_OPLINE
1.1 misho 20683: zend_free_op free_op1;
1.1.1.2 misho 20684: zval **object_ptr;
20685: zval *property_name;
20686:
20687: SAVE_OPLINE();
20688: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20689: property_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20690:
20691: if (0) {
20692: MAKE_REAL_ZVAL_PTR(property_name);
20693: }
1.1.1.2 misho 20694: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 20695: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20696: }
1.1.1.2 misho 20697: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20698: if (0) {
20699: zval_ptr_dtor(&property_name);
20700: } else {
20701:
20702: }
20703: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20704: /* assign_obj has two opcodes! */
1.1.1.2 misho 20705: CHECK_EXCEPTION();
1.1 misho 20706: ZEND_VM_INC_OPCODE();
20707: ZEND_VM_NEXT_OPCODE();
20708: }
20709:
20710: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20711: {
1.1.1.2 misho 20712: USE_OPLINE
1.1 misho 20713: zend_free_op free_op1;
1.1.1.2 misho 20714: zval **object_ptr;
20715:
20716: SAVE_OPLINE();
20717: object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20718:
1.1.1.2 misho 20719: if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 20720: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
20721: }
20722: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
20723:
1.1.1.2 misho 20724: zval *property_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20725:
20726: if (0) {
20727: MAKE_REAL_ZVAL_PTR(property_name);
20728: }
1.1.1.2 misho 20729: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 20730: if (0) {
20731: zval_ptr_dtor(&property_name);
20732: } else {
20733:
20734: }
20735: } else {
20736: zend_free_op free_op_data1, free_op_data2;
20737: zval *value;
1.1.1.2 misho 20738: zval *dim = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20739: zval **variable_ptr_ptr;
20740:
1.1.1.2 misho 20741: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W TSRMLS_CC);
1.1 misho 20742:
1.1.1.2 misho 20743: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
20744: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
20745: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
20746: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
20747: if (RETURN_VALUE_USED(opline)) {
20748: zval *retval;
20749:
20750: ALLOC_ZVAL(retval);
20751: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
20752: INIT_PZVAL(retval);
20753: AI_SET_PTR(&EX_T(opline->result.var), retval);
20754: }
20755: } else if (RETURN_VALUE_USED(opline)) {
20756: PZVAL_LOCK(&EG(uninitialized_zval));
20757: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
20758: }
20759: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
20760: if (IS_TMP_FREE(free_op_data1)) {
20761: zval_dtor(value);
20762: }
20763: if (RETURN_VALUE_USED(opline)) {
20764: PZVAL_LOCK(&EG(uninitialized_zval));
20765: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
20766: }
20767: } else {
20768: if ((opline+1)->op1_type == IS_TMP_VAR) {
20769: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20770: } else if ((opline+1)->op1_type == IS_CONST) {
20771: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20772: } else {
20773: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20774: }
20775: if (RETURN_VALUE_USED(opline)) {
1.1 misho 20776: PZVAL_LOCK(value);
1.1.1.2 misho 20777: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 20778: }
20779: }
20780: FREE_OP_VAR_PTR(free_op_data2);
20781: FREE_OP_IF_VAR(free_op_data1);
20782: }
20783: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20784: /* assign_dim has two opcodes! */
1.1.1.2 misho 20785: CHECK_EXCEPTION();
1.1 misho 20786: ZEND_VM_INC_OPCODE();
20787: ZEND_VM_NEXT_OPCODE();
20788: }
20789:
20790: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20791: {
1.1.1.2 misho 20792: USE_OPLINE
1.1 misho 20793: zend_free_op free_op1;
1.1.1.2 misho 20794: zval *value;
20795: zval **variable_ptr_ptr;
1.1 misho 20796:
1.1.1.2 misho 20797: SAVE_OPLINE();
20798: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
20799: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20800:
20801: if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
20802: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_CV TSRMLS_CC)) {
20803: if (RETURN_VALUE_USED(opline)) {
20804: zval *retval;
20805:
20806: ALLOC_ZVAL(retval);
20807: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
20808: INIT_PZVAL(retval);
20809: AI_SET_PTR(&EX_T(opline->result.var), retval);
20810: }
20811: } else if (RETURN_VALUE_USED(opline)) {
20812: PZVAL_LOCK(&EG(uninitialized_zval));
20813: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
20814: }
20815: } else if (IS_VAR == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
20816: if (0) {
20817: zval_dtor(value);
20818: }
20819: if (RETURN_VALUE_USED(opline)) {
20820: PZVAL_LOCK(&EG(uninitialized_zval));
20821: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
20822: }
20823: } else {
20824: if (IS_CV == IS_TMP_VAR) {
20825: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20826: } else if (IS_CV == IS_CONST) {
20827: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20828: } else {
20829: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
20830: }
20831: if (RETURN_VALUE_USED(opline)) {
1.1 misho 20832: PZVAL_LOCK(value);
1.1.1.2 misho 20833: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 20834: }
20835: }
20836:
20837: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20838:
20839: /* zend_assign_to_variable() always takes care of op2, never free it! */
20840:
1.1.1.2 misho 20841: CHECK_EXCEPTION();
1.1 misho 20842: ZEND_VM_NEXT_OPCODE();
20843: }
20844:
20845: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20846: {
1.1.1.2 misho 20847: USE_OPLINE
1.1 misho 20848: zend_free_op free_op1, free_op2;
20849: zval **variable_ptr_ptr;
1.1.1.2 misho 20850: zval **value_ptr_ptr;
20851:
20852: SAVE_OPLINE();
20853: value_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20854:
20855: if (IS_CV == IS_VAR &&
20856: value_ptr_ptr &&
20857: !Z_ISREF_PP(value_ptr_ptr) &&
20858: opline->extended_value == ZEND_RETURNS_FUNCTION &&
1.1.1.2 misho 20859: !EX_T(opline->op2.var).var.fcall_returned_reference) {
1.1 misho 20860: if (free_op2.var == NULL) {
20861: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
20862: }
20863: zend_error(E_STRICT, "Only variables should be assigned by reference");
20864: if (UNEXPECTED(EG(exception) != NULL)) {
20865:
1.1.1.2 misho 20866: HANDLE_EXCEPTION();
1.1 misho 20867: }
20868: return ZEND_ASSIGN_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
20869: } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
20870: PZVAL_LOCK(*value_ptr_ptr);
20871: }
1.1.1.2 misho 20872: if (IS_VAR == IS_VAR && UNEXPECTED(EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr)) {
1.1 misho 20873: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
20874: }
20875:
1.1.1.2 misho 20876: variable_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
20877: if ((IS_CV == IS_VAR && UNEXPECTED(value_ptr_ptr == NULL)) ||
20878: (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL))) {
1.1 misho 20879: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
20880: }
20881: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
20882:
20883: if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
20884: Z_DELREF_PP(variable_ptr_ptr);
20885: }
20886:
1.1.1.2 misho 20887: if (RETURN_VALUE_USED(opline)) {
1.1 misho 20888: PZVAL_LOCK(*variable_ptr_ptr);
1.1.1.2 misho 20889: AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr);
1.1 misho 20890: }
20891:
20892: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20893:
1.1.1.2 misho 20894: CHECK_EXCEPTION();
1.1 misho 20895: ZEND_VM_NEXT_OPCODE();
20896: }
20897:
20898: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20899: {
1.1.1.2 misho 20900: USE_OPLINE
1.1 misho 20901: zval *function_name;
20902: char *function_name_strval;
20903: int function_name_strlen;
20904: zend_free_op free_op1;
20905:
1.1.1.2 misho 20906: SAVE_OPLINE();
1.1 misho 20907: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
20908:
1.1.1.2 misho 20909: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 20910:
1.1.1.2 misho 20911: if (IS_CV != IS_CONST &&
20912: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 20913: zend_error_noreturn(E_ERROR, "Method name must be a string");
20914: }
20915:
20916: function_name_strval = Z_STRVAL_P(function_name);
20917: function_name_strlen = Z_STRLEN_P(function_name);
20918:
1.1.1.2 misho 20919: EX(object) = _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 20920:
1.1.1.2 misho 20921: if (EXPECTED(EX(object) != NULL) &&
20922: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
20923: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 20924:
1.1.1.2 misho 20925: if (IS_CV != IS_CONST ||
20926: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
20927: zval *object = EX(object);
20928:
20929: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
20930: zend_error_noreturn(E_ERROR, "Object does not support method calls");
20931: }
20932:
20933: /* First, locate the function. */
20934: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
20935: if (UNEXPECTED(EX(fbc) == NULL)) {
20936: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
20937: }
20938: if (IS_CV == IS_CONST &&
20939: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
20940: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
20941: EXPECTED(EX(object) == object)) {
20942: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
20943: }
1.1 misho 20944: }
20945: } else {
20946: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
20947: }
20948:
20949: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
20950: EX(object) = NULL;
20951: } else {
20952: if (!PZVAL_IS_REF(EX(object))) {
20953: Z_ADDREF_P(EX(object)); /* For $this pointer */
20954: } else {
20955: zval *this_ptr;
20956: ALLOC_ZVAL(this_ptr);
20957: INIT_PZVAL_COPY(this_ptr, EX(object));
20958: zval_copy_ctor(this_ptr);
20959: EX(object) = this_ptr;
20960: }
20961: }
20962:
20963: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
20964:
1.1.1.2 misho 20965: CHECK_EXCEPTION();
1.1 misho 20966: ZEND_VM_NEXT_OPCODE();
20967: }
20968:
20969: static int ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
20970: {
1.1.1.2 misho 20971: USE_OPLINE
1.1 misho 20972: zval *function_name;
20973: zend_class_entry *ce;
20974:
1.1.1.2 misho 20975: SAVE_OPLINE();
1.1 misho 20976: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
20977:
20978: if (IS_VAR == IS_CONST) {
20979: /* no function found. try a static method in class */
1.1.1.2 misho 20980: if (CACHED_PTR(opline->op1.literal->cache_slot)) {
20981: ce = CACHED_PTR(opline->op1.literal->cache_slot);
20982: } else {
20983: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 20984: if (UNEXPECTED(EG(exception) != NULL)) {
20985: HANDLE_EXCEPTION();
20986: }
1.1.1.2 misho 20987: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 20988: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 20989: }
20990: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 20991: }
20992: EX(called_scope) = ce;
20993: } else {
1.1.1.2 misho 20994: ce = EX_T(opline->op1.var).class_entry;
1.1 misho 20995:
1.1.1.2 misho 20996: if (opline->extended_value == ZEND_FETCH_CLASS_PARENT || opline->extended_value == ZEND_FETCH_CLASS_SELF) {
1.1 misho 20997: EX(called_scope) = EG(called_scope);
20998: } else {
20999: EX(called_scope) = ce;
21000: }
21001: }
1.1.1.2 misho 21002:
21003: if (IS_VAR == IS_CONST &&
21004: IS_CV == IS_CONST &&
21005: CACHED_PTR(opline->op2.literal->cache_slot)) {
21006: EX(fbc) = CACHED_PTR(opline->op2.literal->cache_slot);
21007: } else if (IS_VAR != IS_CONST &&
21008: IS_CV == IS_CONST &&
21009: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce))) {
21010: /* do nothing */
21011: } else if (IS_CV != IS_UNUSED) {
1.1 misho 21012: char *function_name_strval = NULL;
21013: int function_name_strlen = 0;
21014:
21015:
21016: if (IS_CV == IS_CONST) {
1.1.1.2 misho 21017: function_name_strval = Z_STRVAL_P(opline->op2.zv);
21018: function_name_strlen = Z_STRLEN_P(opline->op2.zv);
1.1 misho 21019: } else {
1.1.1.2 misho 21020: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 21021:
1.1.1.2 misho 21022: if (UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 21023: zend_error_noreturn(E_ERROR, "Function name must be a string");
21024: } else {
21025: function_name_strval = Z_STRVAL_P(function_name);
21026: function_name_strlen = Z_STRLEN_P(function_name);
21027: }
21028: }
21029:
21030: if (function_name_strval) {
21031: if (ce->get_static_method) {
21032: EX(fbc) = ce->get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
21033: } else {
1.1.1.2 misho 21034: EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
1.1 misho 21035: }
1.1.1.2 misho 21036: if (UNEXPECTED(EX(fbc) == NULL)) {
1.1 misho 21037: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", ce->name, function_name_strval);
21038: }
1.1.1.2 misho 21039: if (IS_CV == IS_CONST &&
21040: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
21041: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0)) {
21042: if (IS_VAR == IS_CONST) {
21043: CACHE_PTR(opline->op2.literal->cache_slot, EX(fbc));
21044: } else {
21045: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, EX(fbc));
21046: }
21047: }
1.1 misho 21048: }
21049: if (IS_CV != IS_CONST) {
21050:
21051: }
21052: } else {
1.1.1.2 misho 21053: if (UNEXPECTED(ce->constructor == NULL)) {
1.1 misho 21054: zend_error_noreturn(E_ERROR, "Cannot call constructor");
21055: }
21056: if (EG(This) && Z_OBJCE_P(EG(This)) != ce->constructor->common.scope && (ce->constructor->common.fn_flags & ZEND_ACC_PRIVATE)) {
1.1.1.2 misho 21057: zend_error_noreturn(E_ERROR, "Cannot call private %s::__construct()", ce->name);
1.1 misho 21058: }
21059: EX(fbc) = ce->constructor;
21060: }
21061:
21062: if (EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) {
21063: EX(object) = NULL;
21064: } else {
21065: if (EG(This) &&
21066: Z_OBJ_HT_P(EG(This))->get_class_entry &&
21067: !instanceof_function(Z_OBJCE_P(EG(This)), ce TSRMLS_CC)) {
21068: /* We are calling method of the other (incompatible) class,
21069: but passing $this. This is done for compatibility with php-4. */
21070: if (EX(fbc)->common.fn_flags & ZEND_ACC_ALLOW_STATIC) {
1.1.1.2 misho 21071: zend_error(E_STRICT, "Non-static method %s::%s() should not be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 21072: } else {
21073: /* An internal function assumes $this is present and won't check that. So PHP would crash by allowing the call. */
1.1.1.2 misho 21074: zend_error_noreturn(E_ERROR, "Non-static method %s::%s() cannot be called statically, assuming $this from incompatible context", EX(fbc)->common.scope->name, EX(fbc)->common.function_name);
1.1 misho 21075: }
21076: }
21077: if ((EX(object) = EG(This))) {
21078: Z_ADDREF_P(EX(object));
21079: EX(called_scope) = Z_OBJCE_P(EX(object));
21080: }
21081: }
21082:
1.1.1.2 misho 21083: CHECK_EXCEPTION();
1.1 misho 21084: ZEND_VM_NEXT_OPCODE();
21085: }
21086:
21087: static int ZEND_FASTCALL ZEND_CASE_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21088: {
1.1.1.2 misho 21089: USE_OPLINE
1.1 misho 21090: zend_free_op free_op1;
21091:
1.1.1.2 misho 21092: SAVE_OPLINE();
1.1 misho 21093: if (IS_VAR==IS_VAR) {
1.1.1.2 misho 21094: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 21095: }
1.1.1.2 misho 21096: is_equal_function(&EX_T(opline->result.var).tmp_var,
21097: _get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC),
21098: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
21099:
21100: CHECK_EXCEPTION();
1.1 misho 21101: ZEND_VM_NEXT_OPCODE();
21102: }
21103:
21104: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21105: {
1.1.1.2 misho 21106: USE_OPLINE
1.1 misho 21107: zend_free_op free_op1;
21108: zval *expr_ptr;
21109:
1.1.1.2 misho 21110: SAVE_OPLINE();
21111: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
21112: zval **expr_ptr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 21113:
1.1.1.2 misho 21114: if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
21115: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
21116: }
21117: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 21118: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 21119: Z_ADDREF_P(expr_ptr);
1.1 misho 21120: } else {
1.1.1.2 misho 21121: expr_ptr=_get_zval_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
21122: if (0) { /* temporary variable */
21123: zval *new_expr;
1.1 misho 21124:
1.1.1.2 misho 21125: ALLOC_ZVAL(new_expr);
21126: INIT_PZVAL_COPY(new_expr, expr_ptr);
21127: expr_ptr = new_expr;
21128: } else if (IS_VAR == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 21129: zval *new_expr;
21130:
21131: ALLOC_ZVAL(new_expr);
21132: INIT_PZVAL_COPY(new_expr, expr_ptr);
21133: expr_ptr = new_expr;
21134: zendi_zval_copy_ctor(*expr_ptr);
21135: } else {
21136: Z_ADDREF_P(expr_ptr);
21137: }
21138: }
1.1.1.2 misho 21139:
21140: if (IS_CV != IS_UNUSED) {
21141:
21142: zval *offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
21143: ulong hval;
21144:
1.1 misho 21145: switch (Z_TYPE_P(offset)) {
21146: case IS_DOUBLE:
1.1.1.2 misho 21147: hval = zend_dval_to_lval(Z_DVAL_P(offset));
21148: goto num_index;
1.1 misho 21149: case IS_LONG:
21150: case IS_BOOL:
1.1.1.2 misho 21151: hval = Z_LVAL_P(offset);
21152: num_index:
21153: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 21154: break;
21155: case IS_STRING:
1.1.1.2 misho 21156: if (IS_CV == IS_CONST) {
21157: hval = Z_HASH_P(offset);
21158: } else {
21159: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
21160: if (IS_INTERNED(Z_STRVAL_P(offset))) {
21161: hval = INTERNED_HASH(Z_STRVAL_P(offset));
21162: } else {
21163: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
21164: }
21165: }
21166: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 21167: break;
21168: case IS_NULL:
1.1.1.2 misho 21169: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 21170: break;
21171: default:
21172: zend_error(E_WARNING, "Illegal offset type");
21173: zval_ptr_dtor(&expr_ptr);
21174: /* do nothing */
21175: break;
21176: }
21177:
21178: } else {
1.1.1.2 misho 21179: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 21180: }
1.1.1.2 misho 21181: if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && opline->extended_value) {
1.1 misho 21182: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
21183: } else {
21184: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
21185: }
1.1.1.2 misho 21186: CHECK_EXCEPTION();
1.1 misho 21187: ZEND_VM_NEXT_OPCODE();
21188: }
21189:
21190: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21191: {
1.1.1.2 misho 21192: USE_OPLINE
1.1 misho 21193:
1.1.1.2 misho 21194: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 21195: if (IS_VAR == IS_UNUSED) {
21196: ZEND_VM_NEXT_OPCODE();
21197: #if 0 || IS_VAR != IS_UNUSED
21198: } else {
21199: return ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21200: #endif
21201: }
21202: }
21203:
21204: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21205: {
1.1.1.2 misho 21206: USE_OPLINE
1.1 misho 21207: zend_free_op free_op1;
1.1.1.2 misho 21208: zval **container;
1.1 misho 21209: zval *offset;
1.1.1.2 misho 21210: ulong hval;
1.1 misho 21211:
1.1.1.2 misho 21212: SAVE_OPLINE();
21213: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 21214: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
21215: SEPARATE_ZVAL_IF_NOT_REF(container);
21216: }
1.1.1.2 misho 21217: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 21218:
21219: if (IS_VAR != IS_VAR || container) {
21220: switch (Z_TYPE_PP(container)) {
21221: case IS_ARRAY: {
21222: HashTable *ht = Z_ARRVAL_PP(container);
21223:
21224: switch (Z_TYPE_P(offset)) {
21225: case IS_DOUBLE:
1.1.1.2 misho 21226: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 21227: zend_hash_index_del(ht, hval);
21228: break;
1.1 misho 21229: case IS_RESOURCE:
21230: case IS_BOOL:
21231: case IS_LONG:
1.1.1.2 misho 21232: hval = Z_LVAL_P(offset);
21233: zend_hash_index_del(ht, hval);
1.1 misho 21234: break;
21235: case IS_STRING:
21236: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
21237: Z_ADDREF_P(offset);
21238: }
1.1.1.2 misho 21239: if (IS_CV == IS_CONST) {
21240: hval = Z_HASH_P(offset);
21241: } else {
21242: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
21243: if (IS_INTERNED(Z_STRVAL_P(offset))) {
21244: hval = INTERNED_HASH(Z_STRVAL_P(offset));
21245: } else {
21246: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 21247: }
21248: }
1.1.1.2 misho 21249: if (ht == &EG(symbol_table)) {
21250: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
21251: } else {
21252: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
21253: }
21254: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
21255: zval_ptr_dtor(&offset);
21256: }
21257: break;
21258: num_index_dim:
21259: zend_hash_index_del(ht, hval);
1.1 misho 21260: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
21261: zval_ptr_dtor(&offset);
21262: }
21263: break;
21264: case IS_NULL:
21265: zend_hash_del(ht, "", sizeof(""));
21266: break;
21267: default:
21268: zend_error(E_WARNING, "Illegal offset type in unset");
21269: break;
21270: }
21271:
21272: break;
21273: }
21274: case IS_OBJECT:
1.1.1.2 misho 21275: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 21276: zend_error_noreturn(E_ERROR, "Cannot use object as array");
21277: }
21278: if (0) {
21279: MAKE_REAL_ZVAL_PTR(offset);
21280: }
21281: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
21282: if (0) {
21283: zval_ptr_dtor(&offset);
21284: } else {
21285:
21286: }
21287: break;
21288: case IS_STRING:
21289: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
21290: ZEND_VM_CONTINUE(); /* bailed out before */
21291: default:
21292:
21293: break;
21294: }
21295: } else {
21296:
21297: }
21298: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
21299:
1.1.1.2 misho 21300: CHECK_EXCEPTION();
1.1 misho 21301: ZEND_VM_NEXT_OPCODE();
21302: }
21303:
21304: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21305: {
1.1.1.2 misho 21306: USE_OPLINE
1.1 misho 21307: zend_free_op free_op1;
1.1.1.2 misho 21308: zval **container;
21309: zval *offset;
21310:
21311: SAVE_OPLINE();
21312: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
21313: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 21314:
21315: if (IS_VAR != IS_VAR || container) {
21316: if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
21317: SEPARATE_ZVAL_IF_NOT_REF(container);
21318: }
21319: if (Z_TYPE_PP(container) == IS_OBJECT) {
21320: if (0) {
21321: MAKE_REAL_ZVAL_PTR(offset);
21322: }
21323: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 21324: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21325: } else {
21326: zend_error(E_NOTICE, "Trying to unset property of non-object");
21327: }
21328: if (0) {
21329: zval_ptr_dtor(&offset);
21330: } else {
21331:
21332: }
21333: } else {
21334:
21335: }
21336: } else {
21337:
21338: }
21339: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
21340:
1.1.1.2 misho 21341: CHECK_EXCEPTION();
1.1 misho 21342: ZEND_VM_NEXT_OPCODE();
21343: }
21344:
21345: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
21346: {
1.1.1.2 misho 21347: USE_OPLINE
1.1 misho 21348: zend_free_op free_op1;
1.1.1.2 misho 21349: zval **container;
1.1 misho 21350: zval **value = NULL;
21351: int result = 0;
1.1.1.2 misho 21352: ulong hval;
21353: zval *offset;
1.1 misho 21354:
1.1.1.2 misho 21355: SAVE_OPLINE();
21356: container = _get_zval_ptr_ptr_var(opline->op1.var, EX_Ts(), &free_op1 TSRMLS_CC);
1.1 misho 21357:
1.1.1.2 misho 21358: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 21359:
1.1.1.2 misho 21360: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
21361: HashTable *ht;
21362: int isset = 0;
1.1 misho 21363:
1.1.1.2 misho 21364: ht = Z_ARRVAL_PP(container);
1.1 misho 21365:
1.1.1.2 misho 21366: switch (Z_TYPE_P(offset)) {
21367: case IS_DOUBLE:
21368: hval = zend_dval_to_lval(Z_DVAL_P(offset));
21369: goto num_index_prop;
21370: case IS_RESOURCE:
21371: case IS_BOOL:
21372: case IS_LONG:
21373: hval = Z_LVAL_P(offset);
21374: num_index_prop:
21375: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
21376: isset = 1;
21377: }
21378: break;
21379: case IS_STRING:
21380: if (IS_CV == IS_CONST) {
21381: hval = Z_HASH_P(offset);
21382: } else {
21383: if (!prop_dim) {
21384: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 21385: }
1.1.1.2 misho 21386: if (IS_INTERNED(Z_STRVAL_P(offset))) {
21387: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 21388: } else {
1.1.1.2 misho 21389: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 21390: }
21391: }
1.1.1.2 misho 21392: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
21393: isset = 1;
21394: }
21395: break;
21396: case IS_NULL:
21397: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
21398: isset = 1;
1.1 misho 21399: }
1.1.1.2 misho 21400: break;
21401: default:
21402: zend_error(E_WARNING, "Illegal offset type in isset or empty");
21403: break;
21404: }
21405:
21406: if (opline->extended_value & ZEND_ISSET) {
21407: if (isset && Z_TYPE_PP(value) == IS_NULL) {
21408: result = 0;
21409: } else {
21410: result = isset;
1.1 misho 21411: }
1.1.1.2 misho 21412: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
21413: if (!isset || !i_zend_is_true(*value)) {
21414: result = 0;
1.1 misho 21415: } else {
1.1.1.2 misho 21416: result = 1;
21417: }
21418: }
1.1 misho 21419:
1.1.1.2 misho 21420: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
21421: if (0) {
21422: MAKE_REAL_ZVAL_PTR(offset);
21423: }
21424: if (prop_dim) {
21425: if (Z_OBJ_HT_P(*container)->has_property) {
21426: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
21427: } else {
21428: zend_error(E_NOTICE, "Trying to check property of non-object");
21429: result = 0;
21430: }
21431: } else {
21432: if (Z_OBJ_HT_P(*container)->has_dimension) {
21433: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
21434: } else {
21435: zend_error(E_NOTICE, "Trying to check element of non-array");
21436: result = 0;
1.1 misho 21437: }
1.1.1.2 misho 21438: }
21439: if (0) {
21440: zval_ptr_dtor(&offset);
21441: } else {
21442:
21443: }
21444: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
21445: zval tmp;
1.1 misho 21446:
1.1.1.2 misho 21447: if (Z_TYPE_P(offset) != IS_LONG) {
21448: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
21449: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
21450: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
21451: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 21452: zval_copy_ctor(&tmp);
21453: convert_to_long(&tmp);
21454: offset = &tmp;
1.1.1.2 misho 21455: } else {
21456: /* can not be converted to proper offset, return "not set" */
21457: result = 0;
1.1 misho 21458: }
1.1.1.2 misho 21459: }
21460: if (Z_TYPE_P(offset) == IS_LONG) {
21461: if (opline->extended_value & ZEND_ISSET) {
21462: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
21463: result = 1;
21464: }
21465: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
21466: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
21467: result = 1;
1.1 misho 21468: }
21469: }
1.1.1.2 misho 21470: }
1.1 misho 21471:
1.1.1.2 misho 21472: } else {
1.1 misho 21473:
21474: }
21475:
1.1.1.2 misho 21476: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
21477: if (opline->extended_value & ZEND_ISSET) {
21478: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
21479: } else {
21480: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 21481: }
21482:
21483: if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
21484:
1.1.1.2 misho 21485: CHECK_EXCEPTION();
1.1 misho 21486: ZEND_VM_NEXT_OPCODE();
21487: }
21488:
21489: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21490: {
21491: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21492: }
21493:
21494: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21495: {
21496: return zend_isset_isempty_dim_prop_obj_handler_SPEC_VAR_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21497: }
21498:
21499: static int ZEND_FASTCALL ZEND_CLONE_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21500: {
1.1.1.2 misho 21501: USE_OPLINE
1.1 misho 21502:
1.1.1.2 misho 21503: zval *obj;
1.1 misho 21504: zend_class_entry *ce;
21505: zend_function *clone;
21506: zend_object_clone_obj_t clone_call;
21507:
1.1.1.2 misho 21508: SAVE_OPLINE();
21509: obj = _get_obj_zval_ptr_unused(TSRMLS_C);
21510:
1.1 misho 21511: if (IS_UNUSED == IS_CONST ||
1.1.1.2 misho 21512: UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
1.1 misho 21513: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
21514: }
21515:
21516: ce = Z_OBJCE_P(obj);
21517: clone = ce ? ce->clone : NULL;
21518: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
1.1.1.2 misho 21519: if (UNEXPECTED(clone_call == NULL)) {
1.1 misho 21520: if (ce) {
21521: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
21522: } else {
21523: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
21524: }
21525: }
21526:
21527: if (ce && clone) {
21528: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
21529: /* Ensure that if we're calling a private function, we're allowed to do so.
21530: */
1.1.1.2 misho 21531: if (UNEXPECTED(ce != EG(scope))) {
1.1 misho 21532: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
21533: }
21534: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
21535: /* Ensure that if we're calling a protected function, we're allowed to do so.
21536: */
1.1.1.3 misho 21537: if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
1.1 misho 21538: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
21539: }
21540: }
21541: }
21542:
1.1.1.2 misho 21543: if (EXPECTED(EG(exception) == NULL)) {
21544: zval *retval;
21545:
21546: ALLOC_ZVAL(retval);
21547: Z_OBJVAL_P(retval) = clone_call(obj TSRMLS_CC);
21548: Z_TYPE_P(retval) = IS_OBJECT;
21549: Z_SET_REFCOUNT_P(retval, 1);
21550: Z_SET_ISREF_P(retval);
21551: if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
21552: zval_ptr_dtor(&retval);
21553: } else {
21554: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 21555: }
21556: }
21557:
1.1.1.2 misho 21558: CHECK_EXCEPTION();
1.1 misho 21559: ZEND_VM_NEXT_OPCODE();
21560: }
21561:
21562: static int ZEND_FASTCALL ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21563: {
21564: #if 0 || (IS_UNUSED != IS_UNUSED)
1.1.1.2 misho 21565: USE_OPLINE
21566:
21567: SAVE_OPLINE();
1.1 misho 21568: if (IS_UNUSED != IS_UNUSED) {
21569:
21570: zval *ptr = NULL;
21571:
21572: if (Z_TYPE_P(ptr) == IS_LONG) {
21573: EG(exit_status) = Z_LVAL_P(ptr);
21574: } else {
21575: zend_print_variable(ptr);
21576: }
21577:
21578: }
21579: #endif
21580: zend_bailout();
1.1.1.2 misho 21581: ZEND_VM_NEXT_OPCODE(); /* Never reached */
1.1 misho 21582: }
21583:
21584: 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)
21585: {
1.1.1.2 misho 21586: USE_OPLINE
1.1 misho 21587: zend_free_op free_op_data1;
21588: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
21589: zval *object;
1.1.1.2 misho 21590: zval *property = opline->op2.zv;
21591: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 21592: int have_get_ptr = 0;
21593:
1.1.1.2 misho 21594: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 21595: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
21596: }
21597:
21598: make_real_object(object_ptr TSRMLS_CC);
21599: object = *object_ptr;
21600:
1.1.1.2 misho 21601: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 21602: zend_error(E_WARNING, "Attempt to assign property of non-object");
21603:
21604: FREE_OP(free_op_data1);
21605:
1.1.1.2 misho 21606: if (RETURN_VALUE_USED(opline)) {
21607: PZVAL_LOCK(&EG(uninitialized_zval));
21608: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
21609: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 21610: }
21611: } else {
21612: /* here we are sure we are dealing with an object */
21613: if (0) {
21614: MAKE_REAL_ZVAL_PTR(property);
21615: }
21616:
21617: /* here property is a string */
21618: if (opline->extended_value == ZEND_ASSIGN_OBJ
21619: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 21620: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21621: if (zptr != NULL) { /* NULL means no success in getting PTR */
21622: SEPARATE_ZVAL_IF_NOT_REF(zptr);
21623:
21624: have_get_ptr = 1;
21625: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 21626: if (RETURN_VALUE_USED(opline)) {
1.1 misho 21627: PZVAL_LOCK(*zptr);
1.1.1.2 misho 21628: EX_T(opline->result.var).var.ptr = *zptr;
21629: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 21630: }
21631: }
21632: }
21633:
21634: if (!have_get_ptr) {
21635: zval *z = NULL;
21636:
21637: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
21638: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 21639: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21640: }
21641: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
21642: if (Z_OBJ_HT_P(object)->read_dimension) {
21643: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
21644: }
21645: }
21646: if (z) {
21647: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
21648: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
21649:
21650: if (Z_REFCOUNT_P(z) == 0) {
21651: GC_REMOVE_ZVAL_FROM_BUFFER(z);
21652: zval_dtor(z);
21653: FREE_ZVAL(z);
21654: }
21655: z = value;
21656: }
21657: Z_ADDREF_P(z);
21658: SEPARATE_ZVAL_IF_NOT_REF(&z);
21659: binary_op(z, z, value TSRMLS_CC);
21660: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 21661: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21662: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
21663: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
21664: }
1.1.1.2 misho 21665: if (RETURN_VALUE_USED(opline)) {
1.1 misho 21666: PZVAL_LOCK(z);
1.1.1.2 misho 21667: EX_T(opline->result.var).var.ptr = z;
21668: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 21669: }
21670: zval_ptr_dtor(&z);
21671: } else {
21672: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 21673: if (RETURN_VALUE_USED(opline)) {
21674: PZVAL_LOCK(&EG(uninitialized_zval));
21675: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
21676: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 21677: }
21678: }
21679: }
21680:
21681: if (0) {
21682: zval_ptr_dtor(&property);
21683: } else {
21684:
21685: }
21686: FREE_OP(free_op_data1);
21687: }
21688:
21689: /* assign_obj has two opcodes! */
1.1.1.2 misho 21690: CHECK_EXCEPTION();
1.1 misho 21691: ZEND_VM_INC_OPCODE();
21692: ZEND_VM_NEXT_OPCODE();
21693: }
21694:
21695: 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)
21696: {
1.1.1.2 misho 21697: USE_OPLINE
1.1 misho 21698: zend_free_op free_op_data2, free_op_data1;
21699: zval **var_ptr;
21700: zval *value;
21701:
1.1.1.2 misho 21702: SAVE_OPLINE();
1.1 misho 21703: switch (opline->extended_value) {
21704: case ZEND_ASSIGN_OBJ:
21705: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21706: break;
21707: case ZEND_ASSIGN_DIM: {
21708: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
21709:
1.1.1.2 misho 21710: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 21711: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 21712: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 21713: if (IS_UNUSED == IS_VAR && !0) {
21714: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
21715: }
21716: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21717: } else {
1.1.1.2 misho 21718: zval *dim = opline->op2.zv;
1.1 misho 21719:
1.1.1.2 misho 21720: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
21721: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
21722: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 21723: }
21724: }
21725: break;
21726: default:
1.1.1.2 misho 21727: value = opline->op2.zv;
1.1 misho 21728: var_ptr = NULL;
21729: /* do nothing */
21730: break;
21731: }
21732:
1.1.1.2 misho 21733: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 21734: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
21735: }
21736:
1.1.1.2 misho 21737: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
21738: if (RETURN_VALUE_USED(opline)) {
21739: PZVAL_LOCK(&EG(uninitialized_zval));
21740: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 21741: }
21742:
21743:
1.1.1.2 misho 21744: CHECK_EXCEPTION();
21745: if (opline->extended_value == ZEND_ASSIGN_DIM) {
21746: ZEND_VM_INC_OPCODE();
21747: }
1.1 misho 21748: ZEND_VM_NEXT_OPCODE();
21749: }
21750:
21751: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
21752:
1.1.1.2 misho 21753: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
21754: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 21755: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
21756: /* proxy object */
21757: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
21758: Z_ADDREF_P(objval);
21759: binary_op(objval, objval, value TSRMLS_CC);
21760: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
21761: zval_ptr_dtor(&objval);
21762: } else {
21763: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
21764: }
21765:
1.1.1.2 misho 21766: if (RETURN_VALUE_USED(opline)) {
1.1 misho 21767: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 21768: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 21769: }
21770:
21771: if (opline->extended_value == ZEND_ASSIGN_DIM) {
21772: FREE_OP(free_op_data1);
21773: FREE_OP_VAR_PTR(free_op_data2);
21774:
1.1.1.2 misho 21775: CHECK_EXCEPTION();
21776: ZEND_VM_INC_OPCODE();
21777: } else {
21778:
21779: CHECK_EXCEPTION();
21780: }
1.1 misho 21781: ZEND_VM_NEXT_OPCODE();
21782: }
21783:
21784: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21785: {
21786: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21787: }
21788:
21789: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21790: {
21791: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21792: }
21793:
21794: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21795: {
21796: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21797: }
21798:
21799: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21800: {
21801: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21802: }
21803:
21804: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21805: {
21806: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21807: }
21808:
21809: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21810: {
21811: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21812: }
21813:
21814: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21815: {
21816: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21817: }
21818:
21819: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21820: {
21821: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21822: }
21823:
21824: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21825: {
21826: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21827: }
21828:
21829: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21830: {
21831: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21832: }
21833:
21834: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21835: {
21836: return zend_binary_assign_op_helper_SPEC_UNUSED_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21837: }
21838:
21839: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
21840: {
1.1.1.2 misho 21841: USE_OPLINE
1.1 misho 21842:
1.1.1.2 misho 21843: zval **object_ptr;
1.1 misho 21844: zval *object;
1.1.1.2 misho 21845: zval *property;
21846: zval **retval;
1.1 misho 21847: int have_get_ptr = 0;
21848:
1.1.1.2 misho 21849: SAVE_OPLINE();
21850: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
21851: property = opline->op2.zv;
21852: retval = &EX_T(opline->result.var).var.ptr;
21853:
21854: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 21855: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
21856: }
21857:
21858: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
21859: object = *object_ptr;
21860:
1.1.1.2 misho 21861: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 21862: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
21863:
1.1.1.2 misho 21864: if (RETURN_VALUE_USED(opline)) {
21865: PZVAL_LOCK(&EG(uninitialized_zval));
21866: *retval = &EG(uninitialized_zval);
1.1 misho 21867: }
21868:
1.1.1.2 misho 21869: CHECK_EXCEPTION();
1.1 misho 21870: ZEND_VM_NEXT_OPCODE();
21871: }
21872:
21873: /* here we are sure we are dealing with an object */
21874:
21875: if (0) {
21876: MAKE_REAL_ZVAL_PTR(property);
21877: }
21878:
21879: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 21880: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21881: if (zptr != NULL) { /* NULL means no success in getting PTR */
21882: SEPARATE_ZVAL_IF_NOT_REF(zptr);
21883:
21884: have_get_ptr = 1;
21885: incdec_op(*zptr);
1.1.1.2 misho 21886: if (RETURN_VALUE_USED(opline)) {
1.1 misho 21887: *retval = *zptr;
21888: PZVAL_LOCK(*retval);
21889: }
21890: }
21891: }
21892:
21893: if (!have_get_ptr) {
21894: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 21895: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21896:
1.1.1.2 misho 21897: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 21898: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
21899:
21900: if (Z_REFCOUNT_P(z) == 0) {
21901: GC_REMOVE_ZVAL_FROM_BUFFER(z);
21902: zval_dtor(z);
21903: FREE_ZVAL(z);
21904: }
21905: z = value;
21906: }
21907: Z_ADDREF_P(z);
21908: SEPARATE_ZVAL_IF_NOT_REF(&z);
21909: incdec_op(z);
21910: *retval = z;
1.1.1.2 misho 21911: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
21912: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 21913: zval_ptr_dtor(&z);
21914: } else {
21915: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 21916: if (RETURN_VALUE_USED(opline)) {
21917: PZVAL_LOCK(&EG(uninitialized_zval));
21918: *retval = &EG(uninitialized_zval);
1.1 misho 21919: }
21920: }
21921: }
21922:
21923: if (0) {
21924: zval_ptr_dtor(&property);
21925: } else {
21926:
21927: }
21928:
1.1.1.2 misho 21929: CHECK_EXCEPTION();
1.1 misho 21930: ZEND_VM_NEXT_OPCODE();
21931: }
21932:
21933: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21934: {
21935: return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21936: }
21937:
21938: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
21939: {
21940: return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
21941: }
21942:
21943: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
21944: {
1.1.1.2 misho 21945: USE_OPLINE
1.1 misho 21946:
1.1.1.2 misho 21947: zval **object_ptr;
1.1 misho 21948: zval *object;
1.1.1.2 misho 21949: zval *property;
21950: zval *retval;
1.1 misho 21951: int have_get_ptr = 0;
21952:
1.1.1.2 misho 21953: SAVE_OPLINE();
21954: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
21955: property = opline->op2.zv;
21956: retval = &EX_T(opline->result.var).tmp_var;
21957:
21958: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 21959: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
21960: }
21961:
21962: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
21963: object = *object_ptr;
21964:
1.1.1.2 misho 21965: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 21966: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
21967:
1.1.1.2 misho 21968: ZVAL_NULL(retval);
1.1 misho 21969:
1.1.1.2 misho 21970: CHECK_EXCEPTION();
1.1 misho 21971: ZEND_VM_NEXT_OPCODE();
21972: }
21973:
21974: /* here we are sure we are dealing with an object */
21975:
21976: if (0) {
21977: MAKE_REAL_ZVAL_PTR(property);
21978: }
21979:
21980: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 21981: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21982: if (zptr != NULL) { /* NULL means no success in getting PTR */
21983: have_get_ptr = 1;
21984: SEPARATE_ZVAL_IF_NOT_REF(zptr);
21985:
1.1.1.2 misho 21986: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 21987: zendi_zval_copy_ctor(*retval);
21988:
21989: incdec_op(*zptr);
21990:
21991: }
21992: }
21993:
21994: if (!have_get_ptr) {
21995: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 21996: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 21997: zval *z_copy;
21998:
1.1.1.2 misho 21999: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 22000: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
22001:
22002: if (Z_REFCOUNT_P(z) == 0) {
22003: GC_REMOVE_ZVAL_FROM_BUFFER(z);
22004: zval_dtor(z);
22005: FREE_ZVAL(z);
22006: }
22007: z = value;
22008: }
1.1.1.2 misho 22009: ZVAL_COPY_VALUE(retval, z);
1.1 misho 22010: zendi_zval_copy_ctor(*retval);
22011: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 22012: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 22013: zendi_zval_copy_ctor(*z_copy);
22014: incdec_op(z_copy);
22015: Z_ADDREF_P(z);
1.1.1.2 misho 22016: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22017: zval_ptr_dtor(&z_copy);
22018: zval_ptr_dtor(&z);
22019: } else {
22020: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 22021: ZVAL_NULL(retval);
1.1 misho 22022: }
22023: }
22024:
22025: if (0) {
22026: zval_ptr_dtor(&property);
22027: } else {
22028:
22029: }
22030:
1.1.1.2 misho 22031: CHECK_EXCEPTION();
1.1 misho 22032: ZEND_VM_NEXT_OPCODE();
22033: }
22034:
22035: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22036: {
22037: return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22038: }
22039:
22040: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22041: {
22042: return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22043: }
22044:
1.1.1.2 misho 22045: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 22046: {
1.1.1.2 misho 22047: USE_OPLINE
1.1 misho 22048:
1.1.1.2 misho 22049: zval *container;
1.1 misho 22050:
1.1.1.2 misho 22051: zval *offset;
1.1 misho 22052:
1.1.1.2 misho 22053: SAVE_OPLINE();
22054: container = _get_obj_zval_ptr_unused(TSRMLS_C);
22055: offset = opline->op2.zv;
22056:
22057: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
22058: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
22059: zend_error(E_NOTICE, "Trying to get property of non-object");
22060: PZVAL_LOCK(&EG(uninitialized_zval));
22061: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 22062:
22063: } else {
22064: zval *retval;
22065:
22066: if (0) {
22067: MAKE_REAL_ZVAL_PTR(offset);
22068: }
22069:
22070: /* here we are sure we are dealing with an object */
1.1.1.2 misho 22071: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22072:
1.1.1.2 misho 22073: PZVAL_LOCK(retval);
22074: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 22075:
22076: if (0) {
22077: zval_ptr_dtor(&offset);
22078: } else {
22079:
22080: }
22081: }
22082:
1.1.1.2 misho 22083: CHECK_EXCEPTION();
1.1 misho 22084: ZEND_VM_NEXT_OPCODE();
22085: }
22086:
22087: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22088: {
1.1.1.2 misho 22089: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 22090: }
22091:
22092: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22093: {
1.1.1.2 misho 22094: USE_OPLINE
1.1 misho 22095: zend_free_op free_op1;
1.1.1.2 misho 22096: zval *property;
1.1 misho 22097: zval **container;
22098:
1.1.1.2 misho 22099: SAVE_OPLINE();
22100: property = opline->op2.zv;
22101:
1.1 misho 22102: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 22103: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
22104: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 22105: }
22106:
22107: if (0) {
22108: MAKE_REAL_ZVAL_PTR(property);
22109: }
22110: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1.1.2 misho 22111: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 22112: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
22113: }
1.1.1.2 misho 22114:
22115: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 22116: if (0) {
22117: zval_ptr_dtor(&property);
22118: } else {
22119:
22120: }
1.1.1.2 misho 22121: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
22122: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 22123: }
22124:
22125: /* We are going to assign the result by reference */
22126: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 22127: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
22128:
22129: Z_DELREF_PP(retval_ptr);
22130: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
22131: Z_ADDREF_PP(retval_ptr);
22132: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
22133: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 22134: }
22135:
1.1.1.2 misho 22136: CHECK_EXCEPTION();
1.1 misho 22137: ZEND_VM_NEXT_OPCODE();
22138: }
22139:
22140: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22141: {
1.1.1.2 misho 22142: USE_OPLINE
1.1 misho 22143: zend_free_op free_op1;
1.1.1.2 misho 22144: zval *property;
22145: zval **container;
22146:
22147: SAVE_OPLINE();
22148: property = opline->op2.zv;
22149: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 22150:
22151: if (0) {
22152: MAKE_REAL_ZVAL_PTR(property);
22153: }
1.1.1.2 misho 22154: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 22155: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
22156: }
1.1.1.2 misho 22157: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 22158: if (0) {
22159: zval_ptr_dtor(&property);
22160: } else {
22161:
22162: }
1.1.1.2 misho 22163: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
22164: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 22165: }
22166:
1.1.1.2 misho 22167: CHECK_EXCEPTION();
1.1 misho 22168: ZEND_VM_NEXT_OPCODE();
22169: }
22170:
22171: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22172: {
1.1.1.2 misho 22173: USE_OPLINE
22174:
22175: zval *container;
22176:
22177: zval *offset;
22178:
22179: SAVE_OPLINE();
22180: container = _get_obj_zval_ptr_unused(TSRMLS_C);
22181: offset = opline->op2.zv;
22182:
22183: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
22184: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
22185: PZVAL_LOCK(&EG(uninitialized_zval));
22186: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
22187:
22188: } else {
22189: zval *retval;
22190:
22191: if (0) {
22192: MAKE_REAL_ZVAL_PTR(offset);
22193: }
22194:
22195: /* here we are sure we are dealing with an object */
22196: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
22197:
22198: PZVAL_LOCK(retval);
22199: AI_SET_PTR(&EX_T(opline->result.var), retval);
22200:
22201: if (0) {
22202: zval_ptr_dtor(&offset);
22203: } else {
22204:
22205: }
22206: }
22207:
22208: CHECK_EXCEPTION();
22209: ZEND_VM_NEXT_OPCODE();
1.1 misho 22210: }
22211:
22212: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22213: {
1.1.1.2 misho 22214: USE_OPLINE
1.1 misho 22215:
1.1.1.2 misho 22216: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 22217: /* Behave like FETCH_OBJ_W */
22218: zend_free_op free_op1;
1.1.1.2 misho 22219: zval *property;
22220: zval **container;
22221:
22222: SAVE_OPLINE();
22223: property = opline->op2.zv;
22224: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 22225:
22226: if (0) {
22227: MAKE_REAL_ZVAL_PTR(property);
22228: }
1.1.1.2 misho 22229: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 22230: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
22231: }
1.1.1.2 misho 22232: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 22233: if (0) {
22234: zval_ptr_dtor(&property);
22235: } else {
22236:
22237: }
1.1.1.2 misho 22238: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
22239: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 22240: }
22241:
1.1.1.2 misho 22242: CHECK_EXCEPTION();
1.1 misho 22243: ZEND_VM_NEXT_OPCODE();
22244: } else {
1.1.1.2 misho 22245: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 22246: }
22247: }
22248:
22249: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22250: {
1.1.1.2 misho 22251: USE_OPLINE
1.1 misho 22252: zend_free_op free_op1, free_res;
1.1.1.2 misho 22253: zval **container;
22254: zval *property;
22255:
22256: SAVE_OPLINE();
22257: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
22258: property = opline->op2.zv;
1.1 misho 22259:
22260: if (IS_UNUSED == IS_CV) {
22261: if (container != &EG(uninitialized_zval_ptr)) {
22262: SEPARATE_ZVAL_IF_NOT_REF(container);
22263: }
22264: }
22265: if (0) {
22266: MAKE_REAL_ZVAL_PTR(property);
22267: }
1.1.1.2 misho 22268: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 22269: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
22270: }
1.1.1.2 misho 22271: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 22272: if (0) {
22273: zval_ptr_dtor(&property);
22274: } else {
22275:
22276: }
1.1.1.2 misho 22277: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
22278: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 22279: }
22280:
1.1.1.2 misho 22281: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
22282: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
22283: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 22284: }
1.1.1.2 misho 22285: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 22286: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 22287: CHECK_EXCEPTION();
1.1 misho 22288: ZEND_VM_NEXT_OPCODE();
22289: }
22290:
22291: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22292: {
1.1.1.2 misho 22293: USE_OPLINE
1.1 misho 22294:
1.1.1.2 misho 22295: zval **object_ptr;
22296: zval *property_name;
22297:
22298: SAVE_OPLINE();
22299: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
22300: property_name = opline->op2.zv;
1.1 misho 22301:
22302: if (0) {
22303: MAKE_REAL_ZVAL_PTR(property_name);
22304: }
1.1.1.2 misho 22305: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 22306: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
22307: }
1.1.1.2 misho 22308: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22309: if (0) {
22310: zval_ptr_dtor(&property_name);
22311: } else {
22312:
22313: }
22314:
22315: /* assign_obj has two opcodes! */
1.1.1.2 misho 22316: CHECK_EXCEPTION();
1.1 misho 22317: ZEND_VM_INC_OPCODE();
22318: ZEND_VM_NEXT_OPCODE();
22319: }
22320:
22321: static int ZEND_FASTCALL ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22322: {
1.1.1.2 misho 22323: USE_OPLINE
22324: zval *str = &EX_T(opline->result.var).tmp_var;
22325:
22326: SAVE_OPLINE();
1.1 misho 22327:
22328: if (IS_UNUSED == IS_UNUSED) {
22329: /* Initialize for erealloc in add_char_to_string */
22330: Z_STRVAL_P(str) = NULL;
22331: Z_STRLEN_P(str) = 0;
22332: Z_TYPE_P(str) = IS_STRING;
22333:
22334: INIT_PZVAL(str);
22335: }
22336:
1.1.1.2 misho 22337: add_char_to_string(str, str, opline->op2.zv);
1.1 misho 22338:
22339: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
1.1.1.2 misho 22340: /*CHECK_EXCEPTION();*/
1.1 misho 22341: ZEND_VM_NEXT_OPCODE();
22342: }
22343:
22344: static int ZEND_FASTCALL ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22345: {
1.1.1.2 misho 22346: USE_OPLINE
22347: zval *str = &EX_T(opline->result.var).tmp_var;
22348:
22349: SAVE_OPLINE();
1.1 misho 22350:
22351: if (IS_UNUSED == IS_UNUSED) {
22352: /* Initialize for erealloc in add_string_to_string */
22353: Z_STRVAL_P(str) = NULL;
22354: Z_STRLEN_P(str) = 0;
22355: Z_TYPE_P(str) = IS_STRING;
22356:
22357: INIT_PZVAL(str);
22358: }
22359:
1.1.1.2 misho 22360: add_string_to_string(str, str, opline->op2.zv);
1.1 misho 22361:
22362: /* FREE_OP is missing intentionally here - we're always working on the same temporary variable */
1.1.1.2 misho 22363: /*CHECK_EXCEPTION();*/
1.1 misho 22364: ZEND_VM_NEXT_OPCODE();
22365: }
22366:
22367: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22368: {
1.1.1.2 misho 22369: USE_OPLINE
1.1 misho 22370: zval *function_name;
22371: char *function_name_strval;
22372: int function_name_strlen;
22373:
22374:
1.1.1.2 misho 22375: SAVE_OPLINE();
1.1 misho 22376: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
22377:
1.1.1.2 misho 22378: function_name = opline->op2.zv;
1.1 misho 22379:
1.1.1.2 misho 22380: if (IS_CONST != IS_CONST &&
22381: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 22382: zend_error_noreturn(E_ERROR, "Method name must be a string");
22383: }
22384:
22385: function_name_strval = Z_STRVAL_P(function_name);
22386: function_name_strlen = Z_STRLEN_P(function_name);
22387:
22388: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
22389:
1.1.1.2 misho 22390: if (EXPECTED(EX(object) != NULL) &&
22391: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
22392: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 22393:
1.1.1.2 misho 22394: if (IS_CONST != IS_CONST ||
22395: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
22396: zval *object = EX(object);
22397:
22398: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
22399: zend_error_noreturn(E_ERROR, "Object does not support method calls");
22400: }
22401:
22402: /* First, locate the function. */
22403: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
22404: if (UNEXPECTED(EX(fbc) == NULL)) {
22405: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
22406: }
22407: if (IS_CONST == IS_CONST &&
22408: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
22409: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
22410: EXPECTED(EX(object) == object)) {
22411: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
22412: }
1.1 misho 22413: }
22414: } else {
22415: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
22416: }
22417:
22418: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
22419: EX(object) = NULL;
22420: } else {
22421: if (!PZVAL_IS_REF(EX(object))) {
22422: Z_ADDREF_P(EX(object)); /* For $this pointer */
22423: } else {
22424: zval *this_ptr;
22425: ALLOC_ZVAL(this_ptr);
22426: INIT_PZVAL_COPY(this_ptr, EX(object));
22427: zval_copy_ctor(this_ptr);
22428: EX(object) = this_ptr;
22429: }
22430: }
22431:
22432:
1.1.1.2 misho 22433: CHECK_EXCEPTION();
1.1 misho 22434: ZEND_VM_NEXT_OPCODE();
22435: }
22436:
22437: static int ZEND_FASTCALL ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22438: {
1.1.1.2 misho 22439: USE_OPLINE
1.1 misho 22440:
1.1.1.2 misho 22441: SAVE_OPLINE();
1.1 misho 22442: if (IS_UNUSED == IS_UNUSED) {
1.1.1.2 misho 22443: zend_constant *c;
22444: zval *retval;
22445:
22446: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
22447: c = CACHED_PTR(opline->op2.literal->cache_slot);
22448: } else if ((c = zend_quick_get_constant(opline->op2.literal + 1, opline->extended_value TSRMLS_CC)) == NULL) {
1.1 misho 22449: if ((opline->extended_value & IS_CONSTANT_UNQUALIFIED) != 0) {
1.1.1.2 misho 22450: char *actual = (char *)zend_memrchr(Z_STRVAL_P(opline->op2.zv), '\\', Z_STRLEN_P(opline->op2.zv));
1.1 misho 22451: if(!actual) {
1.1.1.2 misho 22452: actual = Z_STRVAL_P(opline->op2.zv);
1.1 misho 22453: } else {
22454: actual++;
22455: }
22456: /* non-qualified constant - allow text substitution */
22457: zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", actual, actual);
1.1.1.2 misho 22458: ZVAL_STRINGL(&EX_T(opline->result.var).tmp_var, actual, Z_STRLEN_P(opline->op2.zv)-(actual - Z_STRVAL_P(opline->op2.zv)), 1);
22459: CHECK_EXCEPTION();
22460: ZEND_VM_NEXT_OPCODE();
1.1 misho 22461: } else {
1.1.1.2 misho 22462: zend_error_noreturn(E_ERROR, "Undefined constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 22463: }
1.1.1.2 misho 22464: } else {
22465: CACHE_PTR(opline->op2.literal->cache_slot, c);
1.1 misho 22466: }
1.1.1.2 misho 22467: retval = &EX_T(opline->result.var).tmp_var;
22468: ZVAL_COPY_VALUE(retval, &c->value);
22469: zval_copy_ctor(retval);
22470: CHECK_EXCEPTION();
1.1 misho 22471: ZEND_VM_NEXT_OPCODE();
22472: } else {
22473: /* class constant */
22474: zend_class_entry *ce;
22475: zval **value;
22476:
22477: if (IS_UNUSED == IS_CONST) {
1.1.1.2 misho 22478: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
22479: value = CACHED_PTR(opline->op2.literal->cache_slot);
22480: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
22481: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
22482: CHECK_EXCEPTION();
22483: ZEND_VM_NEXT_OPCODE();
22484: } else if (CACHED_PTR(opline->op1.literal->cache_slot)) {
22485: ce = CACHED_PTR(opline->op1.literal->cache_slot);
22486: } else {
22487: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op1.zv), Z_STRLEN_P(opline->op1.zv), opline->op1.literal + 1, opline->extended_value TSRMLS_CC);
1.1.1.4 misho 22488: if (UNEXPECTED(EG(exception) != NULL)) {
22489: HANDLE_EXCEPTION();
22490: }
1.1.1.2 misho 22491: if (UNEXPECTED(ce == NULL)) {
1.1.1.4 misho 22492: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op1.zv));
1.1.1.2 misho 22493: }
22494: CACHE_PTR(opline->op1.literal->cache_slot, ce);
1.1 misho 22495: }
22496: } else {
1.1.1.2 misho 22497: ce = EX_T(opline->op1.var).class_entry;
22498: if ((value = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce)) != NULL) {
22499: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
22500: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
22501: CHECK_EXCEPTION();
22502: ZEND_VM_NEXT_OPCODE();
22503: }
1.1 misho 22504: }
22505:
1.1.1.2 misho 22506: if (EXPECTED(zend_hash_quick_find(&ce->constants_table, Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv)+1, Z_HASH_P(opline->op2.zv), (void **) &value) == SUCCESS)) {
1.1 misho 22507: if (Z_TYPE_PP(value) == IS_CONSTANT_ARRAY ||
22508: (Z_TYPE_PP(value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT) {
22509: zend_class_entry *old_scope = EG(scope);
22510:
22511: EG(scope) = ce;
22512: zval_update_constant(value, (void *) 1 TSRMLS_CC);
22513: EG(scope) = old_scope;
22514: }
1.1.1.2 misho 22515: if (IS_UNUSED == IS_CONST) {
22516: CACHE_PTR(opline->op2.literal->cache_slot, value);
22517: } else {
22518: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, ce, value);
22519: }
22520: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, *value);
22521: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 22522: } else {
1.1.1.2 misho 22523: zend_error_noreturn(E_ERROR, "Undefined class constant '%s'", Z_STRVAL_P(opline->op2.zv));
1.1 misho 22524: }
22525:
1.1.1.2 misho 22526: CHECK_EXCEPTION();
1.1 misho 22527: ZEND_VM_NEXT_OPCODE();
22528: }
22529: }
22530:
22531: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22532: {
1.1.1.2 misho 22533: USE_OPLINE
1.1 misho 22534:
1.1.1.2 misho 22535: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 22536: if (IS_UNUSED == IS_UNUSED) {
22537: ZEND_VM_NEXT_OPCODE();
22538: #if 0 || IS_UNUSED != IS_UNUSED
22539: } else {
22540: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22541: #endif
22542: }
22543: }
22544:
22545: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22546: {
1.1.1.2 misho 22547: USE_OPLINE
1.1 misho 22548:
1.1.1.2 misho 22549: zval **container;
1.1 misho 22550: zval *offset;
1.1.1.2 misho 22551: ulong hval;
1.1 misho 22552:
1.1.1.2 misho 22553: SAVE_OPLINE();
22554: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 22555: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
22556: SEPARATE_ZVAL_IF_NOT_REF(container);
22557: }
1.1.1.2 misho 22558: offset = opline->op2.zv;
1.1 misho 22559:
22560: if (IS_UNUSED != IS_VAR || container) {
22561: switch (Z_TYPE_PP(container)) {
22562: case IS_ARRAY: {
22563: HashTable *ht = Z_ARRVAL_PP(container);
22564:
22565: switch (Z_TYPE_P(offset)) {
22566: case IS_DOUBLE:
1.1.1.2 misho 22567: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 22568: zend_hash_index_del(ht, hval);
22569: break;
1.1 misho 22570: case IS_RESOURCE:
22571: case IS_BOOL:
22572: case IS_LONG:
1.1.1.2 misho 22573: hval = Z_LVAL_P(offset);
22574: zend_hash_index_del(ht, hval);
1.1 misho 22575: break;
22576: case IS_STRING:
22577: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
22578: Z_ADDREF_P(offset);
22579: }
1.1.1.2 misho 22580: if (IS_CONST == IS_CONST) {
22581: hval = Z_HASH_P(offset);
22582: } else {
22583: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
22584: if (IS_INTERNED(Z_STRVAL_P(offset))) {
22585: hval = INTERNED_HASH(Z_STRVAL_P(offset));
22586: } else {
22587: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 22588: }
22589: }
1.1.1.2 misho 22590: if (ht == &EG(symbol_table)) {
22591: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
22592: } else {
22593: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
22594: }
22595: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
22596: zval_ptr_dtor(&offset);
22597: }
22598: break;
22599: num_index_dim:
22600: zend_hash_index_del(ht, hval);
1.1 misho 22601: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
22602: zval_ptr_dtor(&offset);
22603: }
22604: break;
22605: case IS_NULL:
22606: zend_hash_del(ht, "", sizeof(""));
22607: break;
22608: default:
22609: zend_error(E_WARNING, "Illegal offset type in unset");
22610: break;
22611: }
22612:
22613: break;
22614: }
22615: case IS_OBJECT:
1.1.1.2 misho 22616: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 22617: zend_error_noreturn(E_ERROR, "Cannot use object as array");
22618: }
22619: if (0) {
22620: MAKE_REAL_ZVAL_PTR(offset);
22621: }
22622: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
22623: if (0) {
22624: zval_ptr_dtor(&offset);
22625: } else {
22626:
22627: }
22628: break;
22629: case IS_STRING:
22630: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
22631: ZEND_VM_CONTINUE(); /* bailed out before */
22632: default:
22633:
22634: break;
22635: }
22636: } else {
22637:
22638: }
22639:
1.1.1.2 misho 22640: CHECK_EXCEPTION();
1.1 misho 22641: ZEND_VM_NEXT_OPCODE();
22642: }
22643:
22644: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22645: {
1.1.1.2 misho 22646: USE_OPLINE
22647:
22648: zval **container;
22649: zval *offset;
1.1 misho 22650:
1.1.1.2 misho 22651: SAVE_OPLINE();
22652: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
22653: offset = opline->op2.zv;
1.1 misho 22654:
22655: if (IS_UNUSED != IS_VAR || container) {
22656: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
22657: SEPARATE_ZVAL_IF_NOT_REF(container);
22658: }
22659: if (Z_TYPE_PP(container) == IS_OBJECT) {
22660: if (0) {
22661: MAKE_REAL_ZVAL_PTR(offset);
22662: }
22663: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 22664: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22665: } else {
22666: zend_error(E_NOTICE, "Trying to unset property of non-object");
22667: }
22668: if (0) {
22669: zval_ptr_dtor(&offset);
22670: } else {
22671:
22672: }
22673: } else {
22674:
22675: }
22676: } else {
22677:
22678: }
22679:
1.1.1.2 misho 22680: CHECK_EXCEPTION();
1.1 misho 22681: ZEND_VM_NEXT_OPCODE();
22682: }
22683:
22684: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
22685: {
1.1.1.2 misho 22686: USE_OPLINE
1.1 misho 22687:
1.1.1.2 misho 22688: zval **container;
1.1 misho 22689: zval **value = NULL;
22690: int result = 0;
1.1.1.2 misho 22691: ulong hval;
22692: zval *offset;
1.1 misho 22693:
1.1.1.2 misho 22694: SAVE_OPLINE();
22695: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 22696:
1.1.1.2 misho 22697: offset = opline->op2.zv;
1.1 misho 22698:
1.1.1.2 misho 22699: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
22700: HashTable *ht;
22701: int isset = 0;
1.1 misho 22702:
1.1.1.2 misho 22703: ht = Z_ARRVAL_PP(container);
1.1 misho 22704:
1.1.1.2 misho 22705: switch (Z_TYPE_P(offset)) {
22706: case IS_DOUBLE:
22707: hval = zend_dval_to_lval(Z_DVAL_P(offset));
22708: goto num_index_prop;
22709: case IS_RESOURCE:
22710: case IS_BOOL:
22711: case IS_LONG:
22712: hval = Z_LVAL_P(offset);
22713: num_index_prop:
22714: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
22715: isset = 1;
22716: }
22717: break;
22718: case IS_STRING:
22719: if (IS_CONST == IS_CONST) {
22720: hval = Z_HASH_P(offset);
22721: } else {
22722: if (!prop_dim) {
22723: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 22724: }
1.1.1.2 misho 22725: if (IS_INTERNED(Z_STRVAL_P(offset))) {
22726: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 22727: } else {
1.1.1.2 misho 22728: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 22729: }
22730: }
1.1.1.2 misho 22731: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
22732: isset = 1;
22733: }
22734: break;
22735: case IS_NULL:
22736: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
22737: isset = 1;
1.1 misho 22738: }
1.1.1.2 misho 22739: break;
22740: default:
22741: zend_error(E_WARNING, "Illegal offset type in isset or empty");
22742: break;
22743: }
22744:
22745: if (opline->extended_value & ZEND_ISSET) {
22746: if (isset && Z_TYPE_PP(value) == IS_NULL) {
22747: result = 0;
22748: } else {
22749: result = isset;
1.1 misho 22750: }
1.1.1.2 misho 22751: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
22752: if (!isset || !i_zend_is_true(*value)) {
22753: result = 0;
1.1 misho 22754: } else {
1.1.1.2 misho 22755: result = 1;
22756: }
22757: }
1.1 misho 22758:
1.1.1.2 misho 22759: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
22760: if (0) {
22761: MAKE_REAL_ZVAL_PTR(offset);
22762: }
22763: if (prop_dim) {
22764: if (Z_OBJ_HT_P(*container)->has_property) {
22765: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
22766: } else {
22767: zend_error(E_NOTICE, "Trying to check property of non-object");
22768: result = 0;
22769: }
22770: } else {
22771: if (Z_OBJ_HT_P(*container)->has_dimension) {
22772: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
22773: } else {
22774: zend_error(E_NOTICE, "Trying to check element of non-array");
22775: result = 0;
1.1 misho 22776: }
1.1.1.2 misho 22777: }
22778: if (0) {
22779: zval_ptr_dtor(&offset);
22780: } else {
22781:
22782: }
22783: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
22784: zval tmp;
1.1 misho 22785:
1.1.1.2 misho 22786: if (Z_TYPE_P(offset) != IS_LONG) {
22787: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
22788: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
22789: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
22790: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 22791: zval_copy_ctor(&tmp);
22792: convert_to_long(&tmp);
22793: offset = &tmp;
1.1.1.2 misho 22794: } else {
22795: /* can not be converted to proper offset, return "not set" */
22796: result = 0;
1.1 misho 22797: }
1.1.1.2 misho 22798: }
22799: if (Z_TYPE_P(offset) == IS_LONG) {
22800: if (opline->extended_value & ZEND_ISSET) {
22801: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
22802: result = 1;
22803: }
22804: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
22805: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
22806: result = 1;
1.1 misho 22807: }
22808: }
1.1.1.2 misho 22809: }
1.1 misho 22810:
1.1.1.2 misho 22811: } else {
1.1 misho 22812:
22813: }
22814:
1.1.1.2 misho 22815: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
22816: if (opline->extended_value & ZEND_ISSET) {
22817: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
22818: } else {
22819: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 22820: }
22821:
1.1.1.2 misho 22822: CHECK_EXCEPTION();
1.1 misho 22823: ZEND_VM_NEXT_OPCODE();
22824: }
22825:
22826: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22827: {
22828: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22829: }
22830:
22831: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
22832: {
22833: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22834: }
22835:
22836: 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)
22837: {
1.1.1.2 misho 22838: USE_OPLINE
1.1 misho 22839: zend_free_op free_op2, free_op_data1;
22840: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
22841: zval *object;
1.1.1.2 misho 22842: zval *property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
22843: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 22844: int have_get_ptr = 0;
22845:
1.1.1.2 misho 22846: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 22847: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
22848: }
22849:
22850: make_real_object(object_ptr TSRMLS_CC);
22851: object = *object_ptr;
22852:
1.1.1.2 misho 22853: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 22854: zend_error(E_WARNING, "Attempt to assign property of non-object");
22855: zval_dtor(free_op2.var);
22856: FREE_OP(free_op_data1);
22857:
1.1.1.2 misho 22858: if (RETURN_VALUE_USED(opline)) {
22859: PZVAL_LOCK(&EG(uninitialized_zval));
22860: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
22861: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 22862: }
22863: } else {
22864: /* here we are sure we are dealing with an object */
22865: if (1) {
22866: MAKE_REAL_ZVAL_PTR(property);
22867: }
22868:
22869: /* here property is a string */
22870: if (opline->extended_value == ZEND_ASSIGN_OBJ
22871: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 22872: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22873: if (zptr != NULL) { /* NULL means no success in getting PTR */
22874: SEPARATE_ZVAL_IF_NOT_REF(zptr);
22875:
22876: have_get_ptr = 1;
22877: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 22878: if (RETURN_VALUE_USED(opline)) {
1.1 misho 22879: PZVAL_LOCK(*zptr);
1.1.1.2 misho 22880: EX_T(opline->result.var).var.ptr = *zptr;
22881: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 22882: }
22883: }
22884: }
22885:
22886: if (!have_get_ptr) {
22887: zval *z = NULL;
22888:
22889: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
22890: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 22891: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22892: }
22893: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
22894: if (Z_OBJ_HT_P(object)->read_dimension) {
22895: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
22896: }
22897: }
22898: if (z) {
22899: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
22900: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
22901:
22902: if (Z_REFCOUNT_P(z) == 0) {
22903: GC_REMOVE_ZVAL_FROM_BUFFER(z);
22904: zval_dtor(z);
22905: FREE_ZVAL(z);
22906: }
22907: z = value;
22908: }
22909: Z_ADDREF_P(z);
22910: SEPARATE_ZVAL_IF_NOT_REF(&z);
22911: binary_op(z, z, value TSRMLS_CC);
22912: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 22913: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 22914: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
22915: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
22916: }
1.1.1.2 misho 22917: if (RETURN_VALUE_USED(opline)) {
1.1 misho 22918: PZVAL_LOCK(z);
1.1.1.2 misho 22919: EX_T(opline->result.var).var.ptr = z;
22920: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 22921: }
22922: zval_ptr_dtor(&z);
22923: } else {
22924: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 22925: if (RETURN_VALUE_USED(opline)) {
22926: PZVAL_LOCK(&EG(uninitialized_zval));
22927: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
22928: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 22929: }
22930: }
22931: }
22932:
22933: if (1) {
22934: zval_ptr_dtor(&property);
22935: } else {
22936: zval_dtor(free_op2.var);
22937: }
22938: FREE_OP(free_op_data1);
22939: }
22940:
22941: /* assign_obj has two opcodes! */
1.1.1.2 misho 22942: CHECK_EXCEPTION();
1.1 misho 22943: ZEND_VM_INC_OPCODE();
22944: ZEND_VM_NEXT_OPCODE();
22945: }
22946:
22947: 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)
22948: {
1.1.1.2 misho 22949: USE_OPLINE
1.1 misho 22950: zend_free_op free_op2, free_op_data2, free_op_data1;
22951: zval **var_ptr;
22952: zval *value;
22953:
1.1.1.2 misho 22954: SAVE_OPLINE();
1.1 misho 22955: switch (opline->extended_value) {
22956: case ZEND_ASSIGN_OBJ:
22957: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22958: break;
22959: case ZEND_ASSIGN_DIM: {
22960: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
22961:
1.1.1.2 misho 22962: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 22963: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 22964: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 22965: if (IS_UNUSED == IS_VAR && !0) {
22966: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
22967: }
22968: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
22969: } else {
1.1.1.2 misho 22970: zval *dim = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 22971:
1.1.1.2 misho 22972: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
22973: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
22974: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 22975: }
22976: }
22977: break;
22978: default:
1.1.1.2 misho 22979: value = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 22980: var_ptr = NULL;
22981: /* do nothing */
22982: break;
22983: }
22984:
1.1.1.2 misho 22985: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 22986: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
22987: }
22988:
1.1.1.2 misho 22989: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
22990: if (RETURN_VALUE_USED(opline)) {
22991: PZVAL_LOCK(&EG(uninitialized_zval));
22992: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 22993: }
22994: zval_dtor(free_op2.var);
22995:
1.1.1.2 misho 22996: CHECK_EXCEPTION();
22997: if (opline->extended_value == ZEND_ASSIGN_DIM) {
22998: ZEND_VM_INC_OPCODE();
22999: }
1.1 misho 23000: ZEND_VM_NEXT_OPCODE();
23001: }
23002:
23003: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
23004:
1.1.1.2 misho 23005: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
23006: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 23007: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
23008: /* proxy object */
23009: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
23010: Z_ADDREF_P(objval);
23011: binary_op(objval, objval, value TSRMLS_CC);
23012: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
23013: zval_ptr_dtor(&objval);
23014: } else {
23015: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
23016: }
23017:
1.1.1.2 misho 23018: if (RETURN_VALUE_USED(opline)) {
1.1 misho 23019: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 23020: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 23021: }
23022: zval_dtor(free_op2.var);
23023:
23024: if (opline->extended_value == ZEND_ASSIGN_DIM) {
23025: FREE_OP(free_op_data1);
23026: FREE_OP_VAR_PTR(free_op_data2);
23027:
1.1.1.2 misho 23028: CHECK_EXCEPTION();
23029: ZEND_VM_INC_OPCODE();
23030: } else {
23031:
23032: CHECK_EXCEPTION();
23033: }
1.1 misho 23034: ZEND_VM_NEXT_OPCODE();
23035: }
23036:
23037: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23038: {
23039: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23040: }
23041:
23042: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23043: {
23044: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23045: }
23046:
23047: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23048: {
23049: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23050: }
23051:
23052: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23053: {
23054: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23055: }
23056:
23057: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23058: {
23059: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23060: }
23061:
23062: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23063: {
23064: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23065: }
23066:
23067: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23068: {
23069: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23070: }
23071:
23072: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23073: {
23074: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23075: }
23076:
23077: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23078: {
23079: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23080: }
23081:
23082: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23083: {
23084: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23085: }
23086:
23087: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23088: {
23089: return zend_binary_assign_op_helper_SPEC_UNUSED_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23090: }
23091:
23092: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
23093: {
1.1.1.2 misho 23094: USE_OPLINE
1.1 misho 23095: zend_free_op free_op2;
1.1.1.2 misho 23096: zval **object_ptr;
1.1 misho 23097: zval *object;
1.1.1.2 misho 23098: zval *property;
23099: zval **retval;
1.1 misho 23100: int have_get_ptr = 0;
23101:
1.1.1.2 misho 23102: SAVE_OPLINE();
23103: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
23104: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23105: retval = &EX_T(opline->result.var).var.ptr;
23106:
23107: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 23108: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
23109: }
23110:
23111: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
23112: object = *object_ptr;
23113:
1.1.1.2 misho 23114: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 23115: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
23116: zval_dtor(free_op2.var);
1.1.1.2 misho 23117: if (RETURN_VALUE_USED(opline)) {
23118: PZVAL_LOCK(&EG(uninitialized_zval));
23119: *retval = &EG(uninitialized_zval);
1.1 misho 23120: }
23121:
1.1.1.2 misho 23122: CHECK_EXCEPTION();
1.1 misho 23123: ZEND_VM_NEXT_OPCODE();
23124: }
23125:
23126: /* here we are sure we are dealing with an object */
23127:
23128: if (1) {
23129: MAKE_REAL_ZVAL_PTR(property);
23130: }
23131:
23132: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 23133: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23134: if (zptr != NULL) { /* NULL means no success in getting PTR */
23135: SEPARATE_ZVAL_IF_NOT_REF(zptr);
23136:
23137: have_get_ptr = 1;
23138: incdec_op(*zptr);
1.1.1.2 misho 23139: if (RETURN_VALUE_USED(opline)) {
1.1 misho 23140: *retval = *zptr;
23141: PZVAL_LOCK(*retval);
23142: }
23143: }
23144: }
23145:
23146: if (!have_get_ptr) {
23147: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 23148: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23149:
1.1.1.2 misho 23150: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 23151: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
23152:
23153: if (Z_REFCOUNT_P(z) == 0) {
23154: GC_REMOVE_ZVAL_FROM_BUFFER(z);
23155: zval_dtor(z);
23156: FREE_ZVAL(z);
23157: }
23158: z = value;
23159: }
23160: Z_ADDREF_P(z);
23161: SEPARATE_ZVAL_IF_NOT_REF(&z);
23162: incdec_op(z);
23163: *retval = z;
1.1.1.2 misho 23164: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
23165: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 23166: zval_ptr_dtor(&z);
23167: } else {
23168: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 23169: if (RETURN_VALUE_USED(opline)) {
23170: PZVAL_LOCK(&EG(uninitialized_zval));
23171: *retval = &EG(uninitialized_zval);
1.1 misho 23172: }
23173: }
23174: }
23175:
23176: if (1) {
23177: zval_ptr_dtor(&property);
23178: } else {
23179: zval_dtor(free_op2.var);
23180: }
23181:
1.1.1.2 misho 23182: CHECK_EXCEPTION();
1.1 misho 23183: ZEND_VM_NEXT_OPCODE();
23184: }
23185:
23186: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23187: {
23188: return zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23189: }
23190:
23191: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23192: {
23193: return zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23194: }
23195:
23196: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
23197: {
1.1.1.2 misho 23198: USE_OPLINE
1.1 misho 23199: zend_free_op free_op2;
1.1.1.2 misho 23200: zval **object_ptr;
1.1 misho 23201: zval *object;
1.1.1.2 misho 23202: zval *property;
23203: zval *retval;
1.1 misho 23204: int have_get_ptr = 0;
23205:
1.1.1.2 misho 23206: SAVE_OPLINE();
23207: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
23208: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23209: retval = &EX_T(opline->result.var).tmp_var;
23210:
23211: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 23212: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
23213: }
23214:
23215: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
23216: object = *object_ptr;
23217:
1.1.1.2 misho 23218: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 23219: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
23220: zval_dtor(free_op2.var);
1.1.1.2 misho 23221: ZVAL_NULL(retval);
1.1 misho 23222:
1.1.1.2 misho 23223: CHECK_EXCEPTION();
1.1 misho 23224: ZEND_VM_NEXT_OPCODE();
23225: }
23226:
23227: /* here we are sure we are dealing with an object */
23228:
23229: if (1) {
23230: MAKE_REAL_ZVAL_PTR(property);
23231: }
23232:
23233: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 23234: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23235: if (zptr != NULL) { /* NULL means no success in getting PTR */
23236: have_get_ptr = 1;
23237: SEPARATE_ZVAL_IF_NOT_REF(zptr);
23238:
1.1.1.2 misho 23239: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 23240: zendi_zval_copy_ctor(*retval);
23241:
23242: incdec_op(*zptr);
23243:
23244: }
23245: }
23246:
23247: if (!have_get_ptr) {
23248: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 23249: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23250: zval *z_copy;
23251:
1.1.1.2 misho 23252: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 23253: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
23254:
23255: if (Z_REFCOUNT_P(z) == 0) {
23256: GC_REMOVE_ZVAL_FROM_BUFFER(z);
23257: zval_dtor(z);
23258: FREE_ZVAL(z);
23259: }
23260: z = value;
23261: }
1.1.1.2 misho 23262: ZVAL_COPY_VALUE(retval, z);
1.1 misho 23263: zendi_zval_copy_ctor(*retval);
23264: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 23265: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 23266: zendi_zval_copy_ctor(*z_copy);
23267: incdec_op(z_copy);
23268: Z_ADDREF_P(z);
1.1.1.2 misho 23269: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23270: zval_ptr_dtor(&z_copy);
23271: zval_ptr_dtor(&z);
23272: } else {
23273: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 23274: ZVAL_NULL(retval);
1.1 misho 23275: }
23276: }
23277:
23278: if (1) {
23279: zval_ptr_dtor(&property);
23280: } else {
23281: zval_dtor(free_op2.var);
23282: }
23283:
1.1.1.2 misho 23284: CHECK_EXCEPTION();
1.1 misho 23285: ZEND_VM_NEXT_OPCODE();
23286: }
23287:
23288: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23289: {
23290: return zend_post_incdec_property_helper_SPEC_UNUSED_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23291: }
23292:
23293: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23294: {
23295: return zend_post_incdec_property_helper_SPEC_UNUSED_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23296: }
23297:
1.1.1.2 misho 23298: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 23299: {
1.1.1.2 misho 23300: USE_OPLINE
1.1 misho 23301:
1.1.1.2 misho 23302: zval *container;
1.1 misho 23303: zend_free_op free_op2;
1.1.1.2 misho 23304: zval *offset;
1.1 misho 23305:
1.1.1.2 misho 23306: SAVE_OPLINE();
23307: container = _get_obj_zval_ptr_unused(TSRMLS_C);
23308: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23309:
23310: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
23311: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
23312: zend_error(E_NOTICE, "Trying to get property of non-object");
23313: PZVAL_LOCK(&EG(uninitialized_zval));
23314: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 23315: zval_dtor(free_op2.var);
23316: } else {
23317: zval *retval;
23318:
23319: if (1) {
23320: MAKE_REAL_ZVAL_PTR(offset);
23321: }
23322:
23323: /* here we are sure we are dealing with an object */
1.1.1.2 misho 23324: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23325:
1.1.1.2 misho 23326: PZVAL_LOCK(retval);
23327: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 23328:
23329: if (1) {
23330: zval_ptr_dtor(&offset);
23331: } else {
23332: zval_dtor(free_op2.var);
23333: }
23334: }
23335:
1.1.1.2 misho 23336: CHECK_EXCEPTION();
1.1 misho 23337: ZEND_VM_NEXT_OPCODE();
23338: }
23339:
23340: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23341: {
1.1.1.2 misho 23342: return zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 23343: }
23344:
23345: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23346: {
1.1.1.2 misho 23347: USE_OPLINE
1.1 misho 23348: zend_free_op free_op1, free_op2;
1.1.1.2 misho 23349: zval *property;
1.1 misho 23350: zval **container;
23351:
1.1.1.2 misho 23352: SAVE_OPLINE();
23353: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23354:
1.1 misho 23355: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 23356: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
23357: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 23358: }
23359:
23360: if (1) {
23361: MAKE_REAL_ZVAL_PTR(property);
23362: }
23363: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1.1.2 misho 23364: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 23365: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
23366: }
1.1.1.2 misho 23367:
23368: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 23369: if (1) {
23370: zval_ptr_dtor(&property);
23371: } else {
23372: zval_dtor(free_op2.var);
23373: }
1.1.1.2 misho 23374: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
23375: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 23376: }
23377:
23378: /* We are going to assign the result by reference */
23379: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 23380: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
23381:
23382: Z_DELREF_PP(retval_ptr);
23383: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
23384: Z_ADDREF_PP(retval_ptr);
23385: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
23386: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 23387: }
23388:
1.1.1.2 misho 23389: CHECK_EXCEPTION();
1.1 misho 23390: ZEND_VM_NEXT_OPCODE();
23391: }
23392:
23393: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23394: {
1.1.1.2 misho 23395: USE_OPLINE
1.1 misho 23396: zend_free_op free_op1, free_op2;
1.1.1.2 misho 23397: zval *property;
23398: zval **container;
23399:
23400: SAVE_OPLINE();
23401: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23402: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 23403:
23404: if (1) {
23405: MAKE_REAL_ZVAL_PTR(property);
23406: }
1.1.1.2 misho 23407: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 23408: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
23409: }
1.1.1.2 misho 23410: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 23411: if (1) {
23412: zval_ptr_dtor(&property);
23413: } else {
23414: zval_dtor(free_op2.var);
23415: }
1.1.1.2 misho 23416: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
23417: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 23418: }
23419:
1.1.1.2 misho 23420: CHECK_EXCEPTION();
1.1 misho 23421: ZEND_VM_NEXT_OPCODE();
23422: }
23423:
23424: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23425: {
1.1.1.2 misho 23426: USE_OPLINE
23427:
23428: zval *container;
23429: zend_free_op free_op2;
23430: zval *offset;
23431:
23432: SAVE_OPLINE();
23433: container = _get_obj_zval_ptr_unused(TSRMLS_C);
23434: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23435:
23436: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
23437: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
23438: PZVAL_LOCK(&EG(uninitialized_zval));
23439: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
23440: zval_dtor(free_op2.var);
23441: } else {
23442: zval *retval;
23443:
23444: if (1) {
23445: MAKE_REAL_ZVAL_PTR(offset);
23446: }
23447:
23448: /* here we are sure we are dealing with an object */
23449: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
23450:
23451: PZVAL_LOCK(retval);
23452: AI_SET_PTR(&EX_T(opline->result.var), retval);
23453:
23454: if (1) {
23455: zval_ptr_dtor(&offset);
23456: } else {
23457: zval_dtor(free_op2.var);
23458: }
23459: }
23460:
23461: CHECK_EXCEPTION();
23462: ZEND_VM_NEXT_OPCODE();
1.1 misho 23463: }
23464:
23465: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23466: {
1.1.1.2 misho 23467: USE_OPLINE
1.1 misho 23468:
1.1.1.2 misho 23469: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 23470: /* Behave like FETCH_OBJ_W */
23471: zend_free_op free_op1, free_op2;
1.1.1.2 misho 23472: zval *property;
23473: zval **container;
23474:
23475: SAVE_OPLINE();
23476: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23477: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 23478:
23479: if (1) {
23480: MAKE_REAL_ZVAL_PTR(property);
23481: }
1.1.1.2 misho 23482: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 23483: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
23484: }
1.1.1.2 misho 23485: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 23486: if (1) {
23487: zval_ptr_dtor(&property);
23488: } else {
23489: zval_dtor(free_op2.var);
23490: }
1.1.1.2 misho 23491: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
23492: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 23493: }
23494:
1.1.1.2 misho 23495: CHECK_EXCEPTION();
1.1 misho 23496: ZEND_VM_NEXT_OPCODE();
23497: } else {
1.1.1.2 misho 23498: return zend_fetch_property_address_read_helper_SPEC_UNUSED_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 23499: }
23500: }
23501:
23502: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23503: {
1.1.1.2 misho 23504: USE_OPLINE
1.1 misho 23505: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 23506: zval **container;
23507: zval *property;
23508:
23509: SAVE_OPLINE();
23510: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
23511: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23512:
23513: if (IS_UNUSED == IS_CV) {
23514: if (container != &EG(uninitialized_zval_ptr)) {
23515: SEPARATE_ZVAL_IF_NOT_REF(container);
23516: }
23517: }
23518: if (1) {
23519: MAKE_REAL_ZVAL_PTR(property);
23520: }
1.1.1.2 misho 23521: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 23522: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
23523: }
1.1.1.2 misho 23524: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 23525: if (1) {
23526: zval_ptr_dtor(&property);
23527: } else {
23528: zval_dtor(free_op2.var);
23529: }
1.1.1.2 misho 23530: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
23531: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 23532: }
23533:
1.1.1.2 misho 23534: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
23535: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
23536: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 23537: }
1.1.1.2 misho 23538: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 23539: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 23540: CHECK_EXCEPTION();
1.1 misho 23541: ZEND_VM_NEXT_OPCODE();
23542: }
23543:
23544: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23545: {
1.1.1.2 misho 23546: USE_OPLINE
1.1 misho 23547: zend_free_op free_op2;
1.1.1.2 misho 23548: zval **object_ptr;
23549: zval *property_name;
23550:
23551: SAVE_OPLINE();
23552: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
23553: property_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23554:
23555: if (1) {
23556: MAKE_REAL_ZVAL_PTR(property_name);
23557: }
1.1.1.2 misho 23558: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 23559: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
23560: }
1.1.1.2 misho 23561: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23562: if (1) {
23563: zval_ptr_dtor(&property_name);
23564: } else {
23565: zval_dtor(free_op2.var);
23566: }
23567:
23568: /* assign_obj has two opcodes! */
1.1.1.2 misho 23569: CHECK_EXCEPTION();
1.1 misho 23570: ZEND_VM_INC_OPCODE();
23571: ZEND_VM_NEXT_OPCODE();
23572: }
23573:
23574: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23575: {
1.1.1.2 misho 23576: USE_OPLINE
1.1 misho 23577: zend_free_op free_op2;
1.1.1.2 misho 23578: zval *str = &EX_T(opline->result.var).tmp_var;
23579: zval *var;
1.1 misho 23580: zval var_copy;
23581: int use_copy = 0;
23582:
1.1.1.2 misho 23583: SAVE_OPLINE();
23584: var = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
23585:
1.1 misho 23586: if (IS_UNUSED == IS_UNUSED) {
23587: /* Initialize for erealloc in add_string_to_string */
23588: Z_STRVAL_P(str) = NULL;
23589: Z_STRLEN_P(str) = 0;
23590: Z_TYPE_P(str) = IS_STRING;
23591:
23592: INIT_PZVAL(str);
23593: }
23594:
23595: if (Z_TYPE_P(var) != IS_STRING) {
23596: zend_make_printable_zval(var, &var_copy, &use_copy);
23597:
23598: if (use_copy) {
23599: var = &var_copy;
23600: }
23601: }
23602: add_string_to_string(str, str, var);
23603:
23604: if (use_copy) {
23605: zval_dtor(var);
23606: }
23607: /* original comment, possibly problematic:
23608: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
23609: * (Zeev): I don't think it's problematic, we only use variables
23610: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
23611: * string offsets or overloaded objects
23612: */
23613: zval_dtor(free_op2.var);
23614:
1.1.1.2 misho 23615: CHECK_EXCEPTION();
1.1 misho 23616: ZEND_VM_NEXT_OPCODE();
23617: }
23618:
23619: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23620: {
1.1.1.2 misho 23621: USE_OPLINE
1.1 misho 23622: zval *function_name;
23623: char *function_name_strval;
23624: int function_name_strlen;
23625: zend_free_op free_op2;
23626:
1.1.1.2 misho 23627: SAVE_OPLINE();
1.1 misho 23628: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
23629:
1.1.1.2 misho 23630: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23631:
1.1.1.2 misho 23632: if (IS_TMP_VAR != IS_CONST &&
23633: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 23634: zend_error_noreturn(E_ERROR, "Method name must be a string");
23635: }
23636:
23637: function_name_strval = Z_STRVAL_P(function_name);
23638: function_name_strlen = Z_STRLEN_P(function_name);
23639:
23640: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
23641:
1.1.1.2 misho 23642: if (EXPECTED(EX(object) != NULL) &&
23643: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
23644: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 23645:
1.1.1.2 misho 23646: if (IS_TMP_VAR != IS_CONST ||
23647: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
23648: zval *object = EX(object);
23649:
23650: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
23651: zend_error_noreturn(E_ERROR, "Object does not support method calls");
23652: }
23653:
23654: /* First, locate the function. */
23655: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
23656: if (UNEXPECTED(EX(fbc) == NULL)) {
23657: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
23658: }
23659: if (IS_TMP_VAR == IS_CONST &&
23660: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
23661: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
23662: EXPECTED(EX(object) == object)) {
23663: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
23664: }
1.1 misho 23665: }
23666: } else {
23667: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
23668: }
23669:
23670: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
23671: EX(object) = NULL;
23672: } else {
23673: if (!PZVAL_IS_REF(EX(object))) {
23674: Z_ADDREF_P(EX(object)); /* For $this pointer */
23675: } else {
23676: zval *this_ptr;
23677: ALLOC_ZVAL(this_ptr);
23678: INIT_PZVAL_COPY(this_ptr, EX(object));
23679: zval_copy_ctor(this_ptr);
23680: EX(object) = this_ptr;
23681: }
23682: }
23683:
23684: zval_dtor(free_op2.var);
23685:
1.1.1.2 misho 23686: CHECK_EXCEPTION();
1.1 misho 23687: ZEND_VM_NEXT_OPCODE();
23688: }
23689:
23690: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23691: {
1.1.1.2 misho 23692: USE_OPLINE
1.1 misho 23693:
1.1.1.2 misho 23694: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 23695: if (IS_UNUSED == IS_UNUSED) {
23696: ZEND_VM_NEXT_OPCODE();
23697: #if 0 || IS_UNUSED != IS_UNUSED
23698: } else {
23699: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23700: #endif
23701: }
23702: }
23703:
23704: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23705: {
1.1.1.2 misho 23706: USE_OPLINE
1.1 misho 23707: zend_free_op free_op2;
1.1.1.2 misho 23708: zval **container;
1.1 misho 23709: zval *offset;
1.1.1.2 misho 23710: ulong hval;
1.1 misho 23711:
1.1.1.2 misho 23712: SAVE_OPLINE();
23713: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 23714: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
23715: SEPARATE_ZVAL_IF_NOT_REF(container);
23716: }
1.1.1.2 misho 23717: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23718:
23719: if (IS_UNUSED != IS_VAR || container) {
23720: switch (Z_TYPE_PP(container)) {
23721: case IS_ARRAY: {
23722: HashTable *ht = Z_ARRVAL_PP(container);
23723:
23724: switch (Z_TYPE_P(offset)) {
23725: case IS_DOUBLE:
1.1.1.2 misho 23726: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 23727: zend_hash_index_del(ht, hval);
23728: break;
1.1 misho 23729: case IS_RESOURCE:
23730: case IS_BOOL:
23731: case IS_LONG:
1.1.1.2 misho 23732: hval = Z_LVAL_P(offset);
23733: zend_hash_index_del(ht, hval);
1.1 misho 23734: break;
23735: case IS_STRING:
23736: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
23737: Z_ADDREF_P(offset);
23738: }
1.1.1.2 misho 23739: if (IS_TMP_VAR == IS_CONST) {
23740: hval = Z_HASH_P(offset);
23741: } else {
23742: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
23743: if (IS_INTERNED(Z_STRVAL_P(offset))) {
23744: hval = INTERNED_HASH(Z_STRVAL_P(offset));
23745: } else {
23746: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 23747: }
23748: }
1.1.1.2 misho 23749: if (ht == &EG(symbol_table)) {
23750: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
23751: } else {
23752: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
23753: }
23754: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
23755: zval_ptr_dtor(&offset);
23756: }
23757: break;
23758: num_index_dim:
23759: zend_hash_index_del(ht, hval);
1.1 misho 23760: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
23761: zval_ptr_dtor(&offset);
23762: }
23763: break;
23764: case IS_NULL:
23765: zend_hash_del(ht, "", sizeof(""));
23766: break;
23767: default:
23768: zend_error(E_WARNING, "Illegal offset type in unset");
23769: break;
23770: }
23771: zval_dtor(free_op2.var);
23772: break;
23773: }
23774: case IS_OBJECT:
1.1.1.2 misho 23775: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 23776: zend_error_noreturn(E_ERROR, "Cannot use object as array");
23777: }
23778: if (1) {
23779: MAKE_REAL_ZVAL_PTR(offset);
23780: }
23781: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
23782: if (1) {
23783: zval_ptr_dtor(&offset);
23784: } else {
23785: zval_dtor(free_op2.var);
23786: }
23787: break;
23788: case IS_STRING:
23789: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
23790: ZEND_VM_CONTINUE(); /* bailed out before */
23791: default:
23792: zval_dtor(free_op2.var);
23793: break;
23794: }
23795: } else {
23796: zval_dtor(free_op2.var);
23797: }
23798:
1.1.1.2 misho 23799: CHECK_EXCEPTION();
1.1 misho 23800: ZEND_VM_NEXT_OPCODE();
23801: }
23802:
23803: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23804: {
1.1.1.2 misho 23805: USE_OPLINE
1.1 misho 23806: zend_free_op free_op2;
1.1.1.2 misho 23807: zval **container;
23808: zval *offset;
23809:
23810: SAVE_OPLINE();
23811: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
23812: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23813:
23814: if (IS_UNUSED != IS_VAR || container) {
23815: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
23816: SEPARATE_ZVAL_IF_NOT_REF(container);
23817: }
23818: if (Z_TYPE_PP(container) == IS_OBJECT) {
23819: if (1) {
23820: MAKE_REAL_ZVAL_PTR(offset);
23821: }
23822: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 23823: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23824: } else {
23825: zend_error(E_NOTICE, "Trying to unset property of non-object");
23826: }
23827: if (1) {
23828: zval_ptr_dtor(&offset);
23829: } else {
23830: zval_dtor(free_op2.var);
23831: }
23832: } else {
23833: zval_dtor(free_op2.var);
23834: }
23835: } else {
23836: zval_dtor(free_op2.var);
23837: }
23838:
1.1.1.2 misho 23839: CHECK_EXCEPTION();
1.1 misho 23840: ZEND_VM_NEXT_OPCODE();
23841: }
23842:
23843: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
23844: {
1.1.1.2 misho 23845: USE_OPLINE
23846: zend_free_op free_op2;
23847: zval **container;
1.1 misho 23848: zval **value = NULL;
23849: int result = 0;
1.1.1.2 misho 23850: ulong hval;
23851: zval *offset;
1.1 misho 23852:
1.1.1.2 misho 23853: SAVE_OPLINE();
23854: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 23855:
1.1.1.2 misho 23856: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 23857:
1.1.1.2 misho 23858: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
23859: HashTable *ht;
23860: int isset = 0;
1.1 misho 23861:
1.1.1.2 misho 23862: ht = Z_ARRVAL_PP(container);
23863:
23864: switch (Z_TYPE_P(offset)) {
23865: case IS_DOUBLE:
23866: hval = zend_dval_to_lval(Z_DVAL_P(offset));
23867: goto num_index_prop;
23868: case IS_RESOURCE:
23869: case IS_BOOL:
23870: case IS_LONG:
23871: hval = Z_LVAL_P(offset);
23872: num_index_prop:
23873: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
23874: isset = 1;
23875: }
23876: break;
23877: case IS_STRING:
23878: if (IS_TMP_VAR == IS_CONST) {
23879: hval = Z_HASH_P(offset);
23880: } else {
23881: if (!prop_dim) {
23882: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 23883: }
1.1.1.2 misho 23884: if (IS_INTERNED(Z_STRVAL_P(offset))) {
23885: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 23886: } else {
1.1.1.2 misho 23887: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 23888: }
1.1.1.2 misho 23889: }
23890: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
23891: isset = 1;
23892: }
23893: break;
23894: case IS_NULL:
23895: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
23896: isset = 1;
23897: }
23898: break;
23899: default:
23900: zend_error(E_WARNING, "Illegal offset type in isset or empty");
23901: break;
23902: }
23903:
23904: if (opline->extended_value & ZEND_ISSET) {
23905: if (isset && Z_TYPE_PP(value) == IS_NULL) {
23906: result = 0;
23907: } else {
23908: result = isset;
1.1 misho 23909: }
1.1.1.2 misho 23910: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
23911: if (!isset || !i_zend_is_true(*value)) {
23912: result = 0;
23913: } else {
23914: result = 1;
1.1 misho 23915: }
1.1.1.2 misho 23916: }
23917: zval_dtor(free_op2.var);
23918: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
23919: if (1) {
23920: MAKE_REAL_ZVAL_PTR(offset);
23921: }
23922: if (prop_dim) {
23923: if (Z_OBJ_HT_P(*container)->has_property) {
23924: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 23925: } else {
1.1.1.2 misho 23926: zend_error(E_NOTICE, "Trying to check property of non-object");
23927: result = 0;
1.1 misho 23928: }
1.1.1.2 misho 23929: } else {
23930: if (Z_OBJ_HT_P(*container)->has_dimension) {
23931: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 23932: } else {
1.1.1.2 misho 23933: zend_error(E_NOTICE, "Trying to check element of non-array");
23934: result = 0;
1.1 misho 23935: }
1.1.1.2 misho 23936: }
23937: if (1) {
23938: zval_ptr_dtor(&offset);
23939: } else {
23940: zval_dtor(free_op2.var);
23941: }
23942: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
23943: zval tmp;
1.1 misho 23944:
1.1.1.2 misho 23945: if (Z_TYPE_P(offset) != IS_LONG) {
23946: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
23947: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
23948: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
23949: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 23950: zval_copy_ctor(&tmp);
23951: convert_to_long(&tmp);
23952: offset = &tmp;
1.1.1.2 misho 23953: } else {
23954: /* can not be converted to proper offset, return "not set" */
23955: result = 0;
1.1 misho 23956: }
1.1.1.2 misho 23957: }
23958: if (Z_TYPE_P(offset) == IS_LONG) {
23959: if (opline->extended_value & ZEND_ISSET) {
23960: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
23961: result = 1;
23962: }
23963: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
23964: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
23965: result = 1;
1.1 misho 23966: }
23967: }
23968: }
1.1.1.2 misho 23969: zval_dtor(free_op2.var);
23970: } else {
23971: zval_dtor(free_op2.var);
1.1 misho 23972: }
23973:
1.1.1.2 misho 23974: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
23975: if (opline->extended_value & ZEND_ISSET) {
23976: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
23977: } else {
23978: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 23979: }
23980:
1.1.1.2 misho 23981: CHECK_EXCEPTION();
1.1 misho 23982: ZEND_VM_NEXT_OPCODE();
23983: }
23984:
23985: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23986: {
23987: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23988: }
23989:
23990: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
23991: {
23992: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
23993: }
23994:
23995: 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)
23996: {
1.1.1.2 misho 23997: USE_OPLINE
1.1 misho 23998: zend_free_op free_op2, free_op_data1;
23999: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24000: zval *object;
1.1.1.2 misho 24001: zval *property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24002: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 24003: int have_get_ptr = 0;
24004:
1.1.1.2 misho 24005: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 24006: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
24007: }
24008:
24009: make_real_object(object_ptr TSRMLS_CC);
24010: object = *object_ptr;
24011:
1.1.1.2 misho 24012: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 24013: zend_error(E_WARNING, "Attempt to assign property of non-object");
24014: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24015: FREE_OP(free_op_data1);
24016:
1.1.1.2 misho 24017: if (RETURN_VALUE_USED(opline)) {
24018: PZVAL_LOCK(&EG(uninitialized_zval));
24019: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
24020: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 24021: }
24022: } else {
24023: /* here we are sure we are dealing with an object */
24024: if (0) {
24025: MAKE_REAL_ZVAL_PTR(property);
24026: }
24027:
24028: /* here property is a string */
24029: if (opline->extended_value == ZEND_ASSIGN_OBJ
24030: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 24031: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24032: if (zptr != NULL) { /* NULL means no success in getting PTR */
24033: SEPARATE_ZVAL_IF_NOT_REF(zptr);
24034:
24035: have_get_ptr = 1;
24036: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 24037: if (RETURN_VALUE_USED(opline)) {
1.1 misho 24038: PZVAL_LOCK(*zptr);
1.1.1.2 misho 24039: EX_T(opline->result.var).var.ptr = *zptr;
24040: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 24041: }
24042: }
24043: }
24044:
24045: if (!have_get_ptr) {
24046: zval *z = NULL;
24047:
24048: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
24049: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 24050: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24051: }
24052: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
24053: if (Z_OBJ_HT_P(object)->read_dimension) {
24054: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
24055: }
24056: }
24057: if (z) {
24058: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
24059: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
24060:
24061: if (Z_REFCOUNT_P(z) == 0) {
24062: GC_REMOVE_ZVAL_FROM_BUFFER(z);
24063: zval_dtor(z);
24064: FREE_ZVAL(z);
24065: }
24066: z = value;
24067: }
24068: Z_ADDREF_P(z);
24069: SEPARATE_ZVAL_IF_NOT_REF(&z);
24070: binary_op(z, z, value TSRMLS_CC);
24071: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 24072: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24073: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
24074: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
24075: }
1.1.1.2 misho 24076: if (RETURN_VALUE_USED(opline)) {
1.1 misho 24077: PZVAL_LOCK(z);
1.1.1.2 misho 24078: EX_T(opline->result.var).var.ptr = z;
24079: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 24080: }
24081: zval_ptr_dtor(&z);
24082: } else {
24083: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 24084: if (RETURN_VALUE_USED(opline)) {
24085: PZVAL_LOCK(&EG(uninitialized_zval));
24086: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
24087: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 24088: }
24089: }
24090: }
24091:
24092: if (0) {
24093: zval_ptr_dtor(&property);
24094: } else {
24095: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24096: }
24097: FREE_OP(free_op_data1);
24098: }
24099:
24100: /* assign_obj has two opcodes! */
1.1.1.2 misho 24101: CHECK_EXCEPTION();
1.1 misho 24102: ZEND_VM_INC_OPCODE();
24103: ZEND_VM_NEXT_OPCODE();
24104: }
24105:
24106: 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)
24107: {
1.1.1.2 misho 24108: USE_OPLINE
1.1 misho 24109: zend_free_op free_op2, free_op_data2, free_op_data1;
24110: zval **var_ptr;
24111: zval *value;
24112:
1.1.1.2 misho 24113: SAVE_OPLINE();
1.1 misho 24114: switch (opline->extended_value) {
24115: case ZEND_ASSIGN_OBJ:
24116: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24117: break;
24118: case ZEND_ASSIGN_DIM: {
24119: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24120:
1.1.1.2 misho 24121: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 24122: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 24123: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 24124: if (IS_UNUSED == IS_VAR && !0) {
24125: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
24126: }
24127: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24128: } else {
1.1.1.2 misho 24129: zval *dim = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24130:
1.1.1.2 misho 24131: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
24132: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
24133: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 24134: }
24135: }
24136: break;
24137: default:
1.1.1.2 misho 24138: value = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24139: var_ptr = NULL;
24140: /* do nothing */
24141: break;
24142: }
24143:
1.1.1.2 misho 24144: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 24145: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
24146: }
24147:
1.1.1.2 misho 24148: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
24149: if (RETURN_VALUE_USED(opline)) {
24150: PZVAL_LOCK(&EG(uninitialized_zval));
24151: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 24152: }
24153: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24154:
1.1.1.2 misho 24155: CHECK_EXCEPTION();
24156: if (opline->extended_value == ZEND_ASSIGN_DIM) {
24157: ZEND_VM_INC_OPCODE();
24158: }
1.1 misho 24159: ZEND_VM_NEXT_OPCODE();
24160: }
24161:
24162: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
24163:
1.1.1.2 misho 24164: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
24165: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 24166: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
24167: /* proxy object */
24168: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
24169: Z_ADDREF_P(objval);
24170: binary_op(objval, objval, value TSRMLS_CC);
24171: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
24172: zval_ptr_dtor(&objval);
24173: } else {
24174: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
24175: }
24176:
1.1.1.2 misho 24177: if (RETURN_VALUE_USED(opline)) {
1.1 misho 24178: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 24179: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 24180: }
24181: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24182:
24183: if (opline->extended_value == ZEND_ASSIGN_DIM) {
24184: FREE_OP(free_op_data1);
24185: FREE_OP_VAR_PTR(free_op_data2);
24186:
1.1.1.2 misho 24187: CHECK_EXCEPTION();
24188: ZEND_VM_INC_OPCODE();
24189: } else {
24190:
24191: CHECK_EXCEPTION();
24192: }
1.1 misho 24193: ZEND_VM_NEXT_OPCODE();
24194: }
24195:
24196: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24197: {
24198: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24199: }
24200:
24201: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24202: {
24203: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24204: }
24205:
24206: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24207: {
24208: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24209: }
24210:
24211: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24212: {
24213: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24214: }
24215:
24216: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24217: {
24218: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24219: }
24220:
24221: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24222: {
24223: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24224: }
24225:
24226: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24227: {
24228: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24229: }
24230:
24231: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24232: {
24233: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24234: }
24235:
24236: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24237: {
24238: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24239: }
24240:
24241: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24242: {
24243: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24244: }
24245:
24246: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24247: {
24248: return zend_binary_assign_op_helper_SPEC_UNUSED_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24249: }
24250:
24251: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
24252: {
1.1.1.2 misho 24253: USE_OPLINE
1.1 misho 24254: zend_free_op free_op2;
1.1.1.2 misho 24255: zval **object_ptr;
1.1 misho 24256: zval *object;
1.1.1.2 misho 24257: zval *property;
24258: zval **retval;
1.1 misho 24259: int have_get_ptr = 0;
24260:
1.1.1.2 misho 24261: SAVE_OPLINE();
24262: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24263: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24264: retval = &EX_T(opline->result.var).var.ptr;
24265:
24266: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 24267: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
24268: }
24269:
24270: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
24271: object = *object_ptr;
24272:
1.1.1.2 misho 24273: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 24274: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
24275: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 24276: if (RETURN_VALUE_USED(opline)) {
24277: PZVAL_LOCK(&EG(uninitialized_zval));
24278: *retval = &EG(uninitialized_zval);
1.1 misho 24279: }
24280:
1.1.1.2 misho 24281: CHECK_EXCEPTION();
1.1 misho 24282: ZEND_VM_NEXT_OPCODE();
24283: }
24284:
24285: /* here we are sure we are dealing with an object */
24286:
24287: if (0) {
24288: MAKE_REAL_ZVAL_PTR(property);
24289: }
24290:
24291: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 24292: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24293: if (zptr != NULL) { /* NULL means no success in getting PTR */
24294: SEPARATE_ZVAL_IF_NOT_REF(zptr);
24295:
24296: have_get_ptr = 1;
24297: incdec_op(*zptr);
1.1.1.2 misho 24298: if (RETURN_VALUE_USED(opline)) {
1.1 misho 24299: *retval = *zptr;
24300: PZVAL_LOCK(*retval);
24301: }
24302: }
24303: }
24304:
24305: if (!have_get_ptr) {
24306: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 24307: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24308:
1.1.1.2 misho 24309: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 24310: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
24311:
24312: if (Z_REFCOUNT_P(z) == 0) {
24313: GC_REMOVE_ZVAL_FROM_BUFFER(z);
24314: zval_dtor(z);
24315: FREE_ZVAL(z);
24316: }
24317: z = value;
24318: }
24319: Z_ADDREF_P(z);
24320: SEPARATE_ZVAL_IF_NOT_REF(&z);
24321: incdec_op(z);
24322: *retval = z;
1.1.1.2 misho 24323: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
24324: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 24325: zval_ptr_dtor(&z);
24326: } else {
24327: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 24328: if (RETURN_VALUE_USED(opline)) {
24329: PZVAL_LOCK(&EG(uninitialized_zval));
24330: *retval = &EG(uninitialized_zval);
1.1 misho 24331: }
24332: }
24333: }
24334:
24335: if (0) {
24336: zval_ptr_dtor(&property);
24337: } else {
24338: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24339: }
24340:
1.1.1.2 misho 24341: CHECK_EXCEPTION();
1.1 misho 24342: ZEND_VM_NEXT_OPCODE();
24343: }
24344:
24345: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24346: {
24347: return zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24348: }
24349:
24350: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24351: {
24352: return zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24353: }
24354:
24355: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
24356: {
1.1.1.2 misho 24357: USE_OPLINE
1.1 misho 24358: zend_free_op free_op2;
1.1.1.2 misho 24359: zval **object_ptr;
1.1 misho 24360: zval *object;
1.1.1.2 misho 24361: zval *property;
24362: zval *retval;
1.1 misho 24363: int have_get_ptr = 0;
24364:
1.1.1.2 misho 24365: SAVE_OPLINE();
24366: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24367: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24368: retval = &EX_T(opline->result.var).tmp_var;
24369:
24370: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 24371: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
24372: }
24373:
24374: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
24375: object = *object_ptr;
24376:
1.1.1.2 misho 24377: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 24378: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
24379: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 24380: ZVAL_NULL(retval);
1.1 misho 24381:
1.1.1.2 misho 24382: CHECK_EXCEPTION();
1.1 misho 24383: ZEND_VM_NEXT_OPCODE();
24384: }
24385:
24386: /* here we are sure we are dealing with an object */
24387:
24388: if (0) {
24389: MAKE_REAL_ZVAL_PTR(property);
24390: }
24391:
24392: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 24393: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24394: if (zptr != NULL) { /* NULL means no success in getting PTR */
24395: have_get_ptr = 1;
24396: SEPARATE_ZVAL_IF_NOT_REF(zptr);
24397:
1.1.1.2 misho 24398: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 24399: zendi_zval_copy_ctor(*retval);
24400:
24401: incdec_op(*zptr);
24402:
24403: }
24404: }
24405:
24406: if (!have_get_ptr) {
24407: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 24408: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24409: zval *z_copy;
24410:
1.1.1.2 misho 24411: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 24412: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
24413:
24414: if (Z_REFCOUNT_P(z) == 0) {
24415: GC_REMOVE_ZVAL_FROM_BUFFER(z);
24416: zval_dtor(z);
24417: FREE_ZVAL(z);
24418: }
24419: z = value;
24420: }
1.1.1.2 misho 24421: ZVAL_COPY_VALUE(retval, z);
1.1 misho 24422: zendi_zval_copy_ctor(*retval);
24423: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 24424: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 24425: zendi_zval_copy_ctor(*z_copy);
24426: incdec_op(z_copy);
24427: Z_ADDREF_P(z);
1.1.1.2 misho 24428: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24429: zval_ptr_dtor(&z_copy);
24430: zval_ptr_dtor(&z);
24431: } else {
24432: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 24433: ZVAL_NULL(retval);
1.1 misho 24434: }
24435: }
24436:
24437: if (0) {
24438: zval_ptr_dtor(&property);
24439: } else {
24440: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24441: }
24442:
1.1.1.2 misho 24443: CHECK_EXCEPTION();
1.1 misho 24444: ZEND_VM_NEXT_OPCODE();
24445: }
24446:
24447: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24448: {
24449: return zend_post_incdec_property_helper_SPEC_UNUSED_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24450: }
24451:
24452: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24453: {
24454: return zend_post_incdec_property_helper_SPEC_UNUSED_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24455: }
24456:
1.1.1.2 misho 24457: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 24458: {
1.1.1.2 misho 24459: USE_OPLINE
1.1 misho 24460:
1.1.1.2 misho 24461: zval *container;
1.1 misho 24462: zend_free_op free_op2;
1.1.1.2 misho 24463: zval *offset;
1.1 misho 24464:
1.1.1.2 misho 24465: SAVE_OPLINE();
24466: container = _get_obj_zval_ptr_unused(TSRMLS_C);
24467: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24468:
24469: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
24470: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
24471: zend_error(E_NOTICE, "Trying to get property of non-object");
24472: PZVAL_LOCK(&EG(uninitialized_zval));
24473: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 24474: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24475: } else {
24476: zval *retval;
24477:
24478: if (0) {
24479: MAKE_REAL_ZVAL_PTR(offset);
24480: }
24481:
24482: /* here we are sure we are dealing with an object */
1.1.1.2 misho 24483: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24484:
1.1.1.2 misho 24485: PZVAL_LOCK(retval);
24486: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 24487:
24488: if (0) {
24489: zval_ptr_dtor(&offset);
24490: } else {
24491: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24492: }
24493: }
24494:
1.1.1.2 misho 24495: CHECK_EXCEPTION();
1.1 misho 24496: ZEND_VM_NEXT_OPCODE();
24497: }
24498:
24499: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24500: {
1.1.1.2 misho 24501: return zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 24502: }
24503:
24504: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24505: {
1.1.1.2 misho 24506: USE_OPLINE
1.1 misho 24507: zend_free_op free_op1, free_op2;
1.1.1.2 misho 24508: zval *property;
1.1 misho 24509: zval **container;
24510:
1.1.1.2 misho 24511: SAVE_OPLINE();
24512: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24513:
1.1 misho 24514: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 24515: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
24516: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 24517: }
24518:
24519: if (0) {
24520: MAKE_REAL_ZVAL_PTR(property);
24521: }
24522: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1.1.2 misho 24523: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 24524: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
24525: }
1.1.1.2 misho 24526:
24527: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 24528: if (0) {
24529: zval_ptr_dtor(&property);
24530: } else {
24531: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24532: }
1.1.1.2 misho 24533: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
24534: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 24535: }
24536:
24537: /* We are going to assign the result by reference */
24538: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 24539: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
24540:
24541: Z_DELREF_PP(retval_ptr);
24542: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
24543: Z_ADDREF_PP(retval_ptr);
24544: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
24545: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 24546: }
24547:
1.1.1.2 misho 24548: CHECK_EXCEPTION();
1.1 misho 24549: ZEND_VM_NEXT_OPCODE();
24550: }
24551:
24552: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24553: {
1.1.1.2 misho 24554: USE_OPLINE
1.1 misho 24555: zend_free_op free_op1, free_op2;
1.1.1.2 misho 24556: zval *property;
24557: zval **container;
24558:
24559: SAVE_OPLINE();
24560: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24561: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 24562:
24563: if (0) {
24564: MAKE_REAL_ZVAL_PTR(property);
24565: }
1.1.1.2 misho 24566: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 24567: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
24568: }
1.1.1.2 misho 24569: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 24570: if (0) {
24571: zval_ptr_dtor(&property);
24572: } else {
24573: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24574: }
1.1.1.2 misho 24575: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
24576: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 24577: }
24578:
1.1.1.2 misho 24579: CHECK_EXCEPTION();
1.1 misho 24580: ZEND_VM_NEXT_OPCODE();
24581: }
24582:
24583: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24584: {
1.1.1.2 misho 24585: USE_OPLINE
24586:
24587: zval *container;
24588: zend_free_op free_op2;
24589: zval *offset;
24590:
24591: SAVE_OPLINE();
24592: container = _get_obj_zval_ptr_unused(TSRMLS_C);
24593: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24594:
24595: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
24596: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
24597: PZVAL_LOCK(&EG(uninitialized_zval));
24598: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
24599: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24600: } else {
24601: zval *retval;
24602:
24603: if (0) {
24604: MAKE_REAL_ZVAL_PTR(offset);
24605: }
24606:
24607: /* here we are sure we are dealing with an object */
24608: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
24609:
24610: PZVAL_LOCK(retval);
24611: AI_SET_PTR(&EX_T(opline->result.var), retval);
24612:
24613: if (0) {
24614: zval_ptr_dtor(&offset);
24615: } else {
24616: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24617: }
24618: }
24619:
24620: CHECK_EXCEPTION();
24621: ZEND_VM_NEXT_OPCODE();
1.1 misho 24622: }
24623:
24624: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24625: {
1.1.1.2 misho 24626: USE_OPLINE
1.1 misho 24627:
1.1.1.2 misho 24628: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 24629: /* Behave like FETCH_OBJ_W */
24630: zend_free_op free_op1, free_op2;
1.1.1.2 misho 24631: zval *property;
24632: zval **container;
24633:
24634: SAVE_OPLINE();
24635: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24636: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 24637:
24638: if (0) {
24639: MAKE_REAL_ZVAL_PTR(property);
24640: }
1.1.1.2 misho 24641: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 24642: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
24643: }
1.1.1.2 misho 24644: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 24645: if (0) {
24646: zval_ptr_dtor(&property);
24647: } else {
24648: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24649: }
1.1.1.2 misho 24650: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
24651: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 24652: }
24653:
1.1.1.2 misho 24654: CHECK_EXCEPTION();
1.1 misho 24655: ZEND_VM_NEXT_OPCODE();
24656: } else {
1.1.1.2 misho 24657: return zend_fetch_property_address_read_helper_SPEC_UNUSED_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 24658: }
24659: }
24660:
24661: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24662: {
1.1.1.2 misho 24663: USE_OPLINE
1.1 misho 24664: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 24665: zval **container;
24666: zval *property;
24667:
24668: SAVE_OPLINE();
24669: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24670: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24671:
24672: if (IS_UNUSED == IS_CV) {
24673: if (container != &EG(uninitialized_zval_ptr)) {
24674: SEPARATE_ZVAL_IF_NOT_REF(container);
24675: }
24676: }
24677: if (0) {
24678: MAKE_REAL_ZVAL_PTR(property);
24679: }
1.1.1.2 misho 24680: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 24681: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
24682: }
1.1.1.2 misho 24683: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 24684: if (0) {
24685: zval_ptr_dtor(&property);
24686: } else {
24687: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24688: }
1.1.1.2 misho 24689: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
24690: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 24691: }
24692:
1.1.1.2 misho 24693: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
24694: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
24695: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 24696: }
1.1.1.2 misho 24697: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 24698: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 24699: CHECK_EXCEPTION();
1.1 misho 24700: ZEND_VM_NEXT_OPCODE();
24701: }
24702:
24703: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24704: {
1.1.1.2 misho 24705: USE_OPLINE
1.1 misho 24706: zend_free_op free_op2;
1.1.1.2 misho 24707: zval **object_ptr;
24708: zval *property_name;
24709:
24710: SAVE_OPLINE();
24711: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24712: property_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24713:
24714: if (0) {
24715: MAKE_REAL_ZVAL_PTR(property_name);
24716: }
1.1.1.2 misho 24717: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 24718: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
24719: }
1.1.1.2 misho 24720: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24721: if (0) {
24722: zval_ptr_dtor(&property_name);
24723: } else {
24724: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24725: }
24726:
24727: /* assign_obj has two opcodes! */
1.1.1.2 misho 24728: CHECK_EXCEPTION();
1.1 misho 24729: ZEND_VM_INC_OPCODE();
24730: ZEND_VM_NEXT_OPCODE();
24731: }
24732:
24733: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24734: {
1.1.1.2 misho 24735: USE_OPLINE
1.1 misho 24736: zend_free_op free_op2;
1.1.1.2 misho 24737: zval *str = &EX_T(opline->result.var).tmp_var;
24738: zval *var;
1.1 misho 24739: zval var_copy;
24740: int use_copy = 0;
24741:
1.1.1.2 misho 24742: SAVE_OPLINE();
24743: var = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
24744:
1.1 misho 24745: if (IS_UNUSED == IS_UNUSED) {
24746: /* Initialize for erealloc in add_string_to_string */
24747: Z_STRVAL_P(str) = NULL;
24748: Z_STRLEN_P(str) = 0;
24749: Z_TYPE_P(str) = IS_STRING;
24750:
24751: INIT_PZVAL(str);
24752: }
24753:
24754: if (Z_TYPE_P(var) != IS_STRING) {
24755: zend_make_printable_zval(var, &var_copy, &use_copy);
24756:
24757: if (use_copy) {
24758: var = &var_copy;
24759: }
24760: }
24761: add_string_to_string(str, str, var);
24762:
24763: if (use_copy) {
24764: zval_dtor(var);
24765: }
24766: /* original comment, possibly problematic:
24767: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
24768: * (Zeev): I don't think it's problematic, we only use variables
24769: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
24770: * string offsets or overloaded objects
24771: */
24772: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24773:
1.1.1.2 misho 24774: CHECK_EXCEPTION();
1.1 misho 24775: ZEND_VM_NEXT_OPCODE();
24776: }
24777:
24778: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24779: {
1.1.1.2 misho 24780: USE_OPLINE
1.1 misho 24781: zval *function_name;
24782: char *function_name_strval;
24783: int function_name_strlen;
24784: zend_free_op free_op2;
24785:
1.1.1.2 misho 24786: SAVE_OPLINE();
1.1 misho 24787: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
24788:
1.1.1.2 misho 24789: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24790:
1.1.1.2 misho 24791: if (IS_VAR != IS_CONST &&
24792: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 24793: zend_error_noreturn(E_ERROR, "Method name must be a string");
24794: }
24795:
24796: function_name_strval = Z_STRVAL_P(function_name);
24797: function_name_strlen = Z_STRLEN_P(function_name);
24798:
24799: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
24800:
1.1.1.2 misho 24801: if (EXPECTED(EX(object) != NULL) &&
24802: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
24803: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 24804:
1.1.1.2 misho 24805: if (IS_VAR != IS_CONST ||
24806: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
24807: zval *object = EX(object);
24808:
24809: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
24810: zend_error_noreturn(E_ERROR, "Object does not support method calls");
24811: }
24812:
24813: /* First, locate the function. */
24814: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
24815: if (UNEXPECTED(EX(fbc) == NULL)) {
24816: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
24817: }
24818: if (IS_VAR == IS_CONST &&
24819: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
24820: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
24821: EXPECTED(EX(object) == object)) {
24822: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
24823: }
1.1 misho 24824: }
24825: } else {
24826: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
24827: }
24828:
24829: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
24830: EX(object) = NULL;
24831: } else {
24832: if (!PZVAL_IS_REF(EX(object))) {
24833: Z_ADDREF_P(EX(object)); /* For $this pointer */
24834: } else {
24835: zval *this_ptr;
24836: ALLOC_ZVAL(this_ptr);
24837: INIT_PZVAL_COPY(this_ptr, EX(object));
24838: zval_copy_ctor(this_ptr);
24839: EX(object) = this_ptr;
24840: }
24841: }
24842:
24843: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24844:
1.1.1.2 misho 24845: CHECK_EXCEPTION();
1.1 misho 24846: ZEND_VM_NEXT_OPCODE();
24847: }
24848:
24849: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24850: {
1.1.1.2 misho 24851: USE_OPLINE
1.1 misho 24852:
1.1.1.2 misho 24853: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 24854: if (IS_UNUSED == IS_UNUSED) {
24855: ZEND_VM_NEXT_OPCODE();
24856: #if 0 || IS_UNUSED != IS_UNUSED
24857: } else {
24858: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
24859: #endif
24860: }
24861: }
24862:
24863: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24864: {
1.1.1.2 misho 24865: USE_OPLINE
1.1 misho 24866: zend_free_op free_op2;
1.1.1.2 misho 24867: zval **container;
1.1 misho 24868: zval *offset;
1.1.1.2 misho 24869: ulong hval;
1.1 misho 24870:
1.1.1.2 misho 24871: SAVE_OPLINE();
24872: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 24873: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
24874: SEPARATE_ZVAL_IF_NOT_REF(container);
24875: }
1.1.1.2 misho 24876: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24877:
24878: if (IS_UNUSED != IS_VAR || container) {
24879: switch (Z_TYPE_PP(container)) {
24880: case IS_ARRAY: {
24881: HashTable *ht = Z_ARRVAL_PP(container);
24882:
24883: switch (Z_TYPE_P(offset)) {
24884: case IS_DOUBLE:
1.1.1.2 misho 24885: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 24886: zend_hash_index_del(ht, hval);
24887: break;
1.1 misho 24888: case IS_RESOURCE:
24889: case IS_BOOL:
24890: case IS_LONG:
1.1.1.2 misho 24891: hval = Z_LVAL_P(offset);
24892: zend_hash_index_del(ht, hval);
1.1 misho 24893: break;
24894: case IS_STRING:
24895: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
24896: Z_ADDREF_P(offset);
24897: }
1.1.1.2 misho 24898: if (IS_VAR == IS_CONST) {
24899: hval = Z_HASH_P(offset);
24900: } else {
24901: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
24902: if (IS_INTERNED(Z_STRVAL_P(offset))) {
24903: hval = INTERNED_HASH(Z_STRVAL_P(offset));
24904: } else {
24905: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 24906: }
24907: }
1.1.1.2 misho 24908: if (ht == &EG(symbol_table)) {
24909: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
24910: } else {
24911: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
24912: }
24913: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
24914: zval_ptr_dtor(&offset);
24915: }
24916: break;
24917: num_index_dim:
24918: zend_hash_index_del(ht, hval);
1.1 misho 24919: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
24920: zval_ptr_dtor(&offset);
24921: }
24922: break;
24923: case IS_NULL:
24924: zend_hash_del(ht, "", sizeof(""));
24925: break;
24926: default:
24927: zend_error(E_WARNING, "Illegal offset type in unset");
24928: break;
24929: }
24930: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24931: break;
24932: }
24933: case IS_OBJECT:
1.1.1.2 misho 24934: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 24935: zend_error_noreturn(E_ERROR, "Cannot use object as array");
24936: }
24937: if (0) {
24938: MAKE_REAL_ZVAL_PTR(offset);
24939: }
24940: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
24941: if (0) {
24942: zval_ptr_dtor(&offset);
24943: } else {
24944: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24945: }
24946: break;
24947: case IS_STRING:
24948: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
24949: ZEND_VM_CONTINUE(); /* bailed out before */
24950: default:
24951: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24952: break;
24953: }
24954: } else {
24955: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24956: }
24957:
1.1.1.2 misho 24958: CHECK_EXCEPTION();
1.1 misho 24959: ZEND_VM_NEXT_OPCODE();
24960: }
24961:
24962: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
24963: {
1.1.1.2 misho 24964: USE_OPLINE
1.1 misho 24965: zend_free_op free_op2;
1.1.1.2 misho 24966: zval **container;
24967: zval *offset;
24968:
24969: SAVE_OPLINE();
24970: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
24971: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 24972:
24973: if (IS_UNUSED != IS_VAR || container) {
24974: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
24975: SEPARATE_ZVAL_IF_NOT_REF(container);
24976: }
24977: if (Z_TYPE_PP(container) == IS_OBJECT) {
24978: if (0) {
24979: MAKE_REAL_ZVAL_PTR(offset);
24980: }
24981: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 24982: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 24983: } else {
24984: zend_error(E_NOTICE, "Trying to unset property of non-object");
24985: }
24986: if (0) {
24987: zval_ptr_dtor(&offset);
24988: } else {
24989: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24990: }
24991: } else {
24992: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24993: }
24994: } else {
24995: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
24996: }
24997:
1.1.1.2 misho 24998: CHECK_EXCEPTION();
1.1 misho 24999: ZEND_VM_NEXT_OPCODE();
25000: }
25001:
25002: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
25003: {
1.1.1.2 misho 25004: USE_OPLINE
25005: zend_free_op free_op2;
25006: zval **container;
1.1 misho 25007: zval **value = NULL;
25008: int result = 0;
1.1.1.2 misho 25009: ulong hval;
25010: zval *offset;
1.1 misho 25011:
1.1.1.2 misho 25012: SAVE_OPLINE();
25013: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 25014:
1.1.1.2 misho 25015: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 25016:
1.1.1.2 misho 25017: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
25018: HashTable *ht;
25019: int isset = 0;
1.1 misho 25020:
1.1.1.2 misho 25021: ht = Z_ARRVAL_PP(container);
25022:
25023: switch (Z_TYPE_P(offset)) {
25024: case IS_DOUBLE:
25025: hval = zend_dval_to_lval(Z_DVAL_P(offset));
25026: goto num_index_prop;
25027: case IS_RESOURCE:
25028: case IS_BOOL:
25029: case IS_LONG:
25030: hval = Z_LVAL_P(offset);
25031: num_index_prop:
25032: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
25033: isset = 1;
25034: }
25035: break;
25036: case IS_STRING:
25037: if (IS_VAR == IS_CONST) {
25038: hval = Z_HASH_P(offset);
25039: } else {
25040: if (!prop_dim) {
25041: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 25042: }
1.1.1.2 misho 25043: if (IS_INTERNED(Z_STRVAL_P(offset))) {
25044: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 25045: } else {
1.1.1.2 misho 25046: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 25047: }
1.1.1.2 misho 25048: }
25049: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
25050: isset = 1;
25051: }
25052: break;
25053: case IS_NULL:
25054: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
25055: isset = 1;
25056: }
25057: break;
25058: default:
25059: zend_error(E_WARNING, "Illegal offset type in isset or empty");
25060: break;
25061: }
25062:
25063: if (opline->extended_value & ZEND_ISSET) {
25064: if (isset && Z_TYPE_PP(value) == IS_NULL) {
25065: result = 0;
25066: } else {
25067: result = isset;
1.1 misho 25068: }
1.1.1.2 misho 25069: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
25070: if (!isset || !i_zend_is_true(*value)) {
25071: result = 0;
25072: } else {
25073: result = 1;
1.1 misho 25074: }
1.1.1.2 misho 25075: }
25076: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
25077: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
25078: if (0) {
25079: MAKE_REAL_ZVAL_PTR(offset);
25080: }
25081: if (prop_dim) {
25082: if (Z_OBJ_HT_P(*container)->has_property) {
25083: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25084: } else {
1.1.1.2 misho 25085: zend_error(E_NOTICE, "Trying to check property of non-object");
25086: result = 0;
1.1 misho 25087: }
1.1.1.2 misho 25088: } else {
25089: if (Z_OBJ_HT_P(*container)->has_dimension) {
25090: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 25091: } else {
1.1.1.2 misho 25092: zend_error(E_NOTICE, "Trying to check element of non-array");
25093: result = 0;
1.1 misho 25094: }
1.1.1.2 misho 25095: }
25096: if (0) {
25097: zval_ptr_dtor(&offset);
25098: } else {
25099: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
25100: }
25101: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
25102: zval tmp;
1.1 misho 25103:
1.1.1.2 misho 25104: if (Z_TYPE_P(offset) != IS_LONG) {
25105: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
25106: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
25107: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
25108: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 25109: zval_copy_ctor(&tmp);
25110: convert_to_long(&tmp);
25111: offset = &tmp;
1.1.1.2 misho 25112: } else {
25113: /* can not be converted to proper offset, return "not set" */
25114: result = 0;
1.1 misho 25115: }
1.1.1.2 misho 25116: }
25117: if (Z_TYPE_P(offset) == IS_LONG) {
25118: if (opline->extended_value & ZEND_ISSET) {
25119: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
25120: result = 1;
25121: }
25122: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
25123: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
25124: result = 1;
1.1 misho 25125: }
25126: }
25127: }
1.1.1.2 misho 25128: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
25129: } else {
25130: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 25131: }
25132:
1.1.1.2 misho 25133: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
25134: if (opline->extended_value & ZEND_ISSET) {
25135: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
25136: } else {
25137: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 25138: }
25139:
1.1.1.2 misho 25140: CHECK_EXCEPTION();
1.1 misho 25141: ZEND_VM_NEXT_OPCODE();
25142: }
25143:
25144: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25145: {
25146: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25147: }
25148:
25149: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25150: {
25151: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25152: }
25153:
25154: 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)
25155: {
1.1.1.2 misho 25156: USE_OPLINE
1.1 misho 25157: zend_free_op free_op_data1;
25158: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25159: zval *object;
25160: zval *property = NULL;
1.1.1.2 misho 25161: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 25162: int have_get_ptr = 0;
25163:
1.1.1.2 misho 25164: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 25165: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
25166: }
25167:
25168: make_real_object(object_ptr TSRMLS_CC);
25169: object = *object_ptr;
25170:
1.1.1.2 misho 25171: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 25172: zend_error(E_WARNING, "Attempt to assign property of non-object");
25173:
25174: FREE_OP(free_op_data1);
25175:
1.1.1.2 misho 25176: if (RETURN_VALUE_USED(opline)) {
25177: PZVAL_LOCK(&EG(uninitialized_zval));
25178: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
25179: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25180: }
25181: } else {
25182: /* here we are sure we are dealing with an object */
25183: if (0) {
25184: MAKE_REAL_ZVAL_PTR(property);
25185: }
25186:
25187: /* here property is a string */
25188: if (opline->extended_value == ZEND_ASSIGN_OBJ
25189: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 25190: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25191: if (zptr != NULL) { /* NULL means no success in getting PTR */
25192: SEPARATE_ZVAL_IF_NOT_REF(zptr);
25193:
25194: have_get_ptr = 1;
25195: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 25196: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25197: PZVAL_LOCK(*zptr);
1.1.1.2 misho 25198: EX_T(opline->result.var).var.ptr = *zptr;
25199: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25200: }
25201: }
25202: }
25203:
25204: if (!have_get_ptr) {
25205: zval *z = NULL;
25206:
25207: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
25208: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 25209: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25210: }
25211: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
25212: if (Z_OBJ_HT_P(object)->read_dimension) {
25213: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
25214: }
25215: }
25216: if (z) {
25217: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
25218: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
25219:
25220: if (Z_REFCOUNT_P(z) == 0) {
25221: GC_REMOVE_ZVAL_FROM_BUFFER(z);
25222: zval_dtor(z);
25223: FREE_ZVAL(z);
25224: }
25225: z = value;
25226: }
25227: Z_ADDREF_P(z);
25228: SEPARATE_ZVAL_IF_NOT_REF(&z);
25229: binary_op(z, z, value TSRMLS_CC);
25230: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 25231: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25232: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
25233: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
25234: }
1.1.1.2 misho 25235: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25236: PZVAL_LOCK(z);
1.1.1.2 misho 25237: EX_T(opline->result.var).var.ptr = z;
25238: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25239: }
25240: zval_ptr_dtor(&z);
25241: } else {
25242: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 25243: if (RETURN_VALUE_USED(opline)) {
25244: PZVAL_LOCK(&EG(uninitialized_zval));
25245: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
25246: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25247: }
25248: }
25249: }
25250:
25251: if (0) {
25252: zval_ptr_dtor(&property);
25253: } else {
25254:
25255: }
25256: FREE_OP(free_op_data1);
25257: }
25258:
25259: /* assign_obj has two opcodes! */
1.1.1.2 misho 25260: CHECK_EXCEPTION();
1.1 misho 25261: ZEND_VM_INC_OPCODE();
25262: ZEND_VM_NEXT_OPCODE();
25263: }
25264:
25265: 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)
25266: {
1.1.1.2 misho 25267: USE_OPLINE
1.1 misho 25268: zend_free_op free_op_data2, free_op_data1;
25269: zval **var_ptr;
25270: zval *value;
25271:
1.1.1.2 misho 25272: SAVE_OPLINE();
1.1 misho 25273: switch (opline->extended_value) {
25274: case ZEND_ASSIGN_OBJ:
25275: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25276: break;
25277: case ZEND_ASSIGN_DIM: {
25278: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25279:
1.1.1.2 misho 25280: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 25281: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 25282: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 25283: if (IS_UNUSED == IS_VAR && !0) {
25284: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
25285: }
25286: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25287: } else {
25288: zval *dim = NULL;
25289:
1.1.1.2 misho 25290: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
25291: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
25292: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 25293: }
25294: }
25295: break;
25296: default:
25297: value = NULL;
25298: var_ptr = NULL;
25299: /* do nothing */
25300: break;
25301: }
25302:
1.1.1.2 misho 25303: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 25304: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
25305: }
25306:
1.1.1.2 misho 25307: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
25308: if (RETURN_VALUE_USED(opline)) {
25309: PZVAL_LOCK(&EG(uninitialized_zval));
25310: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 25311: }
25312:
25313:
1.1.1.2 misho 25314: CHECK_EXCEPTION();
25315: if (opline->extended_value == ZEND_ASSIGN_DIM) {
25316: ZEND_VM_INC_OPCODE();
25317: }
1.1 misho 25318: ZEND_VM_NEXT_OPCODE();
25319: }
25320:
25321: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
25322:
1.1.1.2 misho 25323: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
25324: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 25325: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
25326: /* proxy object */
25327: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
25328: Z_ADDREF_P(objval);
25329: binary_op(objval, objval, value TSRMLS_CC);
25330: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
25331: zval_ptr_dtor(&objval);
25332: } else {
25333: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
25334: }
25335:
1.1.1.2 misho 25336: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25337: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 25338: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 25339: }
25340:
25341: if (opline->extended_value == ZEND_ASSIGN_DIM) {
25342: FREE_OP(free_op_data1);
25343: FREE_OP_VAR_PTR(free_op_data2);
25344:
1.1.1.2 misho 25345: CHECK_EXCEPTION();
25346: ZEND_VM_INC_OPCODE();
25347: } else {
25348:
25349: CHECK_EXCEPTION();
25350: }
1.1 misho 25351: ZEND_VM_NEXT_OPCODE();
25352: }
25353:
25354: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25355: {
25356: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25357: }
25358:
25359: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25360: {
25361: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25362: }
25363:
25364: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25365: {
25366: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25367: }
25368:
25369: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25370: {
25371: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25372: }
25373:
25374: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25375: {
25376: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25377: }
25378:
25379: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25380: {
25381: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25382: }
25383:
25384: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25385: {
25386: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25387: }
25388:
25389: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25390: {
25391: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25392: }
25393:
25394: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25395: {
25396: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25397: }
25398:
25399: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25400: {
25401: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25402: }
25403:
25404: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25405: {
25406: return zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25407: }
25408:
25409: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25410: {
1.1.1.2 misho 25411: USE_OPLINE
1.1 misho 25412:
1.1.1.2 misho 25413: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 25414: if (IS_UNUSED == IS_UNUSED) {
25415: ZEND_VM_NEXT_OPCODE();
25416: #if 0 || IS_UNUSED != IS_UNUSED
25417: } else {
25418: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25419: #endif
25420: }
25421: }
25422:
25423: 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)
25424: {
1.1.1.2 misho 25425: USE_OPLINE
1.1 misho 25426: zend_free_op free_op_data1;
25427: zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25428: zval *object;
1.1.1.2 misho 25429: zval *property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25430: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 25431: int have_get_ptr = 0;
25432:
1.1.1.2 misho 25433: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 25434: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
25435: }
25436:
25437: make_real_object(object_ptr TSRMLS_CC);
25438: object = *object_ptr;
25439:
1.1.1.2 misho 25440: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 25441: zend_error(E_WARNING, "Attempt to assign property of non-object");
25442:
25443: FREE_OP(free_op_data1);
25444:
1.1.1.2 misho 25445: if (RETURN_VALUE_USED(opline)) {
25446: PZVAL_LOCK(&EG(uninitialized_zval));
25447: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
25448: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25449: }
25450: } else {
25451: /* here we are sure we are dealing with an object */
25452: if (0) {
25453: MAKE_REAL_ZVAL_PTR(property);
25454: }
25455:
25456: /* here property is a string */
25457: if (opline->extended_value == ZEND_ASSIGN_OBJ
25458: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 25459: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25460: if (zptr != NULL) { /* NULL means no success in getting PTR */
25461: SEPARATE_ZVAL_IF_NOT_REF(zptr);
25462:
25463: have_get_ptr = 1;
25464: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 25465: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25466: PZVAL_LOCK(*zptr);
1.1.1.2 misho 25467: EX_T(opline->result.var).var.ptr = *zptr;
25468: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25469: }
25470: }
25471: }
25472:
25473: if (!have_get_ptr) {
25474: zval *z = NULL;
25475:
25476: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
25477: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 25478: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25479: }
25480: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
25481: if (Z_OBJ_HT_P(object)->read_dimension) {
25482: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
25483: }
25484: }
25485: if (z) {
25486: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
25487: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
25488:
25489: if (Z_REFCOUNT_P(z) == 0) {
25490: GC_REMOVE_ZVAL_FROM_BUFFER(z);
25491: zval_dtor(z);
25492: FREE_ZVAL(z);
25493: }
25494: z = value;
25495: }
25496: Z_ADDREF_P(z);
25497: SEPARATE_ZVAL_IF_NOT_REF(&z);
25498: binary_op(z, z, value TSRMLS_CC);
25499: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 25500: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25501: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
25502: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
25503: }
1.1.1.2 misho 25504: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25505: PZVAL_LOCK(z);
1.1.1.2 misho 25506: EX_T(opline->result.var).var.ptr = z;
25507: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25508: }
25509: zval_ptr_dtor(&z);
25510: } else {
25511: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 25512: if (RETURN_VALUE_USED(opline)) {
25513: PZVAL_LOCK(&EG(uninitialized_zval));
25514: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
25515: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 25516: }
25517: }
25518: }
25519:
25520: if (0) {
25521: zval_ptr_dtor(&property);
25522: } else {
25523:
25524: }
25525: FREE_OP(free_op_data1);
25526: }
25527:
25528: /* assign_obj has two opcodes! */
1.1.1.2 misho 25529: CHECK_EXCEPTION();
1.1 misho 25530: ZEND_VM_INC_OPCODE();
25531: ZEND_VM_NEXT_OPCODE();
25532: }
25533:
25534: 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)
25535: {
1.1.1.2 misho 25536: USE_OPLINE
1.1 misho 25537: zend_free_op free_op_data2, free_op_data1;
25538: zval **var_ptr;
25539: zval *value;
25540:
1.1.1.2 misho 25541: SAVE_OPLINE();
1.1 misho 25542: switch (opline->extended_value) {
25543: case ZEND_ASSIGN_OBJ:
25544: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25545: break;
25546: case ZEND_ASSIGN_DIM: {
25547: zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25548:
1.1.1.2 misho 25549: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 25550: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 25551: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 25552: if (IS_UNUSED == IS_VAR && !0) {
25553: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
25554: }
25555: return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25556: } else {
1.1.1.2 misho 25557: zval *dim = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 25558:
1.1.1.2 misho 25559: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
25560: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
25561: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 25562: }
25563: }
25564: break;
25565: default:
1.1.1.2 misho 25566: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 25567: var_ptr = NULL;
25568: /* do nothing */
25569: break;
25570: }
25571:
1.1.1.2 misho 25572: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 25573: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
25574: }
25575:
1.1.1.2 misho 25576: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
25577: if (RETURN_VALUE_USED(opline)) {
25578: PZVAL_LOCK(&EG(uninitialized_zval));
25579: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 25580: }
25581:
25582:
1.1.1.2 misho 25583: CHECK_EXCEPTION();
25584: if (opline->extended_value == ZEND_ASSIGN_DIM) {
25585: ZEND_VM_INC_OPCODE();
25586: }
1.1 misho 25587: ZEND_VM_NEXT_OPCODE();
25588: }
25589:
25590: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
25591:
1.1.1.2 misho 25592: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
25593: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 25594: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
25595: /* proxy object */
25596: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
25597: Z_ADDREF_P(objval);
25598: binary_op(objval, objval, value TSRMLS_CC);
25599: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
25600: zval_ptr_dtor(&objval);
25601: } else {
25602: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
25603: }
25604:
1.1.1.2 misho 25605: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25606: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 25607: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 25608: }
25609:
25610: if (opline->extended_value == ZEND_ASSIGN_DIM) {
25611: FREE_OP(free_op_data1);
25612: FREE_OP_VAR_PTR(free_op_data2);
25613:
1.1.1.2 misho 25614: CHECK_EXCEPTION();
25615: ZEND_VM_INC_OPCODE();
25616: } else {
25617:
25618: CHECK_EXCEPTION();
25619: }
1.1 misho 25620: ZEND_VM_NEXT_OPCODE();
25621: }
25622:
25623: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25624: {
25625: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25626: }
25627:
25628: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25629: {
25630: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25631: }
25632:
25633: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25634: {
25635: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25636: }
25637:
25638: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25639: {
25640: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25641: }
25642:
25643: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25644: {
25645: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25646: }
25647:
25648: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25649: {
25650: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25651: }
25652:
25653: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25654: {
25655: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25656: }
25657:
25658: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25659: {
25660: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25661: }
25662:
25663: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25664: {
25665: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25666: }
25667:
25668: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25669: {
25670: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25671: }
25672:
25673: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25674: {
25675: return zend_binary_assign_op_helper_SPEC_UNUSED_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25676: }
25677:
25678: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
25679: {
1.1.1.2 misho 25680: USE_OPLINE
1.1 misho 25681:
1.1.1.2 misho 25682: zval **object_ptr;
1.1 misho 25683: zval *object;
1.1.1.2 misho 25684: zval *property;
25685: zval **retval;
1.1 misho 25686: int have_get_ptr = 0;
25687:
1.1.1.2 misho 25688: SAVE_OPLINE();
25689: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25690: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25691: retval = &EX_T(opline->result.var).var.ptr;
25692:
25693: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 25694: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
25695: }
25696:
25697: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
25698: object = *object_ptr;
25699:
1.1.1.2 misho 25700: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 25701: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
25702:
1.1.1.2 misho 25703: if (RETURN_VALUE_USED(opline)) {
25704: PZVAL_LOCK(&EG(uninitialized_zval));
25705: *retval = &EG(uninitialized_zval);
1.1 misho 25706: }
25707:
1.1.1.2 misho 25708: CHECK_EXCEPTION();
1.1 misho 25709: ZEND_VM_NEXT_OPCODE();
25710: }
25711:
25712: /* here we are sure we are dealing with an object */
25713:
25714: if (0) {
25715: MAKE_REAL_ZVAL_PTR(property);
25716: }
25717:
25718: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 25719: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25720: if (zptr != NULL) { /* NULL means no success in getting PTR */
25721: SEPARATE_ZVAL_IF_NOT_REF(zptr);
25722:
25723: have_get_ptr = 1;
25724: incdec_op(*zptr);
1.1.1.2 misho 25725: if (RETURN_VALUE_USED(opline)) {
1.1 misho 25726: *retval = *zptr;
25727: PZVAL_LOCK(*retval);
25728: }
25729: }
25730: }
25731:
25732: if (!have_get_ptr) {
25733: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 25734: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25735:
1.1.1.2 misho 25736: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 25737: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
25738:
25739: if (Z_REFCOUNT_P(z) == 0) {
25740: GC_REMOVE_ZVAL_FROM_BUFFER(z);
25741: zval_dtor(z);
25742: FREE_ZVAL(z);
25743: }
25744: z = value;
25745: }
25746: Z_ADDREF_P(z);
25747: SEPARATE_ZVAL_IF_NOT_REF(&z);
25748: incdec_op(z);
25749: *retval = z;
1.1.1.2 misho 25750: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
25751: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 25752: zval_ptr_dtor(&z);
25753: } else {
25754: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 25755: if (RETURN_VALUE_USED(opline)) {
25756: PZVAL_LOCK(&EG(uninitialized_zval));
25757: *retval = &EG(uninitialized_zval);
1.1 misho 25758: }
25759: }
25760: }
25761:
25762: if (0) {
25763: zval_ptr_dtor(&property);
25764: } else {
25765:
25766: }
25767:
1.1.1.2 misho 25768: CHECK_EXCEPTION();
1.1 misho 25769: ZEND_VM_NEXT_OPCODE();
25770: }
25771:
25772: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25773: {
25774: return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25775: }
25776:
25777: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25778: {
25779: return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25780: }
25781:
25782: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
25783: {
1.1.1.2 misho 25784: USE_OPLINE
1.1 misho 25785:
1.1.1.2 misho 25786: zval **object_ptr;
1.1 misho 25787: zval *object;
1.1.1.2 misho 25788: zval *property;
25789: zval *retval;
1.1 misho 25790: int have_get_ptr = 0;
25791:
1.1.1.2 misho 25792: SAVE_OPLINE();
25793: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
25794: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25795: retval = &EX_T(opline->result.var).tmp_var;
25796:
25797: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 25798: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
25799: }
25800:
25801: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
25802: object = *object_ptr;
25803:
1.1.1.2 misho 25804: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 25805: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
25806:
1.1.1.2 misho 25807: ZVAL_NULL(retval);
1.1 misho 25808:
1.1.1.2 misho 25809: CHECK_EXCEPTION();
1.1 misho 25810: ZEND_VM_NEXT_OPCODE();
25811: }
25812:
25813: /* here we are sure we are dealing with an object */
25814:
25815: if (0) {
25816: MAKE_REAL_ZVAL_PTR(property);
25817: }
25818:
25819: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 25820: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25821: if (zptr != NULL) { /* NULL means no success in getting PTR */
25822: have_get_ptr = 1;
25823: SEPARATE_ZVAL_IF_NOT_REF(zptr);
25824:
1.1.1.2 misho 25825: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 25826: zendi_zval_copy_ctor(*retval);
25827:
25828: incdec_op(*zptr);
25829:
25830: }
25831: }
25832:
25833: if (!have_get_ptr) {
25834: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 25835: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25836: zval *z_copy;
25837:
1.1.1.2 misho 25838: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 25839: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
25840:
25841: if (Z_REFCOUNT_P(z) == 0) {
25842: GC_REMOVE_ZVAL_FROM_BUFFER(z);
25843: zval_dtor(z);
25844: FREE_ZVAL(z);
25845: }
25846: z = value;
25847: }
1.1.1.2 misho 25848: ZVAL_COPY_VALUE(retval, z);
1.1 misho 25849: zendi_zval_copy_ctor(*retval);
25850: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 25851: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 25852: zendi_zval_copy_ctor(*z_copy);
25853: incdec_op(z_copy);
25854: Z_ADDREF_P(z);
1.1.1.2 misho 25855: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25856: zval_ptr_dtor(&z_copy);
25857: zval_ptr_dtor(&z);
25858: } else {
25859: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 25860: ZVAL_NULL(retval);
1.1 misho 25861: }
25862: }
25863:
25864: if (0) {
25865: zval_ptr_dtor(&property);
25866: } else {
25867:
25868: }
25869:
1.1.1.2 misho 25870: CHECK_EXCEPTION();
1.1 misho 25871: ZEND_VM_NEXT_OPCODE();
25872: }
25873:
25874: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25875: {
25876: return zend_post_incdec_property_helper_SPEC_UNUSED_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25877: }
25878:
25879: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25880: {
25881: return zend_post_incdec_property_helper_SPEC_UNUSED_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
25882: }
25883:
1.1.1.2 misho 25884: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 25885: {
1.1.1.2 misho 25886: USE_OPLINE
1.1 misho 25887:
1.1.1.2 misho 25888: zval *container;
1.1 misho 25889:
1.1.1.2 misho 25890: zval *offset;
1.1 misho 25891:
1.1.1.2 misho 25892: SAVE_OPLINE();
25893: container = _get_obj_zval_ptr_unused(TSRMLS_C);
25894: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25895:
25896: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
25897: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
25898: zend_error(E_NOTICE, "Trying to get property of non-object");
25899: PZVAL_LOCK(&EG(uninitialized_zval));
25900: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 25901:
25902: } else {
25903: zval *retval;
25904:
25905: if (0) {
25906: MAKE_REAL_ZVAL_PTR(offset);
25907: }
25908:
25909: /* here we are sure we are dealing with an object */
1.1.1.2 misho 25910: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 25911:
1.1.1.2 misho 25912: PZVAL_LOCK(retval);
25913: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 25914:
25915: if (0) {
25916: zval_ptr_dtor(&offset);
25917: } else {
25918:
25919: }
25920: }
25921:
1.1.1.2 misho 25922: CHECK_EXCEPTION();
1.1 misho 25923: ZEND_VM_NEXT_OPCODE();
25924: }
25925:
25926: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25927: {
1.1.1.2 misho 25928: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 25929: }
25930:
25931: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25932: {
1.1.1.2 misho 25933: USE_OPLINE
1.1 misho 25934: zend_free_op free_op1;
1.1.1.2 misho 25935: zval *property;
1.1 misho 25936: zval **container;
25937:
1.1.1.2 misho 25938: SAVE_OPLINE();
25939: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25940:
1.1 misho 25941: if (IS_UNUSED == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 25942: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
25943: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 25944: }
25945:
25946: if (0) {
25947: MAKE_REAL_ZVAL_PTR(property);
25948: }
25949: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1.1.2 misho 25950: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 25951: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
25952: }
1.1.1.2 misho 25953:
25954: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 25955: if (0) {
25956: zval_ptr_dtor(&property);
25957: } else {
25958:
25959: }
1.1.1.2 misho 25960: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
25961: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 25962: }
25963:
25964: /* We are going to assign the result by reference */
25965: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 25966: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
25967:
25968: Z_DELREF_PP(retval_ptr);
25969: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
25970: Z_ADDREF_PP(retval_ptr);
25971: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
25972: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 25973: }
25974:
1.1.1.2 misho 25975: CHECK_EXCEPTION();
1.1 misho 25976: ZEND_VM_NEXT_OPCODE();
25977: }
25978:
25979: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
25980: {
1.1.1.2 misho 25981: USE_OPLINE
1.1 misho 25982: zend_free_op free_op1;
1.1.1.2 misho 25983: zval *property;
25984: zval **container;
25985:
25986: SAVE_OPLINE();
25987: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
25988: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 25989:
25990: if (0) {
25991: MAKE_REAL_ZVAL_PTR(property);
25992: }
1.1.1.2 misho 25993: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 25994: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
25995: }
1.1.1.2 misho 25996: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 25997: if (0) {
25998: zval_ptr_dtor(&property);
25999: } else {
26000:
26001: }
1.1.1.2 misho 26002: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
26003: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 26004: }
26005:
1.1.1.2 misho 26006: CHECK_EXCEPTION();
1.1 misho 26007: ZEND_VM_NEXT_OPCODE();
26008: }
26009:
26010: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26011: {
1.1.1.2 misho 26012: USE_OPLINE
26013:
26014: zval *container;
26015:
26016: zval *offset;
26017:
26018: SAVE_OPLINE();
26019: container = _get_obj_zval_ptr_unused(TSRMLS_C);
26020: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
26021:
26022: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
26023: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
26024: PZVAL_LOCK(&EG(uninitialized_zval));
26025: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
26026:
26027: } else {
26028: zval *retval;
26029:
26030: if (0) {
26031: MAKE_REAL_ZVAL_PTR(offset);
26032: }
26033:
26034: /* here we are sure we are dealing with an object */
26035: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
26036:
26037: PZVAL_LOCK(retval);
26038: AI_SET_PTR(&EX_T(opline->result.var), retval);
26039:
26040: if (0) {
26041: zval_ptr_dtor(&offset);
26042: } else {
26043:
26044: }
26045: }
26046:
26047: CHECK_EXCEPTION();
26048: ZEND_VM_NEXT_OPCODE();
1.1 misho 26049: }
26050:
26051: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26052: {
1.1.1.2 misho 26053: USE_OPLINE
1.1 misho 26054:
1.1.1.2 misho 26055: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 26056: /* Behave like FETCH_OBJ_W */
26057: zend_free_op free_op1;
1.1.1.2 misho 26058: zval *property;
26059: zval **container;
26060:
26061: SAVE_OPLINE();
26062: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
26063: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 26064:
26065: if (0) {
26066: MAKE_REAL_ZVAL_PTR(property);
26067: }
1.1.1.2 misho 26068: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 26069: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
26070: }
1.1.1.2 misho 26071: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 26072: if (0) {
26073: zval_ptr_dtor(&property);
26074: } else {
26075:
26076: }
1.1.1.2 misho 26077: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
26078: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 26079: }
26080:
1.1.1.2 misho 26081: CHECK_EXCEPTION();
1.1 misho 26082: ZEND_VM_NEXT_OPCODE();
26083: } else {
1.1.1.2 misho 26084: return zend_fetch_property_address_read_helper_SPEC_UNUSED_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 26085: }
26086: }
26087:
26088: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26089: {
1.1.1.2 misho 26090: USE_OPLINE
1.1 misho 26091: zend_free_op free_op1, free_res;
1.1.1.2 misho 26092: zval **container;
26093: zval *property;
26094:
26095: SAVE_OPLINE();
26096: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
26097: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26098:
26099: if (IS_UNUSED == IS_CV) {
26100: if (container != &EG(uninitialized_zval_ptr)) {
26101: SEPARATE_ZVAL_IF_NOT_REF(container);
26102: }
26103: }
26104: if (0) {
26105: MAKE_REAL_ZVAL_PTR(property);
26106: }
1.1.1.2 misho 26107: if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 26108: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
26109: }
1.1.1.2 misho 26110: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 26111: if (0) {
26112: zval_ptr_dtor(&property);
26113: } else {
26114:
26115: }
1.1.1.2 misho 26116: if (IS_UNUSED == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
26117: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 26118: }
26119:
1.1.1.2 misho 26120: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
26121: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
26122: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 26123: }
1.1.1.2 misho 26124: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 26125: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 26126: CHECK_EXCEPTION();
1.1 misho 26127: ZEND_VM_NEXT_OPCODE();
26128: }
26129:
26130: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26131: {
1.1.1.2 misho 26132: USE_OPLINE
1.1 misho 26133:
1.1.1.2 misho 26134: zval **object_ptr;
26135: zval *property_name;
26136:
26137: SAVE_OPLINE();
26138: object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
26139: property_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26140:
26141: if (0) {
26142: MAKE_REAL_ZVAL_PTR(property_name);
26143: }
1.1.1.2 misho 26144: if (IS_UNUSED == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 26145: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
26146: }
1.1.1.2 misho 26147: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 26148: if (0) {
26149: zval_ptr_dtor(&property_name);
26150: } else {
26151:
26152: }
26153:
26154: /* assign_obj has two opcodes! */
1.1.1.2 misho 26155: CHECK_EXCEPTION();
1.1 misho 26156: ZEND_VM_INC_OPCODE();
26157: ZEND_VM_NEXT_OPCODE();
26158: }
26159:
26160: static int ZEND_FASTCALL ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26161: {
1.1.1.2 misho 26162: USE_OPLINE
1.1 misho 26163:
1.1.1.2 misho 26164: zval *str = &EX_T(opline->result.var).tmp_var;
26165: zval *var;
1.1 misho 26166: zval var_copy;
26167: int use_copy = 0;
26168:
1.1.1.2 misho 26169: SAVE_OPLINE();
26170: var = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
26171:
1.1 misho 26172: if (IS_UNUSED == IS_UNUSED) {
26173: /* Initialize for erealloc in add_string_to_string */
26174: Z_STRVAL_P(str) = NULL;
26175: Z_STRLEN_P(str) = 0;
26176: Z_TYPE_P(str) = IS_STRING;
26177:
26178: INIT_PZVAL(str);
26179: }
26180:
26181: if (Z_TYPE_P(var) != IS_STRING) {
26182: zend_make_printable_zval(var, &var_copy, &use_copy);
26183:
26184: if (use_copy) {
26185: var = &var_copy;
26186: }
26187: }
26188: add_string_to_string(str, str, var);
26189:
26190: if (use_copy) {
26191: zval_dtor(var);
26192: }
26193: /* original comment, possibly problematic:
26194: * FREE_OP is missing intentionally here - we're always working on the same temporary variable
26195: * (Zeev): I don't think it's problematic, we only use variables
26196: * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're
26197: * string offsets or overloaded objects
26198: */
26199:
1.1.1.2 misho 26200: CHECK_EXCEPTION();
1.1 misho 26201: ZEND_VM_NEXT_OPCODE();
26202: }
26203:
26204: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26205: {
1.1.1.2 misho 26206: USE_OPLINE
1.1 misho 26207: zval *function_name;
26208: char *function_name_strval;
26209: int function_name_strlen;
26210:
26211:
1.1.1.2 misho 26212: SAVE_OPLINE();
1.1 misho 26213: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
26214:
1.1.1.2 misho 26215: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26216:
1.1.1.2 misho 26217: if (IS_CV != IS_CONST &&
26218: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 26219: zend_error_noreturn(E_ERROR, "Method name must be a string");
26220: }
26221:
26222: function_name_strval = Z_STRVAL_P(function_name);
26223: function_name_strlen = Z_STRLEN_P(function_name);
26224:
26225: EX(object) = _get_obj_zval_ptr_unused(TSRMLS_C);
26226:
1.1.1.2 misho 26227: if (EXPECTED(EX(object) != NULL) &&
26228: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
26229: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 26230:
1.1.1.2 misho 26231: if (IS_CV != IS_CONST ||
26232: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
26233: zval *object = EX(object);
26234:
26235: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
26236: zend_error_noreturn(E_ERROR, "Object does not support method calls");
26237: }
26238:
26239: /* First, locate the function. */
26240: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
26241: if (UNEXPECTED(EX(fbc) == NULL)) {
26242: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
26243: }
26244: if (IS_CV == IS_CONST &&
26245: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
26246: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
26247: EXPECTED(EX(object) == object)) {
26248: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
26249: }
1.1 misho 26250: }
26251: } else {
26252: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
26253: }
26254:
26255: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
26256: EX(object) = NULL;
26257: } else {
26258: if (!PZVAL_IS_REF(EX(object))) {
26259: Z_ADDREF_P(EX(object)); /* For $this pointer */
26260: } else {
26261: zval *this_ptr;
26262: ALLOC_ZVAL(this_ptr);
26263: INIT_PZVAL_COPY(this_ptr, EX(object));
26264: zval_copy_ctor(this_ptr);
26265: EX(object) = this_ptr;
26266: }
26267: }
26268:
26269:
1.1.1.2 misho 26270: CHECK_EXCEPTION();
1.1 misho 26271: ZEND_VM_NEXT_OPCODE();
26272: }
26273:
26274: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26275: {
1.1.1.2 misho 26276: USE_OPLINE
1.1 misho 26277:
1.1.1.2 misho 26278: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 26279: if (IS_UNUSED == IS_UNUSED) {
26280: ZEND_VM_NEXT_OPCODE();
26281: #if 0 || IS_UNUSED != IS_UNUSED
26282: } else {
26283: return ZEND_ADD_ARRAY_ELEMENT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
26284: #endif
26285: }
26286: }
26287:
26288: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26289: {
1.1.1.2 misho 26290: USE_OPLINE
1.1 misho 26291:
1.1.1.2 misho 26292: zval **container;
1.1 misho 26293: zval *offset;
1.1.1.2 misho 26294: ulong hval;
1.1 misho 26295:
1.1.1.2 misho 26296: SAVE_OPLINE();
26297: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 26298: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
26299: SEPARATE_ZVAL_IF_NOT_REF(container);
26300: }
1.1.1.2 misho 26301: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26302:
26303: if (IS_UNUSED != IS_VAR || container) {
26304: switch (Z_TYPE_PP(container)) {
26305: case IS_ARRAY: {
26306: HashTable *ht = Z_ARRVAL_PP(container);
26307:
26308: switch (Z_TYPE_P(offset)) {
26309: case IS_DOUBLE:
1.1.1.2 misho 26310: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 26311: zend_hash_index_del(ht, hval);
26312: break;
1.1 misho 26313: case IS_RESOURCE:
26314: case IS_BOOL:
26315: case IS_LONG:
1.1.1.2 misho 26316: hval = Z_LVAL_P(offset);
26317: zend_hash_index_del(ht, hval);
1.1 misho 26318: break;
26319: case IS_STRING:
26320: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
26321: Z_ADDREF_P(offset);
26322: }
1.1.1.2 misho 26323: if (IS_CV == IS_CONST) {
26324: hval = Z_HASH_P(offset);
26325: } else {
26326: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
26327: if (IS_INTERNED(Z_STRVAL_P(offset))) {
26328: hval = INTERNED_HASH(Z_STRVAL_P(offset));
26329: } else {
26330: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 26331: }
26332: }
1.1.1.2 misho 26333: if (ht == &EG(symbol_table)) {
26334: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
26335: } else {
26336: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
26337: }
26338: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
26339: zval_ptr_dtor(&offset);
26340: }
26341: break;
26342: num_index_dim:
26343: zend_hash_index_del(ht, hval);
1.1 misho 26344: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
26345: zval_ptr_dtor(&offset);
26346: }
26347: break;
26348: case IS_NULL:
26349: zend_hash_del(ht, "", sizeof(""));
26350: break;
26351: default:
26352: zend_error(E_WARNING, "Illegal offset type in unset");
26353: break;
26354: }
26355:
26356: break;
26357: }
26358: case IS_OBJECT:
1.1.1.2 misho 26359: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 26360: zend_error_noreturn(E_ERROR, "Cannot use object as array");
26361: }
26362: if (0) {
26363: MAKE_REAL_ZVAL_PTR(offset);
26364: }
26365: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
26366: if (0) {
26367: zval_ptr_dtor(&offset);
26368: } else {
26369:
26370: }
26371: break;
26372: case IS_STRING:
26373: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
26374: ZEND_VM_CONTINUE(); /* bailed out before */
26375: default:
26376:
26377: break;
26378: }
26379: } else {
26380:
26381: }
26382:
1.1.1.2 misho 26383: CHECK_EXCEPTION();
1.1 misho 26384: ZEND_VM_NEXT_OPCODE();
26385: }
26386:
26387: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26388: {
1.1.1.2 misho 26389: USE_OPLINE
26390:
26391: zval **container;
26392: zval *offset;
1.1 misho 26393:
1.1.1.2 misho 26394: SAVE_OPLINE();
26395: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
26396: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26397:
26398: if (IS_UNUSED != IS_VAR || container) {
26399: if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
26400: SEPARATE_ZVAL_IF_NOT_REF(container);
26401: }
26402: if (Z_TYPE_PP(container) == IS_OBJECT) {
26403: if (0) {
26404: MAKE_REAL_ZVAL_PTR(offset);
26405: }
26406: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 26407: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 26408: } else {
26409: zend_error(E_NOTICE, "Trying to unset property of non-object");
26410: }
26411: if (0) {
26412: zval_ptr_dtor(&offset);
26413: } else {
26414:
26415: }
26416: } else {
26417:
26418: }
26419: } else {
26420:
26421: }
26422:
1.1.1.2 misho 26423: CHECK_EXCEPTION();
1.1 misho 26424: ZEND_VM_NEXT_OPCODE();
26425: }
26426:
26427: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
26428: {
1.1.1.2 misho 26429: USE_OPLINE
1.1 misho 26430:
1.1.1.2 misho 26431: zval **container;
1.1 misho 26432: zval **value = NULL;
26433: int result = 0;
1.1.1.2 misho 26434: ulong hval;
26435: zval *offset;
1.1 misho 26436:
1.1.1.2 misho 26437: SAVE_OPLINE();
26438: container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
1.1 misho 26439:
1.1.1.2 misho 26440: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 26441:
1.1.1.2 misho 26442: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
26443: HashTable *ht;
26444: int isset = 0;
1.1 misho 26445:
1.1.1.2 misho 26446: ht = Z_ARRVAL_PP(container);
1.1 misho 26447:
1.1.1.2 misho 26448: switch (Z_TYPE_P(offset)) {
26449: case IS_DOUBLE:
26450: hval = zend_dval_to_lval(Z_DVAL_P(offset));
26451: goto num_index_prop;
26452: case IS_RESOURCE:
26453: case IS_BOOL:
26454: case IS_LONG:
26455: hval = Z_LVAL_P(offset);
26456: num_index_prop:
26457: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
26458: isset = 1;
26459: }
26460: break;
26461: case IS_STRING:
26462: if (IS_CV == IS_CONST) {
26463: hval = Z_HASH_P(offset);
26464: } else {
26465: if (!prop_dim) {
26466: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 26467: }
1.1.1.2 misho 26468: if (IS_INTERNED(Z_STRVAL_P(offset))) {
26469: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 26470: } else {
1.1.1.2 misho 26471: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 26472: }
26473: }
1.1.1.2 misho 26474: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
26475: isset = 1;
26476: }
26477: break;
26478: case IS_NULL:
26479: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
26480: isset = 1;
1.1 misho 26481: }
1.1.1.2 misho 26482: break;
26483: default:
26484: zend_error(E_WARNING, "Illegal offset type in isset or empty");
26485: break;
26486: }
26487:
26488: if (opline->extended_value & ZEND_ISSET) {
26489: if (isset && Z_TYPE_PP(value) == IS_NULL) {
26490: result = 0;
26491: } else {
26492: result = isset;
1.1 misho 26493: }
1.1.1.2 misho 26494: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
26495: if (!isset || !i_zend_is_true(*value)) {
26496: result = 0;
1.1 misho 26497: } else {
1.1.1.2 misho 26498: result = 1;
26499: }
26500: }
1.1 misho 26501:
1.1.1.2 misho 26502: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
26503: if (0) {
26504: MAKE_REAL_ZVAL_PTR(offset);
26505: }
26506: if (prop_dim) {
26507: if (Z_OBJ_HT_P(*container)->has_property) {
26508: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
26509: } else {
26510: zend_error(E_NOTICE, "Trying to check property of non-object");
26511: result = 0;
1.1 misho 26512: }
1.1.1.2 misho 26513: } else {
26514: if (Z_OBJ_HT_P(*container)->has_dimension) {
26515: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
26516: } else {
26517: zend_error(E_NOTICE, "Trying to check element of non-array");
26518: result = 0;
26519: }
26520: }
26521: if (0) {
26522: zval_ptr_dtor(&offset);
26523: } else {
26524:
26525: }
26526: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
26527: zval tmp;
1.1 misho 26528:
1.1.1.2 misho 26529: if (Z_TYPE_P(offset) != IS_LONG) {
26530: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
26531: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
26532: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
26533: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 26534: zval_copy_ctor(&tmp);
26535: convert_to_long(&tmp);
26536: offset = &tmp;
1.1.1.2 misho 26537: } else {
26538: /* can not be converted to proper offset, return "not set" */
26539: result = 0;
1.1 misho 26540: }
1.1.1.2 misho 26541: }
26542: if (Z_TYPE_P(offset) == IS_LONG) {
26543: if (opline->extended_value & ZEND_ISSET) {
26544: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
26545: result = 1;
26546: }
26547: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
26548: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
26549: result = 1;
1.1 misho 26550: }
26551: }
1.1.1.2 misho 26552: }
1.1 misho 26553:
1.1.1.2 misho 26554: } else {
1.1 misho 26555:
26556: }
26557:
1.1.1.2 misho 26558: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
26559: if (opline->extended_value & ZEND_ISSET) {
26560: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
26561: } else {
26562: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 26563: }
26564:
1.1.1.2 misho 26565: CHECK_EXCEPTION();
1.1 misho 26566: ZEND_VM_NEXT_OPCODE();
26567: }
26568:
26569: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26570: {
26571: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
26572: }
26573:
26574: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26575: {
26576: return zend_isset_isempty_dim_prop_obj_handler_SPEC_UNUSED_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
26577: }
26578:
26579: static int ZEND_FASTCALL ZEND_BW_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26580: {
1.1.1.2 misho 26581: USE_OPLINE
1.1 misho 26582:
26583:
1.1.1.2 misho 26584: SAVE_OPLINE();
26585: bitwise_not_function(&EX_T(opline->result.var).tmp_var,
26586: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 26587:
1.1.1.2 misho 26588: CHECK_EXCEPTION();
1.1 misho 26589: ZEND_VM_NEXT_OPCODE();
26590: }
26591:
26592: static int ZEND_FASTCALL ZEND_BOOL_NOT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26593: {
1.1.1.2 misho 26594: USE_OPLINE
1.1 misho 26595:
26596:
1.1.1.2 misho 26597: SAVE_OPLINE();
26598: boolean_not_function(&EX_T(opline->result.var).tmp_var,
26599: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 26600:
1.1.1.2 misho 26601: CHECK_EXCEPTION();
1.1 misho 26602: ZEND_VM_NEXT_OPCODE();
26603: }
26604:
26605: static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26606: {
1.1.1.2 misho 26607: USE_OPLINE
26608:
26609: zval **var_ptr;
1.1 misho 26610:
1.1.1.2 misho 26611: SAVE_OPLINE();
26612: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 26613:
1.1.1.2 misho 26614: if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 26615: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
26616: }
1.1.1.2 misho 26617: if (IS_CV == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
26618: if (RETURN_VALUE_USED(opline)) {
26619: PZVAL_LOCK(&EG(uninitialized_zval));
26620: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 26621: }
26622:
1.1.1.2 misho 26623: CHECK_EXCEPTION();
1.1 misho 26624: ZEND_VM_NEXT_OPCODE();
26625: }
26626:
26627: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
26628:
1.1.1.2 misho 26629: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
26630: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 26631: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
26632: /* proxy object */
26633: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
26634: Z_ADDREF_P(val);
1.1.1.2 misho 26635: fast_increment_function(val);
1.1 misho 26636: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
26637: zval_ptr_dtor(&val);
26638: } else {
1.1.1.2 misho 26639: fast_increment_function(*var_ptr);
1.1 misho 26640: }
26641:
1.1.1.2 misho 26642: if (RETURN_VALUE_USED(opline)) {
1.1 misho 26643: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 26644: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 26645: }
26646:
1.1.1.2 misho 26647: CHECK_EXCEPTION();
1.1 misho 26648: ZEND_VM_NEXT_OPCODE();
26649: }
26650:
26651: static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26652: {
1.1.1.2 misho 26653: USE_OPLINE
1.1 misho 26654:
1.1.1.2 misho 26655: zval **var_ptr;
26656:
26657: SAVE_OPLINE();
26658: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 26659:
1.1.1.2 misho 26660: if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 26661: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
26662: }
1.1.1.2 misho 26663: if (IS_CV == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
26664: if (RETURN_VALUE_USED(opline)) {
26665: PZVAL_LOCK(&EG(uninitialized_zval));
26666: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 26667: }
26668:
1.1.1.2 misho 26669: CHECK_EXCEPTION();
1.1 misho 26670: ZEND_VM_NEXT_OPCODE();
26671: }
26672:
26673: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
26674:
1.1.1.2 misho 26675: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
26676: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 26677: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
26678: /* proxy object */
26679: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
26680: Z_ADDREF_P(val);
1.1.1.2 misho 26681: fast_decrement_function(val);
1.1 misho 26682: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
26683: zval_ptr_dtor(&val);
26684: } else {
1.1.1.2 misho 26685: fast_decrement_function(*var_ptr);
1.1 misho 26686: }
26687:
1.1.1.2 misho 26688: if (RETURN_VALUE_USED(opline)) {
1.1 misho 26689: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 26690: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 26691: }
26692:
1.1.1.2 misho 26693: CHECK_EXCEPTION();
1.1 misho 26694: ZEND_VM_NEXT_OPCODE();
26695: }
26696:
26697: static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26698: {
1.1.1.2 misho 26699: USE_OPLINE
26700:
26701: zval **var_ptr, *retval;
1.1 misho 26702:
1.1.1.2 misho 26703: SAVE_OPLINE();
26704: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 26705:
1.1.1.2 misho 26706: if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 26707: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
26708: }
1.1.1.2 misho 26709: if (IS_CV == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
26710: ZVAL_NULL(&EX_T(opline->result.var).tmp_var);
1.1 misho 26711:
1.1.1.2 misho 26712: CHECK_EXCEPTION();
1.1 misho 26713: ZEND_VM_NEXT_OPCODE();
26714: }
26715:
1.1.1.2 misho 26716: retval = &EX_T(opline->result.var).tmp_var;
26717: ZVAL_COPY_VALUE(retval, *var_ptr);
26718: zendi_zval_copy_ctor(*retval);
1.1 misho 26719:
26720: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
26721:
1.1.1.2 misho 26722: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
26723: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 26724: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
26725: /* proxy object */
26726: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
26727: Z_ADDREF_P(val);
1.1.1.2 misho 26728: fast_increment_function(val);
1.1 misho 26729: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
26730: zval_ptr_dtor(&val);
26731: } else {
1.1.1.2 misho 26732: fast_increment_function(*var_ptr);
1.1 misho 26733: }
26734:
1.1.1.2 misho 26735: CHECK_EXCEPTION();
1.1 misho 26736: ZEND_VM_NEXT_OPCODE();
26737: }
26738:
26739: static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26740: {
1.1.1.2 misho 26741: USE_OPLINE
26742:
26743: zval **var_ptr, *retval;
1.1 misho 26744:
1.1.1.2 misho 26745: SAVE_OPLINE();
26746: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 26747:
1.1.1.2 misho 26748: if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) {
1.1 misho 26749: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
26750: }
1.1.1.2 misho 26751: if (IS_CV == IS_VAR && UNEXPECTED(*var_ptr == &EG(error_zval))) {
26752: ZVAL_NULL(&EX_T(opline->result.var).tmp_var);
1.1 misho 26753:
1.1.1.2 misho 26754: CHECK_EXCEPTION();
1.1 misho 26755: ZEND_VM_NEXT_OPCODE();
26756: }
26757:
1.1.1.2 misho 26758: retval = &EX_T(opline->result.var).tmp_var;
26759: ZVAL_COPY_VALUE(retval, *var_ptr);
26760: zendi_zval_copy_ctor(*retval);
1.1 misho 26761:
26762: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
26763:
1.1.1.2 misho 26764: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
26765: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 26766: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
26767: /* proxy object */
26768: zval *val = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
26769: Z_ADDREF_P(val);
1.1.1.2 misho 26770: fast_decrement_function(val);
1.1 misho 26771: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, val TSRMLS_CC);
26772: zval_ptr_dtor(&val);
26773: } else {
1.1.1.2 misho 26774: fast_decrement_function(*var_ptr);
1.1 misho 26775: }
26776:
1.1.1.2 misho 26777: CHECK_EXCEPTION();
1.1 misho 26778: ZEND_VM_NEXT_OPCODE();
26779: }
26780:
26781: static int ZEND_FASTCALL ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26782: {
1.1.1.2 misho 26783: USE_OPLINE
1.1 misho 26784:
1.1.1.2 misho 26785: zval *z;
26786:
26787: SAVE_OPLINE();
26788: z = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 26789:
1.1.1.3 misho 26790: if (IS_CV == IS_TMP_VAR && Z_TYPE_P(z) == IS_OBJECT) {
26791: INIT_PZVAL(z);
1.1 misho 26792: }
1.1.1.3 misho 26793: zend_print_variable(z);
1.1 misho 26794:
1.1.1.2 misho 26795: CHECK_EXCEPTION();
1.1 misho 26796: ZEND_VM_NEXT_OPCODE();
26797: }
26798:
26799: static int ZEND_FASTCALL ZEND_PRINT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26800: {
1.1.1.2 misho 26801: USE_OPLINE
1.1 misho 26802:
1.1.1.2 misho 26803: ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
1.1 misho 26804: return ZEND_ECHO_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
26805: }
26806:
26807: static int ZEND_FASTCALL ZEND_JMPZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26808: {
1.1.1.2 misho 26809: USE_OPLINE
1.1 misho 26810:
1.1.1.2 misho 26811: zval *val;
1.1 misho 26812: int ret;
26813:
1.1.1.2 misho 26814: SAVE_OPLINE();
26815: val = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26816:
26817: if (IS_CV == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 26818: ret = Z_LVAL_P(val);
26819: } else {
26820: ret = i_zend_is_true(val);
26821:
26822: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 26823: HANDLE_EXCEPTION();
1.1 misho 26824: }
26825: }
26826: if (!ret) {
26827: #if DEBUG_ZEND>=2
1.1.1.2 misho 26828: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 26829: #endif
1.1.1.2 misho 26830: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 26831: ZEND_VM_CONTINUE();
26832: }
26833:
26834: ZEND_VM_NEXT_OPCODE();
26835: }
26836:
26837: static int ZEND_FASTCALL ZEND_JMPNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26838: {
1.1.1.2 misho 26839: USE_OPLINE
1.1 misho 26840:
1.1.1.2 misho 26841: zval *val;
1.1 misho 26842: int ret;
26843:
1.1.1.2 misho 26844: SAVE_OPLINE();
26845: val = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26846:
26847: if (IS_CV == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 26848: ret = Z_LVAL_P(val);
26849: } else {
26850: ret = i_zend_is_true(val);
26851:
26852: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 26853: HANDLE_EXCEPTION();
1.1 misho 26854: }
26855: }
26856: if (ret) {
26857: #if DEBUG_ZEND>=2
1.1.1.2 misho 26858: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 26859: #endif
1.1.1.2 misho 26860: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 26861: ZEND_VM_CONTINUE();
26862: }
26863:
26864: ZEND_VM_NEXT_OPCODE();
26865: }
26866:
26867: static int ZEND_FASTCALL ZEND_JMPZNZ_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26868: {
1.1.1.2 misho 26869: USE_OPLINE
1.1 misho 26870:
1.1.1.2 misho 26871: zval *val;
1.1 misho 26872: int retval;
26873:
1.1.1.2 misho 26874: SAVE_OPLINE();
26875: val = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26876:
26877: if (IS_CV == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 26878: retval = Z_LVAL_P(val);
26879: } else {
26880: retval = i_zend_is_true(val);
26881:
26882: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 26883: HANDLE_EXCEPTION();
1.1 misho 26884: }
26885: }
26886: if (EXPECTED(retval != 0)) {
26887: #if DEBUG_ZEND>=2
26888: printf("Conditional jmp on true to %d\n", opline->extended_value);
26889: #endif
26890: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
26891: ZEND_VM_CONTINUE(); /* CHECK_ME */
26892: } else {
26893: #if DEBUG_ZEND>=2
1.1.1.2 misho 26894: printf("Conditional jmp on false to %d\n", opline->op2.opline_num);
1.1 misho 26895: #endif
1.1.1.2 misho 26896: ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->op2.opline_num]);
1.1 misho 26897: ZEND_VM_CONTINUE(); /* CHECK_ME */
26898: }
26899: }
26900:
26901: static int ZEND_FASTCALL ZEND_JMPZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26902: {
1.1.1.2 misho 26903: USE_OPLINE
1.1 misho 26904:
1.1.1.2 misho 26905: zval *val;
1.1 misho 26906: int retval;
26907:
1.1.1.2 misho 26908: SAVE_OPLINE();
26909: val = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26910:
26911: if (IS_CV == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 26912: retval = Z_LVAL_P(val);
26913: } else {
26914: retval = i_zend_is_true(val);
26915:
26916: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 26917: HANDLE_EXCEPTION();
1.1 misho 26918: }
26919: }
1.1.1.2 misho 26920: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
26921: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 26922: if (!retval) {
26923: #if DEBUG_ZEND>=2
1.1.1.2 misho 26924: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 26925: #endif
1.1.1.2 misho 26926: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 26927: ZEND_VM_CONTINUE();
26928: }
26929: ZEND_VM_NEXT_OPCODE();
26930: }
26931:
26932: static int ZEND_FASTCALL ZEND_JMPNZ_EX_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26933: {
1.1.1.2 misho 26934: USE_OPLINE
1.1 misho 26935:
1.1.1.2 misho 26936: zval *val;
1.1 misho 26937: int retval;
26938:
1.1.1.2 misho 26939: SAVE_OPLINE();
26940: val = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26941:
26942: if (IS_CV == IS_TMP_VAR && EXPECTED(Z_TYPE_P(val) == IS_BOOL)) {
1.1 misho 26943: retval = Z_LVAL_P(val);
26944: } else {
26945: retval = i_zend_is_true(val);
26946:
26947: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 26948: HANDLE_EXCEPTION();
1.1 misho 26949: }
26950: }
1.1.1.2 misho 26951: Z_LVAL(EX_T(opline->result.var).tmp_var) = retval;
26952: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
1.1 misho 26953: if (retval) {
26954: #if DEBUG_ZEND>=2
1.1.1.2 misho 26955: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 26956: #endif
1.1.1.2 misho 26957: ZEND_VM_SET_OPCODE(opline->op2.jmp_addr);
1.1 misho 26958: ZEND_VM_CONTINUE();
26959: }
26960: ZEND_VM_NEXT_OPCODE();
26961: }
26962:
26963: static int ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
26964: {
1.1.1.2 misho 26965: USE_OPLINE
1.1 misho 26966: zval *retval_ptr;
26967:
26968:
1.1.1.2 misho 26969: SAVE_OPLINE();
26970: retval_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
26971:
26972: if (!EG(return_value_ptr_ptr)) {
26973: if (IS_CV == IS_TMP_VAR) {
1.1 misho 26974:
26975: }
1.1.1.2 misho 26976: } else if (!0) { /* Not a temp var */
26977: if (IS_CV == IS_CONST ||
26978: (PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
26979: zval *ret;
1.1 misho 26980:
1.1.1.2 misho 26981: ALLOC_ZVAL(ret);
26982: INIT_PZVAL_COPY(ret, retval_ptr);
26983: zval_copy_ctor(ret);
26984: *EG(return_value_ptr_ptr) = ret;
26985: } else if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
26986: retval_ptr == &EG(uninitialized_zval)) {
26987: zval *ret;
1.1 misho 26988:
1.1.1.2 misho 26989: ALLOC_INIT_ZVAL(ret);
26990: *EG(return_value_ptr_ptr) = ret;
26991: } else {
26992: *EG(return_value_ptr_ptr) = retval_ptr;
26993: Z_ADDREF_P(retval_ptr);
1.1 misho 26994: }
1.1.1.2 misho 26995: } else {
26996: zval *ret;
1.1 misho 26997:
1.1.1.2 misho 26998: ALLOC_ZVAL(ret);
26999: INIT_PZVAL_COPY(ret, retval_ptr);
27000: *EG(return_value_ptr_ptr) = ret;
27001: }
1.1 misho 27002:
1.1.1.2 misho 27003: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27004: }
1.1 misho 27005:
1.1.1.2 misho 27006: static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27007: {
27008: USE_OPLINE
27009: zval *retval_ptr;
27010: zval **retval_ptr_ptr;
1.1 misho 27011:
27012:
1.1.1.2 misho 27013: SAVE_OPLINE();
1.1 misho 27014:
1.1.1.2 misho 27015: do {
27016: if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
27017: /* Not supposed to happen, but we'll allow it */
27018: zend_error(E_NOTICE, "Only variable references should be returned by reference");
27019:
27020: retval_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27021: if (!EG(return_value_ptr_ptr)) {
27022: if (IS_CV == IS_TMP_VAR) {
27023:
27024: }
27025: } else if (!0) { /* Not a temp var */
1.1 misho 27026: zval *ret;
27027:
27028: ALLOC_ZVAL(ret);
27029: INIT_PZVAL_COPY(ret, retval_ptr);
27030: zval_copy_ctor(ret);
27031: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 27032: } else {
1.1 misho 27033: zval *ret;
27034:
1.1.1.2 misho 27035: ALLOC_ZVAL(ret);
27036: INIT_PZVAL_COPY(ret, retval_ptr);
1.1 misho 27037: *EG(return_value_ptr_ptr) = ret;
27038: }
1.1.1.2 misho 27039: break;
27040: }
1.1 misho 27041:
1.1.1.2 misho 27042: retval_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
27043:
27044: if (IS_CV == IS_VAR && UNEXPECTED(retval_ptr_ptr == NULL)) {
27045: zend_error_noreturn(E_ERROR, "Cannot return string offsets by reference");
1.1 misho 27046: }
1.1.1.2 misho 27047:
27048: if (IS_CV == IS_VAR && !Z_ISREF_PP(retval_ptr_ptr)) {
27049: if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
27050: EX_T(opline->op1.var).var.fcall_returned_reference) {
27051: } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
27052: zend_error(E_NOTICE, "Only variable references should be returned by reference");
27053: if (EG(return_value_ptr_ptr)) {
1.1.1.4 misho 27054: zval *ret;
27055:
27056: ALLOC_ZVAL(ret);
27057: INIT_PZVAL_COPY(ret, *retval_ptr_ptr);
27058: zval_copy_ctor(ret);
27059: *EG(return_value_ptr_ptr) = ret;
1.1.1.2 misho 27060: }
27061: break;
27062: }
27063: }
27064:
27065: if (EG(return_value_ptr_ptr)) {
27066: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
27067: Z_ADDREF_PP(retval_ptr_ptr);
27068:
27069: *EG(return_value_ptr_ptr) = *retval_ptr_ptr;
27070: }
27071: } while (0);
1.1 misho 27072:
27073: return zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27074: }
27075:
27076: static int ZEND_FASTCALL ZEND_THROW_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27077: {
1.1.1.2 misho 27078: USE_OPLINE
1.1 misho 27079: zval *value;
27080: zval *exception;
27081:
27082:
1.1.1.2 misho 27083: SAVE_OPLINE();
27084: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27085:
1.1.1.2 misho 27086: if (IS_CV == IS_CONST || UNEXPECTED(Z_TYPE_P(value) != IS_OBJECT)) {
1.1 misho 27087: zend_error_noreturn(E_ERROR, "Can only throw objects");
27088: }
27089: zend_exception_save(TSRMLS_C);
27090: /* Not sure if a complete copy is what we want here */
27091: ALLOC_ZVAL(exception);
27092: INIT_PZVAL_COPY(exception, value);
27093: if (!0) {
27094: zval_copy_ctor(exception);
27095: }
27096:
27097: zend_throw_exception_object(exception TSRMLS_CC);
27098: zend_exception_restore(TSRMLS_C);
27099:
1.1.1.2 misho 27100: HANDLE_EXCEPTION();
1.1 misho 27101: }
27102:
27103: static int ZEND_FASTCALL zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS)
27104: {
1.1.1.2 misho 27105: USE_OPLINE
1.1 misho 27106: zval *varptr;
27107:
1.1.1.2 misho 27108: varptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27109:
27110: if (varptr == &EG(uninitialized_zval)) {
27111: ALLOC_ZVAL(varptr);
27112: INIT_ZVAL(*varptr);
27113: Z_SET_REFCOUNT_P(varptr, 0);
27114: } else if (PZVAL_IS_REF(varptr)) {
27115: zval *original_var = varptr;
27116:
27117: ALLOC_ZVAL(varptr);
1.1.1.2 misho 27118: ZVAL_COPY_VALUE(varptr, original_var);
1.1 misho 27119: Z_UNSET_ISREF_P(varptr);
27120: Z_SET_REFCOUNT_P(varptr, 0);
27121: zval_copy_ctor(varptr);
27122: }
27123: Z_ADDREF_P(varptr);
27124: zend_vm_stack_push(varptr TSRMLS_CC);
27125: ; /* for string offsets */
27126:
1.1.1.2 misho 27127: CHECK_EXCEPTION();
1.1 misho 27128: ZEND_VM_NEXT_OPCODE();
27129: }
27130:
27131: static int ZEND_FASTCALL ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27132: {
1.1.1.2 misho 27133: USE_OPLINE
1.1 misho 27134: zend_free_op free_op1;
27135: zval *varptr;
27136:
1.1.1.2 misho 27137: SAVE_OPLINE();
1.1 misho 27138: if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */
27139: if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {
27140: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27141: }
1.1.1.2 misho 27142: } else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 27143: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27144: }
27145:
27146: if (IS_CV == IS_VAR &&
27147: (opline->extended_value & ZEND_ARG_SEND_FUNCTION) &&
1.1.1.2 misho 27148: EX_T(opline->op1.var).var.fcall_returned_reference &&
27149: EX_T(opline->op1.var).var.ptr) {
27150: varptr = EX_T(opline->op1.var).var.ptr;
1.1 misho 27151: PZVAL_UNLOCK_EX(varptr, &free_op1, 0);
27152: } else {
1.1.1.2 misho 27153: varptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27154: }
27155: if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
1.1.1.2 misho 27156: EX_T(opline->op1.var).var.fcall_returned_reference) &&
1.1 misho 27157: varptr != &EG(uninitialized_zval) &&
27158: (PZVAL_IS_REF(varptr) ||
27159: (Z_REFCOUNT_P(varptr) == 1 && (IS_CV == IS_CV || free_op1.var)))) {
27160: Z_SET_ISREF_P(varptr);
27161: Z_ADDREF_P(varptr);
27162: zend_vm_stack_push(varptr TSRMLS_CC);
27163: } else {
27164: zval *valptr;
27165:
27166: if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
27167: !(opline->extended_value & ZEND_ARG_SEND_SILENT) :
1.1.1.2 misho 27168: !ARG_MAY_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 27169: zend_error(E_STRICT, "Only variables should be passed by reference");
27170: }
27171: ALLOC_ZVAL(valptr);
27172: INIT_PZVAL_COPY(valptr, varptr);
27173: if (!0) {
27174: zval_copy_ctor(valptr);
27175: }
27176: zend_vm_stack_push(valptr TSRMLS_CC);
27177: }
27178:
1.1.1.2 misho 27179: CHECK_EXCEPTION();
1.1 misho 27180: ZEND_VM_NEXT_OPCODE();
27181: }
27182:
27183: static int ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27184: {
1.1.1.2 misho 27185: USE_OPLINE
1.1 misho 27186:
27187: zval **varptr_ptr;
27188: zval *varptr;
27189:
1.1.1.2 misho 27190: SAVE_OPLINE();
27191: varptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
27192:
27193: if (IS_CV == IS_VAR && UNEXPECTED(varptr_ptr == NULL)) {
1.1 misho 27194: zend_error_noreturn(E_ERROR, "Only variables can be passed by reference");
27195: }
27196:
1.1.1.2 misho 27197: if (IS_CV == IS_VAR && UNEXPECTED(*varptr_ptr == &EG(error_zval))) {
1.1 misho 27198: ALLOC_INIT_ZVAL(varptr);
27199: zend_vm_stack_push(varptr TSRMLS_CC);
1.1.1.2 misho 27200: CHECK_EXCEPTION();
1.1 misho 27201: ZEND_VM_NEXT_OPCODE();
27202: }
27203:
1.1.1.3 misho 27204: if (opline->extended_value == ZEND_DO_FCALL_BY_NAME &&
27205: EX(function_state).function->type == ZEND_INTERNAL_FUNCTION &&
27206: !ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 27207: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27208: }
27209:
27210: SEPARATE_ZVAL_TO_MAKE_IS_REF(varptr_ptr);
27211: varptr = *varptr_ptr;
27212: Z_ADDREF_P(varptr);
27213: zend_vm_stack_push(varptr TSRMLS_CC);
27214:
1.1.1.2 misho 27215: CHECK_EXCEPTION();
1.1 misho 27216: ZEND_VM_NEXT_OPCODE();
27217: }
27218:
27219: static int ZEND_FASTCALL ZEND_SEND_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27220: {
1.1.1.2 misho 27221: USE_OPLINE
1.1 misho 27222:
27223: if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME)
1.1.1.2 misho 27224: && ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.opline_num)) {
1.1 misho 27225: return ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27226: }
1.1.1.2 misho 27227: SAVE_OPLINE();
1.1 misho 27228: return zend_send_by_var_helper_SPEC_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
27229: }
27230:
27231: static int ZEND_FASTCALL ZEND_BOOL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27232: {
1.1.1.2 misho 27233: USE_OPLINE
1.1 misho 27234:
1.1.1.2 misho 27235: zval *retval = &EX_T(opline->result.var).tmp_var;
1.1 misho 27236:
1.1.1.2 misho 27237: SAVE_OPLINE();
1.1 misho 27238: /* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */
1.1.1.2 misho 27239: ZVAL_BOOL(retval, i_zend_is_true(_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC)));
1.1 misho 27240:
1.1.1.2 misho 27241: CHECK_EXCEPTION();
1.1 misho 27242: ZEND_VM_NEXT_OPCODE();
27243: }
27244:
27245: static int ZEND_FASTCALL ZEND_CLONE_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27246: {
1.1.1.2 misho 27247: USE_OPLINE
1.1 misho 27248:
1.1.1.2 misho 27249: zval *obj;
1.1 misho 27250: zend_class_entry *ce;
27251: zend_function *clone;
27252: zend_object_clone_obj_t clone_call;
27253:
1.1.1.2 misho 27254: SAVE_OPLINE();
27255: obj = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27256:
1.1 misho 27257: if (IS_CV == IS_CONST ||
1.1.1.2 misho 27258: UNEXPECTED(Z_TYPE_P(obj) != IS_OBJECT)) {
1.1 misho 27259: zend_error_noreturn(E_ERROR, "__clone method called on non-object");
27260: }
27261:
27262: ce = Z_OBJCE_P(obj);
27263: clone = ce ? ce->clone : NULL;
27264: clone_call = Z_OBJ_HT_P(obj)->clone_obj;
1.1.1.2 misho 27265: if (UNEXPECTED(clone_call == NULL)) {
1.1 misho 27266: if (ce) {
27267: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name);
27268: } else {
27269: zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
27270: }
27271: }
27272:
27273: if (ce && clone) {
27274: if (clone->op_array.fn_flags & ZEND_ACC_PRIVATE) {
27275: /* Ensure that if we're calling a private function, we're allowed to do so.
27276: */
1.1.1.2 misho 27277: if (UNEXPECTED(ce != EG(scope))) {
1.1 misho 27278: zend_error_noreturn(E_ERROR, "Call to private %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
27279: }
27280: } else if ((clone->common.fn_flags & ZEND_ACC_PROTECTED)) {
27281: /* Ensure that if we're calling a protected function, we're allowed to do so.
27282: */
1.1.1.3 misho 27283: if (UNEXPECTED(!zend_check_protected(zend_get_function_root_class(clone), EG(scope)))) {
1.1 misho 27284: zend_error_noreturn(E_ERROR, "Call to protected %s::__clone() from context '%s'", ce->name, EG(scope) ? EG(scope)->name : "");
27285: }
27286: }
27287: }
27288:
1.1.1.2 misho 27289: if (EXPECTED(EG(exception) == NULL)) {
27290: zval *retval;
27291:
27292: ALLOC_ZVAL(retval);
27293: Z_OBJVAL_P(retval) = clone_call(obj TSRMLS_CC);
27294: Z_TYPE_P(retval) = IS_OBJECT;
27295: Z_SET_REFCOUNT_P(retval, 1);
27296: Z_SET_ISREF_P(retval);
27297: if (!RETURN_VALUE_USED(opline) || UNEXPECTED(EG(exception) != NULL)) {
27298: zval_ptr_dtor(&retval);
27299: } else {
27300: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 27301: }
27302: }
27303:
1.1.1.2 misho 27304: CHECK_EXCEPTION();
1.1 misho 27305: ZEND_VM_NEXT_OPCODE();
27306: }
27307:
27308: static int ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27309: {
1.1.1.2 misho 27310: USE_OPLINE
27311:
27312: zval *expr;
27313: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 27314:
1.1.1.2 misho 27315: SAVE_OPLINE();
27316: expr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27317:
27318: if (opline->extended_value != IS_STRING) {
1.1.1.2 misho 27319: ZVAL_COPY_VALUE(result, expr);
1.1 misho 27320: if (!0) {
27321: zendi_zval_copy_ctor(*result);
27322: }
27323: }
27324: switch (opline->extended_value) {
27325: case IS_NULL:
27326: convert_to_null(result);
27327: break;
27328: case IS_BOOL:
27329: convert_to_boolean(result);
27330: break;
27331: case IS_LONG:
27332: convert_to_long(result);
27333: break;
27334: case IS_DOUBLE:
27335: convert_to_double(result);
27336: break;
27337: case IS_STRING: {
27338: zval var_copy;
27339: int use_copy;
27340:
27341: zend_make_printable_zval(expr, &var_copy, &use_copy);
27342: if (use_copy) {
1.1.1.2 misho 27343: ZVAL_COPY_VALUE(result, &var_copy);
1.1 misho 27344: if (0) {
27345:
27346: }
27347: } else {
1.1.1.2 misho 27348: ZVAL_COPY_VALUE(result, expr);
1.1 misho 27349: if (!0) {
27350: zendi_zval_copy_ctor(*result);
27351: }
27352: }
27353: break;
27354: }
27355: case IS_ARRAY:
27356: convert_to_array(result);
27357: break;
27358: case IS_OBJECT:
27359: convert_to_object(result);
27360: break;
27361: }
27362:
1.1.1.2 misho 27363: CHECK_EXCEPTION();
1.1 misho 27364: ZEND_VM_NEXT_OPCODE();
27365: }
27366:
27367: static int ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27368: {
1.1.1.2 misho 27369: USE_OPLINE
1.1 misho 27370: zend_op_array *new_op_array=NULL;
27371:
1.1.1.2 misho 27372: zval *inc_filename;
27373: zval *tmp_inc_filename = NULL;
1.1 misho 27374: zend_bool failure_retval=0;
27375:
1.1.1.2 misho 27376: SAVE_OPLINE();
27377: inc_filename = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27378:
1.1 misho 27379: if (inc_filename->type!=IS_STRING) {
1.1.1.2 misho 27380: MAKE_STD_ZVAL(tmp_inc_filename);
27381: ZVAL_COPY_VALUE(tmp_inc_filename, inc_filename);
27382: zval_copy_ctor(tmp_inc_filename);
27383: convert_to_string(tmp_inc_filename);
27384: inc_filename = tmp_inc_filename;
1.1 misho 27385: }
27386:
1.1.1.2 misho 27387: if (opline->extended_value != ZEND_EVAL && strlen(Z_STRVAL_P(inc_filename)) != Z_STRLEN_P(inc_filename)) {
27388: if (opline->extended_value == ZEND_INCLUDE_ONCE || opline->extended_value == ZEND_INCLUDE) {
1.1 misho 27389: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
27390: } else {
27391: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
27392: }
27393: } else {
1.1.1.2 misho 27394: switch (opline->extended_value) {
1.1 misho 27395: case ZEND_INCLUDE_ONCE:
27396: case ZEND_REQUIRE_ONCE: {
27397: zend_file_handle file_handle;
27398: char *resolved_path;
27399:
27400: resolved_path = zend_resolve_path(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename) TSRMLS_CC);
27401: if (resolved_path) {
27402: failure_retval = zend_hash_exists(&EG(included_files), resolved_path, strlen(resolved_path)+1);
27403: } else {
27404: resolved_path = Z_STRVAL_P(inc_filename);
27405: }
27406:
27407: if (failure_retval) {
27408: /* do nothing, file already included */
27409: } else if (SUCCESS == zend_stream_open(resolved_path, &file_handle TSRMLS_CC)) {
27410:
27411: if (!file_handle.opened_path) {
27412: file_handle.opened_path = estrdup(resolved_path);
27413: }
27414:
27415: if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
1.1.1.2 misho 27416: new_op_array = zend_compile_file(&file_handle, (opline->extended_value==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
1.1 misho 27417: zend_destroy_file_handle(&file_handle TSRMLS_CC);
27418: } else {
27419: zend_file_handle_dtor(&file_handle TSRMLS_CC);
27420: failure_retval=1;
27421: }
27422: } else {
1.1.1.2 misho 27423: if (opline->extended_value == ZEND_INCLUDE_ONCE) {
1.1 misho 27424: zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
27425: } else {
27426: zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename) TSRMLS_CC);
27427: }
27428: }
27429: if (resolved_path != Z_STRVAL_P(inc_filename)) {
27430: efree(resolved_path);
27431: }
27432: }
27433: break;
27434: case ZEND_INCLUDE:
27435: case ZEND_REQUIRE:
1.1.1.2 misho 27436: new_op_array = compile_filename(opline->extended_value, inc_filename TSRMLS_CC);
1.1 misho 27437: break;
27438: case ZEND_EVAL: {
27439: char *eval_desc = zend_make_compiled_string_description("eval()'d code" TSRMLS_CC);
27440:
27441: new_op_array = zend_compile_string(inc_filename, eval_desc TSRMLS_CC);
27442: efree(eval_desc);
27443: }
27444: break;
27445: EMPTY_SWITCH_DEFAULT_CASE()
27446: }
27447: }
1.1.1.2 misho 27448: if (tmp_inc_filename) {
27449: zval_ptr_dtor(&tmp_inc_filename);
1.1 misho 27450: }
27451:
1.1.1.2 misho 27452: if (UNEXPECTED(EG(exception) != NULL)) {
27453: HANDLE_EXCEPTION();
27454: } else if (EXPECTED(new_op_array != NULL)) {
1.1 misho 27455: EX(original_return_value) = EG(return_value_ptr_ptr);
27456: EG(active_op_array) = new_op_array;
1.1.1.2 misho 27457: if (RETURN_VALUE_USED(opline)) {
27458: EX_T(opline->result.var).var.ptr = NULL;
27459: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
27460: EG(return_value_ptr_ptr) = EX_T(opline->result.var).var.ptr_ptr;
27461: } else {
27462: EG(return_value_ptr_ptr) = NULL;
27463: }
1.1 misho 27464:
27465: EX(current_object) = EX(object);
27466:
27467: EX(function_state).function = (zend_function *) new_op_array;
27468: EX(object) = NULL;
27469:
27470: if (!EG(active_symbol_table)) {
27471: zend_rebuild_symbol_table(TSRMLS_C);
27472: }
27473:
1.1.1.2 misho 27474: if (EXPECTED(zend_execute == execute)) {
1.1 misho 27475: ZEND_VM_ENTER();
27476: } else {
27477: zend_execute(new_op_array TSRMLS_CC);
27478: }
27479:
27480: EX(function_state).function = (zend_function *) EX(op_array);
27481: EX(object) = EX(current_object);
27482:
27483: EG(opline_ptr) = &EX(opline);
27484: EG(active_op_array) = EX(op_array);
27485: EG(return_value_ptr_ptr) = EX(original_return_value);
27486: destroy_op_array(new_op_array TSRMLS_CC);
27487: efree(new_op_array);
1.1.1.2 misho 27488: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 27489: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 27490: HANDLE_EXCEPTION();
27491: } else if (RETURN_VALUE_USED(opline)) {
27492: if (!EX_T(opline->result.var).var.ptr) { /* there was no return statement */
27493: zval *retval;
1.1 misho 27494:
1.1.1.2 misho 27495: ALLOC_ZVAL(retval);
27496: ZVAL_BOOL(retval, 1);
27497: INIT_PZVAL(retval);
27498: EX_T(opline->result.var).var.ptr = retval;
1.1 misho 27499: }
27500: }
27501:
1.1.1.2 misho 27502: } else if (RETURN_VALUE_USED(opline)) {
27503: zval *retval;
1.1 misho 27504:
1.1.1.2 misho 27505: ALLOC_ZVAL(retval);
27506: ZVAL_BOOL(retval, failure_retval);
27507: INIT_PZVAL(retval);
27508: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 27509: }
27510: ZEND_VM_NEXT_OPCODE();
27511: }
27512:
27513: static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27514: {
1.1.1.2 misho 27515: USE_OPLINE
1.1 misho 27516:
27517: zval *array_ptr, **array_ptr_ptr;
27518: HashTable *fe_ht;
27519: zend_object_iterator *iter = NULL;
27520: zend_class_entry *ce = NULL;
27521: zend_bool is_empty = 0;
27522:
1.1.1.2 misho 27523: SAVE_OPLINE();
27524:
27525: if ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
27526: (opline->extended_value & ZEND_FE_RESET_VARIABLE)) {
27527: array_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27528: if (array_ptr_ptr == NULL || array_ptr_ptr == &EG(uninitialized_zval_ptr)) {
1.1.1.2 misho 27529: MAKE_STD_ZVAL(array_ptr);
27530: ZVAL_NULL(array_ptr);
1.1 misho 27531: } else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) {
27532: if(Z_OBJ_HT_PP(array_ptr_ptr)->get_class_entry == NULL) {
27533: zend_error(E_WARNING, "foreach() cannot iterate over objects without PHP class");
1.1.1.2 misho 27534: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 27535: }
27536:
27537: ce = Z_OBJCE_PP(array_ptr_ptr);
27538: if (!ce || ce->get_iterator == NULL) {
27539: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
27540: Z_ADDREF_PP(array_ptr_ptr);
27541: }
27542: array_ptr = *array_ptr_ptr;
27543: } else {
27544: if (Z_TYPE_PP(array_ptr_ptr) == IS_ARRAY) {
27545: SEPARATE_ZVAL_IF_NOT_REF(array_ptr_ptr);
27546: if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
27547: Z_SET_ISREF_PP(array_ptr_ptr);
27548: }
27549: }
27550: array_ptr = *array_ptr_ptr;
27551: Z_ADDREF_P(array_ptr);
27552: }
27553: } else {
1.1.1.2 misho 27554: array_ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27555: if (0) { /* IS_TMP_VAR */
27556: zval *tmp;
27557:
27558: ALLOC_ZVAL(tmp);
27559: INIT_PZVAL_COPY(tmp, array_ptr);
27560: array_ptr = tmp;
27561: if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
27562: ce = Z_OBJCE_P(array_ptr);
27563: if (ce && ce->get_iterator) {
27564: Z_DELREF_P(array_ptr);
27565: }
27566: }
27567: } else if (Z_TYPE_P(array_ptr) == IS_OBJECT) {
27568: ce = Z_OBJCE_P(array_ptr);
27569: if (!ce || !ce->get_iterator) {
27570: Z_ADDREF_P(array_ptr);
27571: }
27572: } else if (IS_CV == IS_CONST ||
27573: ((IS_CV == IS_CV || IS_CV == IS_VAR) &&
27574: !Z_ISREF_P(array_ptr) &&
27575: Z_REFCOUNT_P(array_ptr) > 1)) {
27576: zval *tmp;
27577:
27578: ALLOC_ZVAL(tmp);
27579: INIT_PZVAL_COPY(tmp, array_ptr);
27580: zval_copy_ctor(tmp);
27581: array_ptr = tmp;
27582: } else {
27583: Z_ADDREF_P(array_ptr);
27584: }
27585: }
27586:
27587: if (ce && ce->get_iterator) {
27588: iter = ce->get_iterator(ce, array_ptr, opline->extended_value & ZEND_FE_RESET_REFERENCE TSRMLS_CC);
27589:
1.1.1.2 misho 27590: if (iter && EXPECTED(EG(exception) == NULL)) {
1.1 misho 27591: array_ptr = zend_iterator_wrap(iter TSRMLS_CC);
27592: } else {
27593:
27594: if (!EG(exception)) {
27595: zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name);
27596: }
27597: zend_throw_exception_internal(NULL TSRMLS_CC);
1.1.1.2 misho 27598: HANDLE_EXCEPTION();
1.1 misho 27599: }
27600: }
27601:
1.1.1.2 misho 27602: EX_T(opline->result.var).fe.ptr = array_ptr;
1.1 misho 27603:
27604: if (iter) {
27605: iter->index = 0;
27606: if (iter->funcs->rewind) {
27607: iter->funcs->rewind(iter TSRMLS_CC);
1.1.1.2 misho 27608: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 27609: zval_ptr_dtor(&array_ptr);
27610:
1.1.1.2 misho 27611: HANDLE_EXCEPTION();
1.1 misho 27612: }
27613: }
27614: is_empty = iter->funcs->valid(iter TSRMLS_CC) != SUCCESS;
1.1.1.2 misho 27615: if (UNEXPECTED(EG(exception) != NULL)) {
1.1 misho 27616: zval_ptr_dtor(&array_ptr);
27617:
1.1.1.2 misho 27618: HANDLE_EXCEPTION();
1.1 misho 27619: }
27620: iter->index = -1; /* will be set to 0 before using next handler */
27621: } else if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
27622: zend_hash_internal_pointer_reset(fe_ht);
27623: if (ce) {
27624: zend_object *zobj = zend_objects_get_address(array_ptr TSRMLS_CC);
27625: while (zend_hash_has_more_elements(fe_ht) == SUCCESS) {
27626: char *str_key;
27627: uint str_key_len;
27628: ulong int_key;
27629: zend_uchar key_type;
27630:
27631: key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
27632: if (key_type != HASH_KEY_NON_EXISTANT &&
27633: (key_type == HASH_KEY_IS_LONG ||
27634: zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) {
27635: break;
27636: }
27637: zend_hash_move_forward(fe_ht);
27638: }
27639: }
27640: is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
1.1.1.2 misho 27641: zend_hash_get_pointer(fe_ht, &EX_T(opline->result.var).fe.fe_pos);
1.1 misho 27642: } else {
27643: zend_error(E_WARNING, "Invalid argument supplied for foreach()");
27644: is_empty = 1;
27645: }
27646:
27647: if (is_empty) {
1.1.1.2 misho 27648: ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.opline_num);
1.1 misho 27649: } else {
1.1.1.2 misho 27650: CHECK_EXCEPTION();
1.1 misho 27651: ZEND_VM_NEXT_OPCODE();
27652: }
27653: }
27654:
1.1.1.2 misho 27655: static int ZEND_FASTCALL ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 27656: {
1.1.1.2 misho 27657: #if 0 || (IS_CV != IS_UNUSED)
27658: USE_OPLINE
1.1 misho 27659:
1.1.1.2 misho 27660: SAVE_OPLINE();
27661: if (IS_CV != IS_UNUSED) {
1.1 misho 27662:
1.1.1.2 misho 27663: zval *ptr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27664:
27665: if (Z_TYPE_P(ptr) == IS_LONG) {
27666: EG(exit_status) = Z_LVAL_P(ptr);
1.1 misho 27667: } else {
1.1.1.2 misho 27668: zend_print_variable(ptr);
1.1 misho 27669: }
27670:
1.1.1.2 misho 27671: }
27672: #endif
27673: zend_bailout();
27674: ZEND_VM_NEXT_OPCODE(); /* Never reached */
27675: }
1.1 misho 27676:
1.1.1.2 misho 27677: static int ZEND_FASTCALL ZEND_JMP_SET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27678: {
27679: USE_OPLINE
1.1 misho 27680:
1.1.1.2 misho 27681: zval *value;
1.1 misho 27682:
1.1.1.2 misho 27683: SAVE_OPLINE();
27684: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27685:
1.1.1.2 misho 27686: if (i_zend_is_true(value)) {
27687: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
27688: if (!0) {
27689: zendi_zval_copy_ctor(EX_T(opline->result.var).tmp_var);
27690: }
1.1 misho 27691:
1.1.1.2 misho 27692: #if DEBUG_ZEND>=2
27693: printf("Conditional jmp to %d\n", opline->op2.opline_num);
27694: #endif
27695: ZEND_VM_JMP(opline->op2.jmp_addr);
1.1 misho 27696: }
27697:
1.1.1.2 misho 27698: CHECK_EXCEPTION();
1.1 misho 27699: ZEND_VM_NEXT_OPCODE();
27700: }
27701:
1.1.1.2 misho 27702: static int ZEND_FASTCALL ZEND_JMP_SET_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 27703: {
1.1.1.2 misho 27704: USE_OPLINE
1.1 misho 27705:
1.1.1.2 misho 27706: zval *value, *ret;
1.1 misho 27707:
1.1.1.2 misho 27708: SAVE_OPLINE();
27709: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27710:
27711: if (i_zend_is_true(value)) {
27712: if (IS_CV == IS_VAR || IS_CV == IS_CV) {
27713: Z_ADDREF_P(value);
27714: EX_T(opline->result.var).var.ptr = value;
27715: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 27716: } else {
1.1.1.2 misho 27717: ALLOC_ZVAL(ret);
27718: INIT_PZVAL_COPY(ret, value);
27719: EX_T(opline->result.var).var.ptr = ret;
27720: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
27721: if (!0) {
27722: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
27723: }
1.1 misho 27724: }
27725:
1.1.1.2 misho 27726: #if DEBUG_ZEND>=2
27727: printf("Conditional jmp to %d\n", opline->op2.opline_num);
1.1 misho 27728: #endif
1.1.1.2 misho 27729: ZEND_VM_JMP(opline->op2.jmp_addr);
27730: }
27731:
27732: CHECK_EXCEPTION();
1.1 misho 27733: ZEND_VM_NEXT_OPCODE();
27734: }
27735:
1.1.1.2 misho 27736: static int ZEND_FASTCALL ZEND_QM_ASSIGN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 27737: {
1.1.1.2 misho 27738: USE_OPLINE
1.1 misho 27739:
1.1.1.2 misho 27740: zval *value;
1.1 misho 27741:
1.1.1.2 misho 27742: SAVE_OPLINE();
27743: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 27744:
1.1.1.2 misho 27745: ZVAL_COPY_VALUE(&EX_T(opline->result.var).tmp_var, value);
27746: if (!0) {
27747: zval_copy_ctor(&EX_T(opline->result.var).tmp_var);
1.1 misho 27748: }
27749:
1.1.1.2 misho 27750: CHECK_EXCEPTION();
1.1 misho 27751: ZEND_VM_NEXT_OPCODE();
27752: }
27753:
1.1.1.2 misho 27754: static int ZEND_FASTCALL ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 27755: {
1.1.1.2 misho 27756: USE_OPLINE
1.1 misho 27757:
1.1.1.2 misho 27758: zval *value, *ret;
1.1 misho 27759:
1.1.1.2 misho 27760: SAVE_OPLINE();
27761: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27762:
27763: if (IS_CV == IS_VAR || IS_CV == IS_CV) {
27764: Z_ADDREF_P(value);
27765: EX_T(opline->result.var).var.ptr = value;
27766: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
27767: } else {
27768: ALLOC_ZVAL(ret);
27769: INIT_PZVAL_COPY(ret, value);
27770: EX_T(opline->result.var).var.ptr = ret;
27771: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
27772: if (!0) {
27773: zval_copy_ctor(EX_T(opline->result.var).var.ptr);
27774: }
1.1 misho 27775: }
27776:
1.1.1.2 misho 27777: CHECK_EXCEPTION();
1.1 misho 27778: ZEND_VM_NEXT_OPCODE();
27779: }
27780:
27781: static int ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27782: {
1.1.1.2 misho 27783: USE_OPLINE
1.1 misho 27784:
1.1.1.2 misho 27785: zval *expr;
1.1 misho 27786: zend_bool result;
27787:
1.1.1.2 misho 27788: SAVE_OPLINE();
27789: expr = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
27790:
1.1 misho 27791: if (Z_TYPE_P(expr) == IS_OBJECT && Z_OBJ_HT_P(expr)->get_class_entry) {
1.1.1.2 misho 27792: result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.var).class_entry TSRMLS_CC);
1.1 misho 27793: } else {
27794: result = 0;
27795: }
1.1.1.2 misho 27796: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, result);
1.1 misho 27797:
1.1.1.2 misho 27798: CHECK_EXCEPTION();
1.1 misho 27799: ZEND_VM_NEXT_OPCODE();
27800: }
27801:
27802: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27803: {
1.1.1.2 misho 27804: USE_OPLINE
1.1 misho 27805:
27806:
1.1.1.2 misho 27807: SAVE_OPLINE();
27808: fast_add_function(&EX_T(opline->result.var).tmp_var,
27809: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27810: opline->op2.zv TSRMLS_CC);
1.1 misho 27811:
27812:
1.1.1.2 misho 27813: CHECK_EXCEPTION();
1.1 misho 27814: ZEND_VM_NEXT_OPCODE();
27815: }
27816:
27817: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27818: {
1.1.1.2 misho 27819: USE_OPLINE
1.1 misho 27820:
27821:
1.1.1.2 misho 27822: SAVE_OPLINE();
27823: fast_sub_function(&EX_T(opline->result.var).tmp_var,
27824: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27825: opline->op2.zv TSRMLS_CC);
1.1 misho 27826:
27827:
1.1.1.2 misho 27828: CHECK_EXCEPTION();
1.1 misho 27829: ZEND_VM_NEXT_OPCODE();
27830: }
27831:
27832: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27833: {
1.1.1.2 misho 27834: USE_OPLINE
1.1 misho 27835:
27836:
1.1.1.2 misho 27837: SAVE_OPLINE();
27838: fast_mul_function(&EX_T(opline->result.var).tmp_var,
27839: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27840: opline->op2.zv TSRMLS_CC);
1.1 misho 27841:
27842:
1.1.1.2 misho 27843: CHECK_EXCEPTION();
1.1 misho 27844: ZEND_VM_NEXT_OPCODE();
27845: }
27846:
27847: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27848: {
1.1.1.2 misho 27849: USE_OPLINE
1.1 misho 27850:
27851:
1.1.1.2 misho 27852: SAVE_OPLINE();
27853: fast_div_function(&EX_T(opline->result.var).tmp_var,
27854: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27855: opline->op2.zv TSRMLS_CC);
1.1 misho 27856:
27857:
1.1.1.2 misho 27858: CHECK_EXCEPTION();
1.1 misho 27859: ZEND_VM_NEXT_OPCODE();
27860: }
27861:
27862: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27863: {
1.1.1.2 misho 27864: USE_OPLINE
1.1 misho 27865:
27866:
1.1.1.2 misho 27867: SAVE_OPLINE();
27868: fast_mod_function(&EX_T(opline->result.var).tmp_var,
27869: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27870: opline->op2.zv TSRMLS_CC);
1.1 misho 27871:
27872:
1.1.1.2 misho 27873: CHECK_EXCEPTION();
1.1 misho 27874: ZEND_VM_NEXT_OPCODE();
27875: }
27876:
27877: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27878: {
1.1.1.2 misho 27879: USE_OPLINE
1.1 misho 27880:
27881:
1.1.1.2 misho 27882: SAVE_OPLINE();
27883: shift_left_function(&EX_T(opline->result.var).tmp_var,
27884: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27885: opline->op2.zv TSRMLS_CC);
1.1 misho 27886:
27887:
1.1.1.2 misho 27888: CHECK_EXCEPTION();
1.1 misho 27889: ZEND_VM_NEXT_OPCODE();
27890: }
27891:
27892: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27893: {
1.1.1.2 misho 27894: USE_OPLINE
1.1 misho 27895:
27896:
1.1.1.2 misho 27897: SAVE_OPLINE();
27898: shift_right_function(&EX_T(opline->result.var).tmp_var,
27899: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27900: opline->op2.zv TSRMLS_CC);
1.1 misho 27901:
27902:
1.1.1.2 misho 27903: CHECK_EXCEPTION();
1.1 misho 27904: ZEND_VM_NEXT_OPCODE();
27905: }
27906:
27907: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27908: {
1.1.1.2 misho 27909: USE_OPLINE
1.1 misho 27910:
27911:
1.1.1.2 misho 27912: SAVE_OPLINE();
27913: concat_function(&EX_T(opline->result.var).tmp_var,
27914: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27915: opline->op2.zv TSRMLS_CC);
1.1 misho 27916:
27917:
1.1.1.2 misho 27918: CHECK_EXCEPTION();
1.1 misho 27919: ZEND_VM_NEXT_OPCODE();
27920: }
27921:
27922: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27923: {
1.1.1.2 misho 27924: USE_OPLINE
1.1 misho 27925:
27926:
1.1.1.2 misho 27927: SAVE_OPLINE();
27928: is_identical_function(&EX_T(opline->result.var).tmp_var,
27929: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27930: opline->op2.zv TSRMLS_CC);
1.1 misho 27931:
27932:
1.1.1.2 misho 27933: CHECK_EXCEPTION();
1.1 misho 27934: ZEND_VM_NEXT_OPCODE();
27935: }
27936:
27937: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27938: {
1.1.1.2 misho 27939: USE_OPLINE
1.1 misho 27940:
1.1.1.2 misho 27941: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 27942:
1.1.1.2 misho 27943: SAVE_OPLINE();
1.1 misho 27944: is_identical_function(result,
1.1.1.2 misho 27945: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27946: opline->op2.zv TSRMLS_CC);
1.1 misho 27947: Z_LVAL_P(result) = !Z_LVAL_P(result);
27948:
27949:
1.1.1.2 misho 27950: CHECK_EXCEPTION();
1.1 misho 27951: ZEND_VM_NEXT_OPCODE();
27952: }
27953:
27954: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27955: {
1.1.1.2 misho 27956: USE_OPLINE
1.1 misho 27957:
1.1.1.2 misho 27958: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 27959:
1.1.1.2 misho 27960: SAVE_OPLINE();
27961: ZVAL_BOOL(result, fast_equal_function(result,
27962: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27963: opline->op2.zv TSRMLS_CC));
1.1 misho 27964:
27965:
1.1.1.2 misho 27966: CHECK_EXCEPTION();
1.1 misho 27967: ZEND_VM_NEXT_OPCODE();
27968: }
27969:
27970: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27971: {
1.1.1.2 misho 27972: USE_OPLINE
1.1 misho 27973:
1.1.1.2 misho 27974: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 27975:
1.1.1.2 misho 27976: SAVE_OPLINE();
27977: ZVAL_BOOL(result, fast_not_equal_function(result,
27978: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27979: opline->op2.zv TSRMLS_CC));
1.1 misho 27980:
27981:
1.1.1.2 misho 27982: CHECK_EXCEPTION();
1.1 misho 27983: ZEND_VM_NEXT_OPCODE();
27984: }
27985:
27986: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
27987: {
1.1.1.2 misho 27988: USE_OPLINE
1.1 misho 27989:
1.1.1.2 misho 27990: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 27991:
1.1.1.2 misho 27992: SAVE_OPLINE();
27993: ZVAL_BOOL(result, fast_is_smaller_function(result,
27994: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
27995: opline->op2.zv TSRMLS_CC));
1.1 misho 27996:
27997:
1.1.1.2 misho 27998: CHECK_EXCEPTION();
1.1 misho 27999: ZEND_VM_NEXT_OPCODE();
28000: }
28001:
28002: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28003: {
1.1.1.2 misho 28004: USE_OPLINE
1.1 misho 28005:
1.1.1.2 misho 28006: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 28007:
1.1.1.2 misho 28008: SAVE_OPLINE();
28009: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
28010: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
28011: opline->op2.zv TSRMLS_CC));
1.1 misho 28012:
28013:
1.1.1.2 misho 28014: CHECK_EXCEPTION();
1.1 misho 28015: ZEND_VM_NEXT_OPCODE();
28016: }
28017:
28018: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28019: {
1.1.1.2 misho 28020: USE_OPLINE
1.1 misho 28021:
28022:
1.1.1.2 misho 28023: SAVE_OPLINE();
28024: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
28025: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
28026: opline->op2.zv TSRMLS_CC);
1.1 misho 28027:
28028:
1.1.1.2 misho 28029: CHECK_EXCEPTION();
1.1 misho 28030: ZEND_VM_NEXT_OPCODE();
28031: }
28032:
28033: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28034: {
1.1.1.2 misho 28035: USE_OPLINE
1.1 misho 28036:
28037:
1.1.1.2 misho 28038: SAVE_OPLINE();
28039: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
28040: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
28041: opline->op2.zv TSRMLS_CC);
1.1 misho 28042:
28043:
1.1.1.2 misho 28044: CHECK_EXCEPTION();
1.1 misho 28045: ZEND_VM_NEXT_OPCODE();
28046: }
28047:
28048: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28049: {
1.1.1.2 misho 28050: USE_OPLINE
1.1 misho 28051:
28052:
1.1.1.2 misho 28053: SAVE_OPLINE();
28054: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
28055: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
28056: opline->op2.zv TSRMLS_CC);
1.1 misho 28057:
28058:
1.1.1.2 misho 28059: CHECK_EXCEPTION();
1.1 misho 28060: ZEND_VM_NEXT_OPCODE();
28061: }
28062:
28063: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28064: {
1.1.1.2 misho 28065: USE_OPLINE
1.1 misho 28066:
28067:
1.1.1.2 misho 28068: SAVE_OPLINE();
28069: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
28070: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
28071: opline->op2.zv TSRMLS_CC);
1.1 misho 28072:
28073:
1.1.1.2 misho 28074: CHECK_EXCEPTION();
1.1 misho 28075: ZEND_VM_NEXT_OPCODE();
28076: }
28077:
28078: 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)
28079: {
1.1.1.2 misho 28080: USE_OPLINE
1.1 misho 28081: zend_free_op free_op_data1;
1.1.1.2 misho 28082: zval **object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28083: zval *object;
1.1.1.2 misho 28084: zval *property = opline->op2.zv;
28085: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 28086: int have_get_ptr = 0;
28087:
1.1.1.2 misho 28088: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 28089: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
28090: }
28091:
28092: make_real_object(object_ptr TSRMLS_CC);
28093: object = *object_ptr;
28094:
1.1.1.2 misho 28095: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 28096: zend_error(E_WARNING, "Attempt to assign property of non-object");
28097:
28098: FREE_OP(free_op_data1);
28099:
1.1.1.2 misho 28100: if (RETURN_VALUE_USED(opline)) {
28101: PZVAL_LOCK(&EG(uninitialized_zval));
28102: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
28103: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 28104: }
28105: } else {
28106: /* here we are sure we are dealing with an object */
28107: if (0) {
28108: MAKE_REAL_ZVAL_PTR(property);
28109: }
28110:
28111: /* here property is a string */
28112: if (opline->extended_value == ZEND_ASSIGN_OBJ
28113: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 28114: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28115: if (zptr != NULL) { /* NULL means no success in getting PTR */
28116: SEPARATE_ZVAL_IF_NOT_REF(zptr);
28117:
28118: have_get_ptr = 1;
28119: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 28120: if (RETURN_VALUE_USED(opline)) {
1.1 misho 28121: PZVAL_LOCK(*zptr);
1.1.1.2 misho 28122: EX_T(opline->result.var).var.ptr = *zptr;
28123: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 28124: }
28125: }
28126: }
28127:
28128: if (!have_get_ptr) {
28129: zval *z = NULL;
28130:
28131: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
28132: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 28133: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28134: }
28135: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
28136: if (Z_OBJ_HT_P(object)->read_dimension) {
28137: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
28138: }
28139: }
28140: if (z) {
28141: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
28142: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
28143:
28144: if (Z_REFCOUNT_P(z) == 0) {
28145: GC_REMOVE_ZVAL_FROM_BUFFER(z);
28146: zval_dtor(z);
28147: FREE_ZVAL(z);
28148: }
28149: z = value;
28150: }
28151: Z_ADDREF_P(z);
28152: SEPARATE_ZVAL_IF_NOT_REF(&z);
28153: binary_op(z, z, value TSRMLS_CC);
28154: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 28155: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28156: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
28157: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
28158: }
1.1.1.2 misho 28159: if (RETURN_VALUE_USED(opline)) {
1.1 misho 28160: PZVAL_LOCK(z);
1.1.1.2 misho 28161: EX_T(opline->result.var).var.ptr = z;
28162: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 28163: }
28164: zval_ptr_dtor(&z);
28165: } else {
28166: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 28167: if (RETURN_VALUE_USED(opline)) {
28168: PZVAL_LOCK(&EG(uninitialized_zval));
28169: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
28170: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 28171: }
28172: }
28173: }
28174:
28175: if (0) {
28176: zval_ptr_dtor(&property);
28177: } else {
28178:
28179: }
28180: FREE_OP(free_op_data1);
28181: }
28182:
28183: /* assign_obj has two opcodes! */
1.1.1.2 misho 28184: CHECK_EXCEPTION();
1.1 misho 28185: ZEND_VM_INC_OPCODE();
28186: ZEND_VM_NEXT_OPCODE();
28187: }
28188:
28189: 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)
28190: {
1.1.1.2 misho 28191: USE_OPLINE
1.1 misho 28192: zend_free_op free_op_data2, free_op_data1;
28193: zval **var_ptr;
28194: zval *value;
28195:
1.1.1.2 misho 28196: SAVE_OPLINE();
1.1 misho 28197: switch (opline->extended_value) {
28198: case ZEND_ASSIGN_OBJ:
28199: return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28200: break;
28201: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 28202: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28203:
1.1.1.2 misho 28204: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28205: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 28206: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 28207: if (IS_CV == IS_VAR && !0) {
28208: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
28209: }
28210: return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28211: } else {
1.1.1.2 misho 28212: zval *dim = opline->op2.zv;
1.1 misho 28213:
1.1.1.2 misho 28214: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
28215: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
28216: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 28217: }
28218: }
28219: break;
28220: default:
1.1.1.2 misho 28221: value = opline->op2.zv;
28222: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28223: /* do nothing */
28224: break;
28225: }
28226:
1.1.1.2 misho 28227: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 28228: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
28229: }
28230:
1.1.1.2 misho 28231: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
28232: if (RETURN_VALUE_USED(opline)) {
28233: PZVAL_LOCK(&EG(uninitialized_zval));
28234: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 28235: }
28236:
28237:
1.1.1.2 misho 28238: CHECK_EXCEPTION();
28239: if (opline->extended_value == ZEND_ASSIGN_DIM) {
28240: ZEND_VM_INC_OPCODE();
28241: }
1.1 misho 28242: ZEND_VM_NEXT_OPCODE();
28243: }
28244:
28245: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
28246:
1.1.1.2 misho 28247: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
28248: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 28249: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
28250: /* proxy object */
28251: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
28252: Z_ADDREF_P(objval);
28253: binary_op(objval, objval, value TSRMLS_CC);
28254: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
28255: zval_ptr_dtor(&objval);
28256: } else {
28257: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
28258: }
28259:
1.1.1.2 misho 28260: if (RETURN_VALUE_USED(opline)) {
1.1 misho 28261: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 28262: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 28263: }
28264:
28265: if (opline->extended_value == ZEND_ASSIGN_DIM) {
28266: FREE_OP(free_op_data1);
28267: FREE_OP_VAR_PTR(free_op_data2);
28268:
1.1.1.2 misho 28269: CHECK_EXCEPTION();
28270: ZEND_VM_INC_OPCODE();
28271: } else {
28272:
28273: CHECK_EXCEPTION();
28274: }
1.1 misho 28275: ZEND_VM_NEXT_OPCODE();
28276: }
28277:
28278: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28279: {
28280: return zend_binary_assign_op_helper_SPEC_CV_CONST(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28281: }
28282:
28283: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28284: {
28285: return zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28286: }
28287:
28288: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28289: {
28290: return zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28291: }
28292:
28293: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28294: {
28295: return zend_binary_assign_op_helper_SPEC_CV_CONST(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28296: }
28297:
28298: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28299: {
28300: return zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28301: }
28302:
28303: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28304: {
28305: return zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28306: }
28307:
28308: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28309: {
28310: return zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28311: }
28312:
28313: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28314: {
28315: return zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28316: }
28317:
28318: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28319: {
28320: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28321: }
28322:
28323: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28324: {
28325: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28326: }
28327:
28328: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28329: {
28330: return zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28331: }
28332:
28333: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
28334: {
1.1.1.2 misho 28335: USE_OPLINE
1.1 misho 28336:
1.1.1.2 misho 28337: zval **object_ptr;
1.1 misho 28338: zval *object;
1.1.1.2 misho 28339: zval *property;
28340: zval **retval;
1.1 misho 28341: int have_get_ptr = 0;
28342:
1.1.1.2 misho 28343: SAVE_OPLINE();
28344: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
28345: property = opline->op2.zv;
28346: retval = &EX_T(opline->result.var).var.ptr;
28347:
28348: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 28349: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
28350: }
28351:
28352: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
28353: object = *object_ptr;
28354:
1.1.1.2 misho 28355: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 28356: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
28357:
1.1.1.2 misho 28358: if (RETURN_VALUE_USED(opline)) {
28359: PZVAL_LOCK(&EG(uninitialized_zval));
28360: *retval = &EG(uninitialized_zval);
1.1 misho 28361: }
28362:
1.1.1.2 misho 28363: CHECK_EXCEPTION();
1.1 misho 28364: ZEND_VM_NEXT_OPCODE();
28365: }
28366:
28367: /* here we are sure we are dealing with an object */
28368:
28369: if (0) {
28370: MAKE_REAL_ZVAL_PTR(property);
28371: }
28372:
28373: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 28374: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28375: if (zptr != NULL) { /* NULL means no success in getting PTR */
28376: SEPARATE_ZVAL_IF_NOT_REF(zptr);
28377:
28378: have_get_ptr = 1;
28379: incdec_op(*zptr);
1.1.1.2 misho 28380: if (RETURN_VALUE_USED(opline)) {
1.1 misho 28381: *retval = *zptr;
28382: PZVAL_LOCK(*retval);
28383: }
28384: }
28385: }
28386:
28387: if (!have_get_ptr) {
28388: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 28389: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28390:
1.1.1.2 misho 28391: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 28392: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
28393:
28394: if (Z_REFCOUNT_P(z) == 0) {
28395: GC_REMOVE_ZVAL_FROM_BUFFER(z);
28396: zval_dtor(z);
28397: FREE_ZVAL(z);
28398: }
28399: z = value;
28400: }
28401: Z_ADDREF_P(z);
28402: SEPARATE_ZVAL_IF_NOT_REF(&z);
28403: incdec_op(z);
28404: *retval = z;
1.1.1.2 misho 28405: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
28406: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 28407: zval_ptr_dtor(&z);
28408: } else {
28409: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 28410: if (RETURN_VALUE_USED(opline)) {
28411: PZVAL_LOCK(&EG(uninitialized_zval));
28412: *retval = &EG(uninitialized_zval);
1.1 misho 28413: }
28414: }
28415: }
28416:
28417: if (0) {
28418: zval_ptr_dtor(&property);
28419: } else {
28420:
28421: }
28422:
1.1.1.2 misho 28423: CHECK_EXCEPTION();
1.1 misho 28424: ZEND_VM_NEXT_OPCODE();
28425: }
28426:
28427: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28428: {
28429: return zend_pre_incdec_property_helper_SPEC_CV_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28430: }
28431:
28432: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28433: {
28434: return zend_pre_incdec_property_helper_SPEC_CV_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28435: }
28436:
28437: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
28438: {
1.1.1.2 misho 28439: USE_OPLINE
1.1 misho 28440:
1.1.1.2 misho 28441: zval **object_ptr;
1.1 misho 28442: zval *object;
1.1.1.2 misho 28443: zval *property;
28444: zval *retval;
1.1 misho 28445: int have_get_ptr = 0;
28446:
1.1.1.2 misho 28447: SAVE_OPLINE();
28448: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
28449: property = opline->op2.zv;
28450: retval = &EX_T(opline->result.var).tmp_var;
28451:
28452: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 28453: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
28454: }
28455:
28456: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
28457: object = *object_ptr;
28458:
1.1.1.2 misho 28459: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 28460: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
28461:
1.1.1.2 misho 28462: ZVAL_NULL(retval);
1.1 misho 28463:
1.1.1.2 misho 28464: CHECK_EXCEPTION();
1.1 misho 28465: ZEND_VM_NEXT_OPCODE();
28466: }
28467:
28468: /* here we are sure we are dealing with an object */
28469:
28470: if (0) {
28471: MAKE_REAL_ZVAL_PTR(property);
28472: }
28473:
28474: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 28475: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28476: if (zptr != NULL) { /* NULL means no success in getting PTR */
28477: have_get_ptr = 1;
28478: SEPARATE_ZVAL_IF_NOT_REF(zptr);
28479:
1.1.1.2 misho 28480: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 28481: zendi_zval_copy_ctor(*retval);
28482:
28483: incdec_op(*zptr);
28484:
28485: }
28486: }
28487:
28488: if (!have_get_ptr) {
28489: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 28490: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28491: zval *z_copy;
28492:
1.1.1.2 misho 28493: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 28494: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
28495:
28496: if (Z_REFCOUNT_P(z) == 0) {
28497: GC_REMOVE_ZVAL_FROM_BUFFER(z);
28498: zval_dtor(z);
28499: FREE_ZVAL(z);
28500: }
28501: z = value;
28502: }
1.1.1.2 misho 28503: ZVAL_COPY_VALUE(retval, z);
1.1 misho 28504: zendi_zval_copy_ctor(*retval);
28505: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 28506: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 28507: zendi_zval_copy_ctor(*z_copy);
28508: incdec_op(z_copy);
28509: Z_ADDREF_P(z);
1.1.1.2 misho 28510: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28511: zval_ptr_dtor(&z_copy);
28512: zval_ptr_dtor(&z);
28513: } else {
28514: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 28515: ZVAL_NULL(retval);
1.1 misho 28516: }
28517: }
28518:
28519: if (0) {
28520: zval_ptr_dtor(&property);
28521: } else {
28522:
28523: }
28524:
1.1.1.2 misho 28525: CHECK_EXCEPTION();
1.1 misho 28526: ZEND_VM_NEXT_OPCODE();
28527: }
28528:
28529: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28530: {
28531: return zend_post_incdec_property_helper_SPEC_CV_CONST(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28532: }
28533:
28534: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28535: {
28536: return zend_post_incdec_property_helper_SPEC_CV_CONST(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28537: }
28538:
1.1.1.2 misho 28539: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, ZEND_OPCODE_HANDLER_ARGS)
28540: {
28541: USE_OPLINE
28542: zend_free_op free_op1;
28543: zval *varname;
28544: zval **retval;
28545: zval tmp_varname;
28546: HashTable *target_symbol_table;
28547: ulong hash_value;
28548:
28549: SAVE_OPLINE();
28550: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
28551:
28552: if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
28553: ZVAL_COPY_VALUE(&tmp_varname, varname);
28554: zval_copy_ctor(&tmp_varname);
28555: Z_SET_REFCOUNT(tmp_varname, 1);
28556: Z_UNSET_ISREF(tmp_varname);
28557: convert_to_string(&tmp_varname);
28558: varname = &tmp_varname;
28559: }
28560:
28561: if (IS_CONST != IS_UNUSED) {
28562: zend_class_entry *ce;
28563:
28564: if (IS_CONST == IS_CONST) {
28565: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
28566: ce = CACHED_PTR(opline->op2.literal->cache_slot);
28567: } else {
28568: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
28569: if (UNEXPECTED(ce == NULL)) {
28570: if (IS_CV != IS_CONST && varname == &tmp_varname) {
28571: zval_dtor(&tmp_varname);
28572: }
28573:
28574: CHECK_EXCEPTION();
28575: ZEND_VM_NEXT_OPCODE();
28576: }
28577: CACHE_PTR(opline->op2.literal->cache_slot, ce);
28578: }
28579: } else {
28580: ce = EX_T(opline->op2.var).class_entry;
28581: }
28582: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
28583:
28584: } else {
28585: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
28586: /*
28587: if (!target_symbol_table) {
28588: CHECK_EXCEPTION();
28589: ZEND_VM_NEXT_OPCODE();
28590: }
28591: */
28592: if (IS_CV == IS_CONST) {
28593: hash_value = Z_HASH_P(varname);
28594: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
28595: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
28596: } else {
28597: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
28598: }
28599:
28600: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
28601: switch (type) {
28602: case BP_VAR_R:
28603: case BP_VAR_UNSET:
28604: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
28605: /* break missing intentionally */
28606: case BP_VAR_IS:
28607: retval = &EG(uninitialized_zval_ptr);
28608: break;
28609: case BP_VAR_RW:
28610: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
28611: /* break missing intentionally */
28612: case BP_VAR_W:
28613: Z_ADDREF_P(&EG(uninitialized_zval));
28614: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
28615: break;
28616: EMPTY_SWITCH_DEFAULT_CASE()
28617: }
28618: }
28619: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
28620: case ZEND_FETCH_GLOBAL:
28621: if (IS_CV != IS_TMP_VAR) {
28622:
28623: }
28624: break;
28625: case ZEND_FETCH_LOCAL:
28626:
28627: break;
28628: case ZEND_FETCH_STATIC:
28629: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
28630: break;
28631: case ZEND_FETCH_GLOBAL_LOCK:
28632: if (IS_CV == IS_VAR && !free_op1.var) {
28633: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
28634: }
28635: break;
28636: }
28637: }
28638:
28639:
28640: if (IS_CV != IS_CONST && varname == &tmp_varname) {
28641: zval_dtor(&tmp_varname);
28642: }
28643: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
28644: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
28645: }
28646: PZVAL_LOCK(*retval);
28647: switch (type) {
28648: case BP_VAR_R:
28649: case BP_VAR_IS:
28650: AI_SET_PTR(&EX_T(opline->result.var), *retval);
28651: break;
28652: case BP_VAR_UNSET: {
28653: zend_free_op free_res;
28654:
28655: PZVAL_UNLOCK(*retval, &free_res);
28656: if (retval != &EG(uninitialized_zval_ptr)) {
28657: SEPARATE_ZVAL_IF_NOT_REF(retval);
28658: }
28659: PZVAL_LOCK(*retval);
28660: FREE_OP_VAR_PTR(free_res);
28661: }
28662: /* break missing intentionally */
28663: default:
28664: EX_T(opline->result.var).var.ptr_ptr = retval;
28665: break;
28666: }
28667: CHECK_EXCEPTION();
28668: ZEND_VM_NEXT_OPCODE();
28669: }
28670:
28671: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28672: {
28673: return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28674: }
28675:
28676: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28677: {
28678: return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28679: }
28680:
28681: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28682: {
28683: return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28684: }
28685:
28686: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28687: {
28688: USE_OPLINE
28689:
28690: return zend_fetch_var_address_helper_SPEC_CV_CONST(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28691: }
28692:
28693: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28694: {
28695: return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28696: }
28697:
28698: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28699: {
28700: return zend_fetch_var_address_helper_SPEC_CV_CONST(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
28701: }
28702:
1.1 misho 28703: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28704: {
1.1.1.2 misho 28705: USE_OPLINE
1.1 misho 28706:
1.1.1.5 ! misho 28707: zval *container;
1.1 misho 28708:
1.1.1.2 misho 28709: SAVE_OPLINE();
28710:
1.1.1.5 ! misho 28711: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 28712: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 28713: }
1.1.1.5 ! misho 28714: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 28715: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
1.1 misho 28716:
28717:
1.1.1.2 misho 28718: CHECK_EXCEPTION();
1.1 misho 28719: ZEND_VM_NEXT_OPCODE();
28720: }
28721:
28722: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28723: {
1.1.1.2 misho 28724: USE_OPLINE
1.1 misho 28725: zend_free_op free_op1;
1.1.1.2 misho 28726: zval **container;
1.1 misho 28727:
1.1.1.2 misho 28728: SAVE_OPLINE();
28729: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
28730:
28731: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28732: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
28733: }
1.1.1.2 misho 28734: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
1.1 misho 28735:
1.1.1.2 misho 28736: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28737: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28738: }
28739:
28740: /* We are going to assign the result by reference */
1.1.1.2 misho 28741: if (UNEXPECTED(opline->extended_value != 0)) {
28742: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
28743:
28744: if (retval_ptr) {
28745: Z_DELREF_PP(retval_ptr);
28746: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
28747: Z_ADDREF_PP(retval_ptr);
28748: }
1.1 misho 28749: }
28750:
1.1.1.2 misho 28751: CHECK_EXCEPTION();
1.1 misho 28752: ZEND_VM_NEXT_OPCODE();
28753: }
28754:
28755: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28756: {
1.1.1.2 misho 28757: USE_OPLINE
1.1 misho 28758: zend_free_op free_op1;
1.1.1.2 misho 28759: zval **container;
28760:
28761: SAVE_OPLINE();
28762: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28763:
1.1.1.2 misho 28764: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28765: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
28766: }
1.1.1.2 misho 28767: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW TSRMLS_CC);
1.1 misho 28768:
1.1.1.2 misho 28769: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28770: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28771: }
28772:
1.1.1.2 misho 28773: CHECK_EXCEPTION();
1.1 misho 28774: ZEND_VM_NEXT_OPCODE();
28775: }
28776:
28777: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28778: {
1.1.1.2 misho 28779: USE_OPLINE
1.1 misho 28780:
1.1.1.5 ! misho 28781: zval *container;
1.1 misho 28782:
1.1.1.2 misho 28783: SAVE_OPLINE();
1.1.1.5 ! misho 28784: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 28785: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_IS TSRMLS_CC);
1.1 misho 28786:
28787:
1.1.1.2 misho 28788: CHECK_EXCEPTION();
1.1 misho 28789: ZEND_VM_NEXT_OPCODE();
28790: }
28791:
28792: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28793: {
1.1.1.2 misho 28794: USE_OPLINE
1.1 misho 28795: zend_free_op free_op1;
28796:
1.1.1.2 misho 28797: SAVE_OPLINE();
28798:
28799: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 28800: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
! 28801:
1.1.1.2 misho 28802: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28803: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
28804: }
1.1.1.2 misho 28805: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
28806: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28807: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28808: }
1.1.1.5 ! misho 28809:
! 28810:
1.1 misho 28811: } else {
1.1.1.5 ! misho 28812: zval *container;
! 28813:
1.1 misho 28814: if (IS_CONST == IS_UNUSED) {
28815: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
28816: }
1.1.1.5 ! misho 28817: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 28818: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_R TSRMLS_CC);
1.1 misho 28819:
28820:
1.1.1.5 ! misho 28821: }
1.1.1.2 misho 28822: CHECK_EXCEPTION();
1.1 misho 28823: ZEND_VM_NEXT_OPCODE();
28824: }
28825:
28826: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28827: {
1.1.1.2 misho 28828: USE_OPLINE
1.1 misho 28829: zend_free_op free_op1;
1.1.1.2 misho 28830: zval **container;
28831:
28832: SAVE_OPLINE();
28833: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28834:
28835: if (IS_CV == IS_CV) {
28836: if (container != &EG(uninitialized_zval_ptr)) {
28837: SEPARATE_ZVAL_IF_NOT_REF(container);
28838: }
28839: }
1.1.1.2 misho 28840: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28841: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
28842: }
1.1.1.2 misho 28843: zend_fetch_dimension_address(&EX_T(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 28844:
1.1.1.2 misho 28845: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28846: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28847: }
28848:
1.1.1.2 misho 28849: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 28850: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
28851: } else {
28852: zend_free_op free_res;
1.1.1.2 misho 28853: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 28854:
1.1.1.2 misho 28855: PZVAL_UNLOCK(*retval_ptr, &free_res);
28856: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
28857: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 28858: }
1.1.1.2 misho 28859: PZVAL_LOCK(*retval_ptr);
1.1 misho 28860: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 28861: CHECK_EXCEPTION();
28862: ZEND_VM_NEXT_OPCODE();
1.1 misho 28863: }
28864: }
28865:
1.1.1.2 misho 28866: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CONST(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 28867: {
1.1.1.2 misho 28868: USE_OPLINE
1.1 misho 28869:
1.1.1.2 misho 28870: zval *container;
1.1 misho 28871:
1.1.1.2 misho 28872: zval *offset;
1.1 misho 28873:
1.1.1.2 misho 28874: SAVE_OPLINE();
28875: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
28876: offset = opline->op2.zv;
28877:
28878: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
28879: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
28880: zend_error(E_NOTICE, "Trying to get property of non-object");
28881: PZVAL_LOCK(&EG(uninitialized_zval));
28882: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 28883:
28884: } else {
28885: zval *retval;
28886:
28887: if (0) {
28888: MAKE_REAL_ZVAL_PTR(offset);
28889: }
28890:
28891: /* here we are sure we are dealing with an object */
1.1.1.2 misho 28892: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 28893:
1.1.1.2 misho 28894: PZVAL_LOCK(retval);
28895: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 28896:
28897: if (0) {
28898: zval_ptr_dtor(&offset);
28899: } else {
28900:
28901: }
28902: }
28903:
1.1.1.2 misho 28904: CHECK_EXCEPTION();
1.1 misho 28905: ZEND_VM_NEXT_OPCODE();
28906: }
28907:
28908: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28909: {
1.1.1.2 misho 28910: return zend_fetch_property_address_read_helper_SPEC_CV_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 28911: }
28912:
28913: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28914: {
1.1.1.2 misho 28915: USE_OPLINE
1.1 misho 28916: zend_free_op free_op1;
1.1.1.2 misho 28917: zval *property;
1.1 misho 28918: zval **container;
28919:
1.1.1.2 misho 28920: SAVE_OPLINE();
28921: property = opline->op2.zv;
28922:
1.1 misho 28923: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 28924: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
28925: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 28926: }
28927:
28928: if (0) {
28929: MAKE_REAL_ZVAL_PTR(property);
28930: }
1.1.1.2 misho 28931: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
28932: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28933: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
28934: }
1.1.1.2 misho 28935:
28936: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 28937: if (0) {
28938: zval_ptr_dtor(&property);
28939: } else {
28940:
28941: }
1.1.1.2 misho 28942: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28943: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28944: }
28945:
28946: /* We are going to assign the result by reference */
28947: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 28948: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
28949:
28950: Z_DELREF_PP(retval_ptr);
28951: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
28952: Z_ADDREF_PP(retval_ptr);
28953: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
28954: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 28955: }
28956:
1.1.1.2 misho 28957: CHECK_EXCEPTION();
1.1 misho 28958: ZEND_VM_NEXT_OPCODE();
28959: }
28960:
28961: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28962: {
1.1.1.2 misho 28963: USE_OPLINE
1.1 misho 28964: zend_free_op free_op1;
1.1.1.2 misho 28965: zval *property;
28966: zval **container;
28967:
28968: SAVE_OPLINE();
28969: property = opline->op2.zv;
28970: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 28971:
28972: if (0) {
28973: MAKE_REAL_ZVAL_PTR(property);
28974: }
1.1.1.2 misho 28975: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 28976: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
28977: }
1.1.1.2 misho 28978: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 28979: if (0) {
28980: zval_ptr_dtor(&property);
28981: } else {
28982:
28983: }
1.1.1.2 misho 28984: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
28985: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 28986: }
28987:
1.1.1.2 misho 28988: CHECK_EXCEPTION();
1.1 misho 28989: ZEND_VM_NEXT_OPCODE();
28990: }
28991:
28992: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
28993: {
1.1.1.2 misho 28994: USE_OPLINE
28995:
28996: zval *container;
28997:
28998: zval *offset;
28999:
29000: SAVE_OPLINE();
29001: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
29002: offset = opline->op2.zv;
29003:
29004: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
29005: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
29006: PZVAL_LOCK(&EG(uninitialized_zval));
29007: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
29008:
29009: } else {
29010: zval *retval;
29011:
29012: if (0) {
29013: MAKE_REAL_ZVAL_PTR(offset);
29014: }
29015:
29016: /* here we are sure we are dealing with an object */
29017: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
29018:
29019: PZVAL_LOCK(retval);
29020: AI_SET_PTR(&EX_T(opline->result.var), retval);
29021:
29022: if (0) {
29023: zval_ptr_dtor(&offset);
29024: } else {
29025:
29026: }
29027: }
29028:
29029: CHECK_EXCEPTION();
29030: ZEND_VM_NEXT_OPCODE();
1.1 misho 29031: }
29032:
29033: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29034: {
1.1.1.2 misho 29035: USE_OPLINE
1.1 misho 29036:
1.1.1.2 misho 29037: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 29038: /* Behave like FETCH_OBJ_W */
29039: zend_free_op free_op1;
1.1.1.2 misho 29040: zval *property;
29041: zval **container;
29042:
29043: SAVE_OPLINE();
29044: property = opline->op2.zv;
29045: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 29046:
29047: if (0) {
29048: MAKE_REAL_ZVAL_PTR(property);
29049: }
1.1.1.2 misho 29050: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 29051: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
29052: }
1.1.1.2 misho 29053: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 29054: if (0) {
29055: zval_ptr_dtor(&property);
29056: } else {
29057:
29058: }
1.1.1.2 misho 29059: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
29060: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 29061: }
29062:
1.1.1.2 misho 29063: CHECK_EXCEPTION();
1.1 misho 29064: ZEND_VM_NEXT_OPCODE();
29065: } else {
1.1.1.2 misho 29066: return zend_fetch_property_address_read_helper_SPEC_CV_CONST(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 29067: }
29068: }
29069:
29070: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29071: {
1.1.1.2 misho 29072: USE_OPLINE
1.1 misho 29073: zend_free_op free_op1, free_res;
1.1.1.2 misho 29074: zval **container;
29075: zval *property;
29076:
29077: SAVE_OPLINE();
29078: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
29079: property = opline->op2.zv;
1.1 misho 29080:
29081: if (IS_CV == IS_CV) {
29082: if (container != &EG(uninitialized_zval_ptr)) {
29083: SEPARATE_ZVAL_IF_NOT_REF(container);
29084: }
29085: }
29086: if (0) {
29087: MAKE_REAL_ZVAL_PTR(property);
29088: }
1.1.1.2 misho 29089: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 29090: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
29091: }
1.1.1.2 misho 29092: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 29093: if (0) {
29094: zval_ptr_dtor(&property);
29095: } else {
29096:
29097: }
1.1.1.2 misho 29098: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
29099: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 29100: }
29101:
1.1.1.2 misho 29102: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
29103: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
29104: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 29105: }
1.1.1.2 misho 29106: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 29107: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 29108: CHECK_EXCEPTION();
1.1 misho 29109: ZEND_VM_NEXT_OPCODE();
29110: }
29111:
29112: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29113: {
1.1.1.2 misho 29114: USE_OPLINE
29115:
29116: zval **object_ptr;
29117: zval *property_name;
1.1 misho 29118:
1.1.1.2 misho 29119: SAVE_OPLINE();
29120: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
29121: property_name = opline->op2.zv;
1.1 misho 29122:
29123: if (0) {
29124: MAKE_REAL_ZVAL_PTR(property_name);
29125: }
1.1.1.2 misho 29126: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 29127: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
29128: }
1.1.1.2 misho 29129: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 29130: if (0) {
29131: zval_ptr_dtor(&property_name);
29132: } else {
29133:
29134: }
29135:
29136: /* assign_obj has two opcodes! */
1.1.1.2 misho 29137: CHECK_EXCEPTION();
1.1 misho 29138: ZEND_VM_INC_OPCODE();
29139: ZEND_VM_NEXT_OPCODE();
29140: }
29141:
29142: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29143: {
1.1.1.2 misho 29144: USE_OPLINE
1.1 misho 29145:
1.1.1.2 misho 29146: zval **object_ptr;
1.1 misho 29147:
1.1.1.2 misho 29148: SAVE_OPLINE();
29149: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
29150:
29151: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 29152: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
29153: }
29154: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
29155:
1.1.1.2 misho 29156: zval *property_name = opline->op2.zv;
1.1 misho 29157:
29158: if (0) {
29159: MAKE_REAL_ZVAL_PTR(property_name);
29160: }
1.1.1.2 misho 29161: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 29162: if (0) {
29163: zval_ptr_dtor(&property_name);
29164: } else {
29165:
29166: }
29167: } else {
29168: zend_free_op free_op_data1, free_op_data2;
29169: zval *value;
1.1.1.2 misho 29170: zval *dim = opline->op2.zv;
1.1 misho 29171: zval **variable_ptr_ptr;
29172:
1.1.1.2 misho 29173: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W TSRMLS_CC);
29174:
29175: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
29176: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
29177: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
29178: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
29179: if (RETURN_VALUE_USED(opline)) {
29180: zval *retval;
1.1 misho 29181:
1.1.1.2 misho 29182: ALLOC_ZVAL(retval);
29183: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
29184: INIT_PZVAL(retval);
29185: AI_SET_PTR(&EX_T(opline->result.var), retval);
29186: }
29187: } else if (RETURN_VALUE_USED(opline)) {
29188: PZVAL_LOCK(&EG(uninitialized_zval));
29189: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
29190: }
29191: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
29192: if (IS_TMP_FREE(free_op_data1)) {
29193: zval_dtor(value);
29194: }
29195: if (RETURN_VALUE_USED(opline)) {
29196: PZVAL_LOCK(&EG(uninitialized_zval));
29197: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
29198: }
29199: } else {
29200: if ((opline+1)->op1_type == IS_TMP_VAR) {
29201: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29202: } else if ((opline+1)->op1_type == IS_CONST) {
29203: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29204: } else {
29205: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29206: }
29207: if (RETURN_VALUE_USED(opline)) {
1.1 misho 29208: PZVAL_LOCK(value);
1.1.1.2 misho 29209: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 29210: }
29211: }
29212: FREE_OP_VAR_PTR(free_op_data2);
29213: FREE_OP_IF_VAR(free_op_data1);
29214: }
29215:
29216: /* assign_dim has two opcodes! */
1.1.1.2 misho 29217: CHECK_EXCEPTION();
1.1 misho 29218: ZEND_VM_INC_OPCODE();
29219: ZEND_VM_NEXT_OPCODE();
29220: }
29221:
29222: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29223: {
1.1.1.2 misho 29224: USE_OPLINE
1.1 misho 29225:
1.1.1.2 misho 29226: zval *value;
29227: zval **variable_ptr_ptr;
1.1 misho 29228:
1.1.1.2 misho 29229: SAVE_OPLINE();
29230: value = opline->op2.zv;
29231: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
29232:
29233: if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
29234: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_CONST TSRMLS_CC)) {
29235: if (RETURN_VALUE_USED(opline)) {
29236: zval *retval;
29237:
29238: ALLOC_ZVAL(retval);
29239: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
29240: INIT_PZVAL(retval);
29241: AI_SET_PTR(&EX_T(opline->result.var), retval);
29242: }
29243: } else if (RETURN_VALUE_USED(opline)) {
29244: PZVAL_LOCK(&EG(uninitialized_zval));
29245: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
29246: }
29247: } else if (IS_CV == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
29248: if (0) {
29249: zval_dtor(value);
29250: }
29251: if (RETURN_VALUE_USED(opline)) {
29252: PZVAL_LOCK(&EG(uninitialized_zval));
29253: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
29254: }
29255: } else {
29256: if (IS_CONST == IS_TMP_VAR) {
29257: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29258: } else if (IS_CONST == IS_CONST) {
29259: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29260: } else {
29261: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
29262: }
29263: if (RETURN_VALUE_USED(opline)) {
1.1 misho 29264: PZVAL_LOCK(value);
1.1.1.2 misho 29265: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 29266: }
29267: }
29268:
29269: /* zend_assign_to_variable() always takes care of op2, never free it! */
29270:
1.1.1.2 misho 29271: CHECK_EXCEPTION();
1.1 misho 29272: ZEND_VM_NEXT_OPCODE();
29273: }
29274:
29275: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29276: {
1.1.1.2 misho 29277: USE_OPLINE
1.1 misho 29278: zval *function_name;
29279: char *function_name_strval;
29280: int function_name_strlen;
29281:
29282:
1.1.1.2 misho 29283: SAVE_OPLINE();
1.1 misho 29284: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
29285:
1.1.1.2 misho 29286: function_name = opline->op2.zv;
1.1 misho 29287:
1.1.1.2 misho 29288: if (IS_CONST != IS_CONST &&
29289: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 29290: zend_error_noreturn(E_ERROR, "Method name must be a string");
29291: }
29292:
29293: function_name_strval = Z_STRVAL_P(function_name);
29294: function_name_strlen = Z_STRLEN_P(function_name);
29295:
1.1.1.2 misho 29296: EX(object) = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 29297:
1.1.1.2 misho 29298: if (EXPECTED(EX(object) != NULL) &&
29299: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
29300: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 29301:
1.1.1.2 misho 29302: if (IS_CONST != IS_CONST ||
29303: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
29304: zval *object = EX(object);
29305:
29306: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
29307: zend_error_noreturn(E_ERROR, "Object does not support method calls");
29308: }
29309:
29310: /* First, locate the function. */
29311: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CONST == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
29312: if (UNEXPECTED(EX(fbc) == NULL)) {
29313: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
29314: }
29315: if (IS_CONST == IS_CONST &&
29316: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
29317: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
29318: EXPECTED(EX(object) == object)) {
29319: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
29320: }
1.1 misho 29321: }
29322: } else {
29323: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
29324: }
29325:
29326: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
29327: EX(object) = NULL;
29328: } else {
29329: if (!PZVAL_IS_REF(EX(object))) {
29330: Z_ADDREF_P(EX(object)); /* For $this pointer */
29331: } else {
29332: zval *this_ptr;
29333: ALLOC_ZVAL(this_ptr);
29334: INIT_PZVAL_COPY(this_ptr, EX(object));
29335: zval_copy_ctor(this_ptr);
29336: EX(object) = this_ptr;
29337: }
29338: }
29339:
29340:
1.1.1.2 misho 29341: CHECK_EXCEPTION();
1.1 misho 29342: ZEND_VM_NEXT_OPCODE();
29343: }
29344:
29345: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29346: {
1.1.1.2 misho 29347: USE_OPLINE
1.1 misho 29348:
29349:
1.1.1.2 misho 29350: SAVE_OPLINE();
1.1 misho 29351: if (IS_CV==IS_VAR) {
1.1.1.2 misho 29352: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 29353: }
1.1.1.2 misho 29354: is_equal_function(&EX_T(opline->result.var).tmp_var,
29355: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29356: opline->op2.zv TSRMLS_CC);
1.1 misho 29357:
1.1.1.2 misho 29358: CHECK_EXCEPTION();
1.1 misho 29359: ZEND_VM_NEXT_OPCODE();
29360: }
29361:
29362: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29363: {
1.1.1.2 misho 29364: USE_OPLINE
1.1 misho 29365:
29366: zval *expr_ptr;
29367:
1.1.1.2 misho 29368: SAVE_OPLINE();
29369: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
29370: zval **expr_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 29371:
1.1.1.2 misho 29372: if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
29373: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
29374: }
29375: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 29376: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 29377: Z_ADDREF_P(expr_ptr);
1.1 misho 29378: } else {
1.1.1.2 misho 29379: expr_ptr=_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
29380: if (0) { /* temporary variable */
29381: zval *new_expr;
1.1 misho 29382:
1.1.1.2 misho 29383: ALLOC_ZVAL(new_expr);
29384: INIT_PZVAL_COPY(new_expr, expr_ptr);
29385: expr_ptr = new_expr;
29386: } else if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 29387: zval *new_expr;
29388:
29389: ALLOC_ZVAL(new_expr);
29390: INIT_PZVAL_COPY(new_expr, expr_ptr);
29391: expr_ptr = new_expr;
29392: zendi_zval_copy_ctor(*expr_ptr);
29393: } else {
29394: Z_ADDREF_P(expr_ptr);
29395: }
29396: }
1.1.1.2 misho 29397:
29398: if (IS_CONST != IS_UNUSED) {
29399:
29400: zval *offset = opline->op2.zv;
29401: ulong hval;
29402:
1.1 misho 29403: switch (Z_TYPE_P(offset)) {
29404: case IS_DOUBLE:
1.1.1.2 misho 29405: hval = zend_dval_to_lval(Z_DVAL_P(offset));
29406: goto num_index;
1.1 misho 29407: case IS_LONG:
29408: case IS_BOOL:
1.1.1.2 misho 29409: hval = Z_LVAL_P(offset);
29410: num_index:
29411: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 29412: break;
29413: case IS_STRING:
1.1.1.2 misho 29414: if (IS_CONST == IS_CONST) {
29415: hval = Z_HASH_P(offset);
29416: } else {
29417: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
29418: if (IS_INTERNED(Z_STRVAL_P(offset))) {
29419: hval = INTERNED_HASH(Z_STRVAL_P(offset));
29420: } else {
29421: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
29422: }
29423: }
29424: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 29425: break;
29426: case IS_NULL:
1.1.1.2 misho 29427: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 29428: break;
29429: default:
29430: zend_error(E_WARNING, "Illegal offset type");
29431: zval_ptr_dtor(&expr_ptr);
29432: /* do nothing */
29433: break;
29434: }
29435:
29436: } else {
1.1.1.2 misho 29437: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
29438: }
29439: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
29440:
29441: } else {
29442:
29443: }
29444: CHECK_EXCEPTION();
29445: ZEND_VM_NEXT_OPCODE();
29446: }
29447:
29448: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29449: {
29450: USE_OPLINE
29451:
29452: array_init(&EX_T(opline->result.var).tmp_var);
29453: if (IS_CV == IS_UNUSED) {
29454: ZEND_VM_NEXT_OPCODE();
29455: #if 0 || IS_CV != IS_UNUSED
29456: } else {
29457: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
29458: #endif
29459: }
29460: }
29461:
29462: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29463: {
29464: USE_OPLINE
29465: zval tmp, *varname;
29466: HashTable *target_symbol_table;
29467:
29468:
29469: SAVE_OPLINE();
29470: if (IS_CV == IS_CV &&
29471: IS_CONST == IS_UNUSED &&
29472: (opline->extended_value & ZEND_QUICK_SET)) {
29473: if (EG(active_symbol_table)) {
29474: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
29475:
29476: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
29477: EX_CV(opline->op1.var) = NULL;
29478: } else if (EX_CV(opline->op1.var)) {
29479: zval_ptr_dtor(EX_CV(opline->op1.var));
29480: EX_CV(opline->op1.var) = NULL;
29481: }
29482: CHECK_EXCEPTION();
29483: ZEND_VM_NEXT_OPCODE();
29484: }
29485:
29486: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
29487:
29488: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
29489: ZVAL_COPY_VALUE(&tmp, varname);
29490: zval_copy_ctor(&tmp);
29491: convert_to_string(&tmp);
29492: varname = &tmp;
29493: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
29494: Z_ADDREF_P(varname);
1.1 misho 29495: }
29496:
1.1.1.2 misho 29497: if (IS_CONST != IS_UNUSED) {
29498: zend_class_entry *ce;
29499:
29500: if (IS_CONST == IS_CONST) {
29501: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
29502: ce = CACHED_PTR(opline->op2.literal->cache_slot);
29503: } else {
29504: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 29505: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 29506: if (IS_CV != IS_CONST && varname == &tmp) {
29507: zval_dtor(&tmp);
29508: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
29509: zval_ptr_dtor(&varname);
29510: }
29511:
1.1.1.4 misho 29512: HANDLE_EXCEPTION();
29513: }
29514: if (UNEXPECTED(ce == NULL)) {
29515: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 29516: }
29517: CACHE_PTR(opline->op2.literal->cache_slot, ce);
29518: }
29519: } else {
29520: ce = EX_T(opline->op2.var).class_entry;
29521: }
29522: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
1.1 misho 29523: } else {
1.1.1.2 misho 29524: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
1.1 misho 29525:
1.1.1.2 misho 29526: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
29527: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
1.1 misho 29528: }
29529:
1.1.1.2 misho 29530: if (IS_CV != IS_CONST && varname == &tmp) {
29531: zval_dtor(&tmp);
29532: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
29533: zval_ptr_dtor(&varname);
1.1 misho 29534: }
1.1.1.2 misho 29535:
29536: CHECK_EXCEPTION();
29537: ZEND_VM_NEXT_OPCODE();
1.1 misho 29538: }
29539:
29540: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29541: {
1.1.1.2 misho 29542: USE_OPLINE
1.1 misho 29543:
1.1.1.2 misho 29544: zval **container;
1.1 misho 29545: zval *offset;
1.1.1.2 misho 29546: ulong hval;
1.1 misho 29547:
1.1.1.2 misho 29548: SAVE_OPLINE();
29549: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 29550: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
29551: SEPARATE_ZVAL_IF_NOT_REF(container);
29552: }
1.1.1.2 misho 29553: offset = opline->op2.zv;
1.1 misho 29554:
29555: if (IS_CV != IS_VAR || container) {
29556: switch (Z_TYPE_PP(container)) {
29557: case IS_ARRAY: {
29558: HashTable *ht = Z_ARRVAL_PP(container);
29559:
29560: switch (Z_TYPE_P(offset)) {
29561: case IS_DOUBLE:
1.1.1.2 misho 29562: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 29563: zend_hash_index_del(ht, hval);
29564: break;
1.1 misho 29565: case IS_RESOURCE:
29566: case IS_BOOL:
29567: case IS_LONG:
1.1.1.2 misho 29568: hval = Z_LVAL_P(offset);
29569: zend_hash_index_del(ht, hval);
1.1 misho 29570: break;
29571: case IS_STRING:
29572: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
29573: Z_ADDREF_P(offset);
29574: }
1.1.1.2 misho 29575: if (IS_CONST == IS_CONST) {
29576: hval = Z_HASH_P(offset);
29577: } else {
29578: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
29579: if (IS_INTERNED(Z_STRVAL_P(offset))) {
29580: hval = INTERNED_HASH(Z_STRVAL_P(offset));
29581: } else {
29582: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 29583: }
29584: }
1.1.1.2 misho 29585: if (ht == &EG(symbol_table)) {
29586: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
29587: } else {
29588: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
29589: }
29590: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
29591: zval_ptr_dtor(&offset);
29592: }
29593: break;
29594: num_index_dim:
29595: zend_hash_index_del(ht, hval);
1.1 misho 29596: if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
29597: zval_ptr_dtor(&offset);
29598: }
29599: break;
29600: case IS_NULL:
29601: zend_hash_del(ht, "", sizeof(""));
29602: break;
29603: default:
29604: zend_error(E_WARNING, "Illegal offset type in unset");
29605: break;
29606: }
29607:
29608: break;
29609: }
29610: case IS_OBJECT:
1.1.1.2 misho 29611: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 29612: zend_error_noreturn(E_ERROR, "Cannot use object as array");
29613: }
29614: if (0) {
29615: MAKE_REAL_ZVAL_PTR(offset);
29616: }
29617: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
29618: if (0) {
29619: zval_ptr_dtor(&offset);
29620: } else {
29621:
29622: }
29623: break;
29624: case IS_STRING:
29625: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
29626: ZEND_VM_CONTINUE(); /* bailed out before */
29627: default:
29628:
29629: break;
29630: }
29631: } else {
29632:
29633: }
29634:
1.1.1.2 misho 29635: CHECK_EXCEPTION();
1.1 misho 29636: ZEND_VM_NEXT_OPCODE();
29637: }
29638:
29639: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29640: {
1.1.1.2 misho 29641: USE_OPLINE
29642:
29643: zval **container;
29644: zval *offset;
1.1 misho 29645:
1.1.1.2 misho 29646: SAVE_OPLINE();
29647: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
29648: offset = opline->op2.zv;
1.1 misho 29649:
29650: if (IS_CV != IS_VAR || container) {
29651: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
29652: SEPARATE_ZVAL_IF_NOT_REF(container);
29653: }
29654: if (Z_TYPE_PP(container) == IS_OBJECT) {
29655: if (0) {
29656: MAKE_REAL_ZVAL_PTR(offset);
29657: }
29658: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 29659: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 29660: } else {
29661: zend_error(E_NOTICE, "Trying to unset property of non-object");
29662: }
29663: if (0) {
29664: zval_ptr_dtor(&offset);
29665: } else {
29666:
29667: }
29668: } else {
29669:
29670: }
29671: } else {
29672:
29673: }
29674:
1.1.1.2 misho 29675: CHECK_EXCEPTION();
29676: ZEND_VM_NEXT_OPCODE();
29677: }
29678:
29679: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29680: {
29681: USE_OPLINE
29682: zval **value;
29683: zend_bool isset = 1;
29684:
29685: SAVE_OPLINE();
29686: if (IS_CV == IS_CV &&
29687: IS_CONST == IS_UNUSED &&
29688: (opline->extended_value & ZEND_QUICK_SET)) {
29689: if (EX_CV(opline->op1.var)) {
29690: value = EX_CV(opline->op1.var);
29691: } else if (EG(active_symbol_table)) {
29692: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
29693:
29694: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
29695: isset = 0;
29696: }
29697: } else {
29698: isset = 0;
29699: }
29700: } else {
29701: HashTable *target_symbol_table;
29702:
29703: zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
29704:
29705: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
29706: ZVAL_COPY_VALUE(&tmp, varname);
29707: zval_copy_ctor(&tmp);
29708: convert_to_string(&tmp);
29709: varname = &tmp;
29710: }
29711:
29712: if (IS_CONST != IS_UNUSED) {
29713: zend_class_entry *ce;
29714:
29715: if (IS_CONST == IS_CONST) {
29716: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
29717: ce = CACHED_PTR(opline->op2.literal->cache_slot);
29718: } else {
29719: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
29720: if (UNEXPECTED(ce == NULL)) {
29721: CHECK_EXCEPTION();
29722: ZEND_VM_NEXT_OPCODE();
29723: }
29724: CACHE_PTR(opline->op2.literal->cache_slot, ce);
29725: }
29726: } else {
29727: ce = EX_T(opline->op2.var).class_entry;
29728: }
29729: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
29730: if (!value) {
29731: isset = 0;
29732: }
29733: } else {
29734: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
29735: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
29736: isset = 0;
29737: }
29738: }
29739:
29740: if (IS_CV != IS_CONST && varname == &tmp) {
29741: zval_dtor(&tmp);
29742: }
29743:
29744: }
29745:
29746: if (opline->extended_value & ZEND_ISSET) {
29747: if (isset && Z_TYPE_PP(value) != IS_NULL) {
29748: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
29749: } else {
29750: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
29751: }
29752: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
29753: if (!isset || !i_zend_is_true(*value)) {
29754: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
29755: } else {
29756: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
29757: }
29758: }
29759:
29760: CHECK_EXCEPTION();
1.1 misho 29761: ZEND_VM_NEXT_OPCODE();
29762: }
29763:
29764: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
29765: {
1.1.1.2 misho 29766: USE_OPLINE
1.1 misho 29767:
1.1.1.2 misho 29768: zval **container;
1.1 misho 29769: zval **value = NULL;
29770: int result = 0;
1.1.1.2 misho 29771: ulong hval;
29772: zval *offset;
1.1 misho 29773:
1.1.1.2 misho 29774: SAVE_OPLINE();
29775: container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 29776:
1.1.1.2 misho 29777: offset = opline->op2.zv;
1.1 misho 29778:
1.1.1.2 misho 29779: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
29780: HashTable *ht;
29781: int isset = 0;
1.1 misho 29782:
1.1.1.2 misho 29783: ht = Z_ARRVAL_PP(container);
1.1 misho 29784:
1.1.1.2 misho 29785: switch (Z_TYPE_P(offset)) {
29786: case IS_DOUBLE:
29787: hval = zend_dval_to_lval(Z_DVAL_P(offset));
29788: goto num_index_prop;
29789: case IS_RESOURCE:
29790: case IS_BOOL:
29791: case IS_LONG:
29792: hval = Z_LVAL_P(offset);
29793: num_index_prop:
29794: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
29795: isset = 1;
29796: }
29797: break;
29798: case IS_STRING:
29799: if (IS_CONST == IS_CONST) {
29800: hval = Z_HASH_P(offset);
29801: } else {
29802: if (!prop_dim) {
29803: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 29804: }
1.1.1.2 misho 29805: if (IS_INTERNED(Z_STRVAL_P(offset))) {
29806: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 29807: } else {
1.1.1.2 misho 29808: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 29809: }
29810: }
1.1.1.2 misho 29811: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
29812: isset = 1;
29813: }
29814: break;
29815: case IS_NULL:
29816: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
29817: isset = 1;
1.1 misho 29818: }
1.1.1.2 misho 29819: break;
29820: default:
29821: zend_error(E_WARNING, "Illegal offset type in isset or empty");
29822: break;
29823: }
29824:
29825: if (opline->extended_value & ZEND_ISSET) {
29826: if (isset && Z_TYPE_PP(value) == IS_NULL) {
29827: result = 0;
29828: } else {
29829: result = isset;
1.1 misho 29830: }
1.1.1.2 misho 29831: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
29832: if (!isset || !i_zend_is_true(*value)) {
29833: result = 0;
1.1 misho 29834: } else {
1.1.1.2 misho 29835: result = 1;
29836: }
29837: }
1.1 misho 29838:
1.1.1.2 misho 29839: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
29840: if (0) {
29841: MAKE_REAL_ZVAL_PTR(offset);
29842: }
29843: if (prop_dim) {
29844: if (Z_OBJ_HT_P(*container)->has_property) {
29845: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
29846: } else {
29847: zend_error(E_NOTICE, "Trying to check property of non-object");
29848: result = 0;
29849: }
29850: } else {
29851: if (Z_OBJ_HT_P(*container)->has_dimension) {
29852: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
29853: } else {
29854: zend_error(E_NOTICE, "Trying to check element of non-array");
29855: result = 0;
1.1 misho 29856: }
1.1.1.2 misho 29857: }
29858: if (0) {
29859: zval_ptr_dtor(&offset);
29860: } else {
1.1 misho 29861:
1.1.1.2 misho 29862: }
29863: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
29864: zval tmp;
29865:
29866: if (Z_TYPE_P(offset) != IS_LONG) {
29867: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
29868: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
29869: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
29870: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 29871: zval_copy_ctor(&tmp);
29872: convert_to_long(&tmp);
29873: offset = &tmp;
1.1.1.2 misho 29874: } else {
29875: /* can not be converted to proper offset, return "not set" */
29876: result = 0;
1.1 misho 29877: }
1.1.1.2 misho 29878: }
29879: if (Z_TYPE_P(offset) == IS_LONG) {
29880: if (opline->extended_value & ZEND_ISSET) {
29881: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
29882: result = 1;
29883: }
29884: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
29885: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
29886: result = 1;
1.1 misho 29887: }
29888: }
1.1.1.2 misho 29889: }
1.1 misho 29890:
1.1.1.2 misho 29891: } else {
1.1 misho 29892:
29893: }
29894:
1.1.1.2 misho 29895: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
29896: if (opline->extended_value & ZEND_ISSET) {
29897: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
29898: } else {
29899: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 29900: }
29901:
1.1.1.2 misho 29902: CHECK_EXCEPTION();
1.1 misho 29903: ZEND_VM_NEXT_OPCODE();
29904: }
29905:
29906: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29907: {
29908: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
29909: }
29910:
29911: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29912: {
29913: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CONST(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
29914: }
29915:
29916: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29917: {
1.1.1.2 misho 29918: USE_OPLINE
1.1 misho 29919: zend_free_op free_op2;
29920:
1.1.1.2 misho 29921: SAVE_OPLINE();
29922: fast_add_function(&EX_T(opline->result.var).tmp_var,
29923: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29924: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 29925:
29926: zval_dtor(free_op2.var);
1.1.1.2 misho 29927: CHECK_EXCEPTION();
1.1 misho 29928: ZEND_VM_NEXT_OPCODE();
29929: }
29930:
29931: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29932: {
1.1.1.2 misho 29933: USE_OPLINE
1.1 misho 29934: zend_free_op free_op2;
29935:
1.1.1.2 misho 29936: SAVE_OPLINE();
29937: fast_sub_function(&EX_T(opline->result.var).tmp_var,
29938: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29939: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 29940:
29941: zval_dtor(free_op2.var);
1.1.1.2 misho 29942: CHECK_EXCEPTION();
1.1 misho 29943: ZEND_VM_NEXT_OPCODE();
29944: }
29945:
29946: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29947: {
1.1.1.2 misho 29948: USE_OPLINE
1.1 misho 29949: zend_free_op free_op2;
29950:
1.1.1.2 misho 29951: SAVE_OPLINE();
29952: fast_mul_function(&EX_T(opline->result.var).tmp_var,
29953: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29954: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 29955:
29956: zval_dtor(free_op2.var);
1.1.1.2 misho 29957: CHECK_EXCEPTION();
1.1 misho 29958: ZEND_VM_NEXT_OPCODE();
29959: }
29960:
29961: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29962: {
1.1.1.2 misho 29963: USE_OPLINE
1.1 misho 29964: zend_free_op free_op2;
29965:
1.1.1.2 misho 29966: SAVE_OPLINE();
29967: fast_div_function(&EX_T(opline->result.var).tmp_var,
29968: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29969: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 29970:
29971: zval_dtor(free_op2.var);
1.1.1.2 misho 29972: CHECK_EXCEPTION();
1.1 misho 29973: ZEND_VM_NEXT_OPCODE();
29974: }
29975:
29976: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29977: {
1.1.1.2 misho 29978: USE_OPLINE
1.1 misho 29979: zend_free_op free_op2;
29980:
1.1.1.2 misho 29981: SAVE_OPLINE();
29982: fast_mod_function(&EX_T(opline->result.var).tmp_var,
29983: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29984: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 29985:
29986: zval_dtor(free_op2.var);
1.1.1.2 misho 29987: CHECK_EXCEPTION();
1.1 misho 29988: ZEND_VM_NEXT_OPCODE();
29989: }
29990:
29991: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
29992: {
1.1.1.2 misho 29993: USE_OPLINE
1.1 misho 29994: zend_free_op free_op2;
29995:
1.1.1.2 misho 29996: SAVE_OPLINE();
29997: shift_left_function(&EX_T(opline->result.var).tmp_var,
29998: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
29999: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30000:
30001: zval_dtor(free_op2.var);
1.1.1.2 misho 30002: CHECK_EXCEPTION();
1.1 misho 30003: ZEND_VM_NEXT_OPCODE();
30004: }
30005:
30006: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30007: {
1.1.1.2 misho 30008: USE_OPLINE
1.1 misho 30009: zend_free_op free_op2;
30010:
1.1.1.2 misho 30011: SAVE_OPLINE();
30012: shift_right_function(&EX_T(opline->result.var).tmp_var,
30013: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30014: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30015:
30016: zval_dtor(free_op2.var);
1.1.1.2 misho 30017: CHECK_EXCEPTION();
1.1 misho 30018: ZEND_VM_NEXT_OPCODE();
30019: }
30020:
30021: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30022: {
1.1.1.2 misho 30023: USE_OPLINE
1.1 misho 30024: zend_free_op free_op2;
30025:
1.1.1.2 misho 30026: SAVE_OPLINE();
30027: concat_function(&EX_T(opline->result.var).tmp_var,
30028: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30029: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30030:
30031: zval_dtor(free_op2.var);
1.1.1.2 misho 30032: CHECK_EXCEPTION();
1.1 misho 30033: ZEND_VM_NEXT_OPCODE();
30034: }
30035:
30036: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30037: {
1.1.1.2 misho 30038: USE_OPLINE
1.1 misho 30039: zend_free_op free_op2;
30040:
1.1.1.2 misho 30041: SAVE_OPLINE();
30042: is_identical_function(&EX_T(opline->result.var).tmp_var,
30043: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30044: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30045:
30046: zval_dtor(free_op2.var);
1.1.1.2 misho 30047: CHECK_EXCEPTION();
1.1 misho 30048: ZEND_VM_NEXT_OPCODE();
30049: }
30050:
30051: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30052: {
1.1.1.2 misho 30053: USE_OPLINE
1.1 misho 30054: zend_free_op free_op2;
1.1.1.2 misho 30055: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 30056:
1.1.1.2 misho 30057: SAVE_OPLINE();
1.1 misho 30058: is_identical_function(result,
1.1.1.2 misho 30059: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30060: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30061: Z_LVAL_P(result) = !Z_LVAL_P(result);
30062:
30063: zval_dtor(free_op2.var);
1.1.1.2 misho 30064: CHECK_EXCEPTION();
1.1 misho 30065: ZEND_VM_NEXT_OPCODE();
30066: }
30067:
30068: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30069: {
1.1.1.2 misho 30070: USE_OPLINE
1.1 misho 30071: zend_free_op free_op2;
1.1.1.2 misho 30072: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 30073:
1.1.1.2 misho 30074: SAVE_OPLINE();
30075: ZVAL_BOOL(result, fast_equal_function(result,
30076: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30077: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 30078:
30079: zval_dtor(free_op2.var);
1.1.1.2 misho 30080: CHECK_EXCEPTION();
1.1 misho 30081: ZEND_VM_NEXT_OPCODE();
30082: }
30083:
30084: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30085: {
1.1.1.2 misho 30086: USE_OPLINE
1.1 misho 30087: zend_free_op free_op2;
1.1.1.2 misho 30088: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 30089:
1.1.1.2 misho 30090: SAVE_OPLINE();
30091: ZVAL_BOOL(result, fast_not_equal_function(result,
30092: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30093: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 30094:
30095: zval_dtor(free_op2.var);
1.1.1.2 misho 30096: CHECK_EXCEPTION();
1.1 misho 30097: ZEND_VM_NEXT_OPCODE();
30098: }
30099:
30100: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30101: {
1.1.1.2 misho 30102: USE_OPLINE
1.1 misho 30103: zend_free_op free_op2;
1.1.1.2 misho 30104: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 30105:
1.1.1.2 misho 30106: SAVE_OPLINE();
30107: ZVAL_BOOL(result, fast_is_smaller_function(result,
30108: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30109: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 30110:
30111: zval_dtor(free_op2.var);
1.1.1.2 misho 30112: CHECK_EXCEPTION();
1.1 misho 30113: ZEND_VM_NEXT_OPCODE();
30114: }
30115:
30116: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30117: {
1.1.1.2 misho 30118: USE_OPLINE
1.1 misho 30119: zend_free_op free_op2;
1.1.1.2 misho 30120: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 30121:
1.1.1.2 misho 30122: SAVE_OPLINE();
30123: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
30124: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30125: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 30126:
30127: zval_dtor(free_op2.var);
1.1.1.2 misho 30128: CHECK_EXCEPTION();
1.1 misho 30129: ZEND_VM_NEXT_OPCODE();
30130: }
30131:
30132: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30133: {
1.1.1.2 misho 30134: USE_OPLINE
1.1 misho 30135: zend_free_op free_op2;
30136:
1.1.1.2 misho 30137: SAVE_OPLINE();
30138: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
30139: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30140: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30141:
30142: zval_dtor(free_op2.var);
1.1.1.2 misho 30143: CHECK_EXCEPTION();
1.1 misho 30144: ZEND_VM_NEXT_OPCODE();
30145: }
30146:
30147: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30148: {
1.1.1.2 misho 30149: USE_OPLINE
1.1 misho 30150: zend_free_op free_op2;
30151:
1.1.1.2 misho 30152: SAVE_OPLINE();
30153: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
30154: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30155: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30156:
30157: zval_dtor(free_op2.var);
1.1.1.2 misho 30158: CHECK_EXCEPTION();
1.1 misho 30159: ZEND_VM_NEXT_OPCODE();
30160: }
30161:
30162: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30163: {
1.1.1.2 misho 30164: USE_OPLINE
1.1 misho 30165: zend_free_op free_op2;
30166:
1.1.1.2 misho 30167: SAVE_OPLINE();
30168: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
30169: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30170: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30171:
30172: zval_dtor(free_op2.var);
1.1.1.2 misho 30173: CHECK_EXCEPTION();
1.1 misho 30174: ZEND_VM_NEXT_OPCODE();
30175: }
30176:
30177: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30178: {
1.1.1.2 misho 30179: USE_OPLINE
1.1 misho 30180: zend_free_op free_op2;
30181:
1.1.1.2 misho 30182: SAVE_OPLINE();
30183: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
30184: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
30185: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 30186:
30187: zval_dtor(free_op2.var);
1.1.1.2 misho 30188: CHECK_EXCEPTION();
1.1 misho 30189: ZEND_VM_NEXT_OPCODE();
30190: }
30191:
30192: 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)
30193: {
1.1.1.2 misho 30194: USE_OPLINE
1.1 misho 30195: zend_free_op free_op2, free_op_data1;
1.1.1.2 misho 30196: zval **object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30197: zval *object;
1.1.1.2 misho 30198: zval *property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30199: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 30200: int have_get_ptr = 0;
30201:
1.1.1.2 misho 30202: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 30203: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
30204: }
30205:
30206: make_real_object(object_ptr TSRMLS_CC);
30207: object = *object_ptr;
30208:
1.1.1.2 misho 30209: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 30210: zend_error(E_WARNING, "Attempt to assign property of non-object");
30211: zval_dtor(free_op2.var);
30212: FREE_OP(free_op_data1);
30213:
1.1.1.2 misho 30214: if (RETURN_VALUE_USED(opline)) {
30215: PZVAL_LOCK(&EG(uninitialized_zval));
30216: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
30217: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 30218: }
30219: } else {
30220: /* here we are sure we are dealing with an object */
30221: if (1) {
30222: MAKE_REAL_ZVAL_PTR(property);
30223: }
30224:
30225: /* here property is a string */
30226: if (opline->extended_value == ZEND_ASSIGN_OBJ
30227: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 30228: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30229: if (zptr != NULL) { /* NULL means no success in getting PTR */
30230: SEPARATE_ZVAL_IF_NOT_REF(zptr);
30231:
30232: have_get_ptr = 1;
30233: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 30234: if (RETURN_VALUE_USED(opline)) {
1.1 misho 30235: PZVAL_LOCK(*zptr);
1.1.1.2 misho 30236: EX_T(opline->result.var).var.ptr = *zptr;
30237: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 30238: }
30239: }
30240: }
30241:
30242: if (!have_get_ptr) {
30243: zval *z = NULL;
30244:
30245: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
30246: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 30247: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30248: }
30249: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
30250: if (Z_OBJ_HT_P(object)->read_dimension) {
30251: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
30252: }
30253: }
30254: if (z) {
30255: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
30256: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
30257:
30258: if (Z_REFCOUNT_P(z) == 0) {
30259: GC_REMOVE_ZVAL_FROM_BUFFER(z);
30260: zval_dtor(z);
30261: FREE_ZVAL(z);
30262: }
30263: z = value;
30264: }
30265: Z_ADDREF_P(z);
30266: SEPARATE_ZVAL_IF_NOT_REF(&z);
30267: binary_op(z, z, value TSRMLS_CC);
30268: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 30269: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30270: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
30271: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
30272: }
1.1.1.2 misho 30273: if (RETURN_VALUE_USED(opline)) {
1.1 misho 30274: PZVAL_LOCK(z);
1.1.1.2 misho 30275: EX_T(opline->result.var).var.ptr = z;
30276: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 30277: }
30278: zval_ptr_dtor(&z);
30279: } else {
30280: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 30281: if (RETURN_VALUE_USED(opline)) {
30282: PZVAL_LOCK(&EG(uninitialized_zval));
30283: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
30284: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 30285: }
30286: }
30287: }
30288:
30289: if (1) {
30290: zval_ptr_dtor(&property);
30291: } else {
30292: zval_dtor(free_op2.var);
30293: }
30294: FREE_OP(free_op_data1);
30295: }
30296:
30297: /* assign_obj has two opcodes! */
1.1.1.2 misho 30298: CHECK_EXCEPTION();
1.1 misho 30299: ZEND_VM_INC_OPCODE();
30300: ZEND_VM_NEXT_OPCODE();
30301: }
30302:
30303: 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)
30304: {
1.1.1.2 misho 30305: USE_OPLINE
1.1 misho 30306: zend_free_op free_op2, free_op_data2, free_op_data1;
30307: zval **var_ptr;
30308: zval *value;
30309:
1.1.1.2 misho 30310: SAVE_OPLINE();
1.1 misho 30311: switch (opline->extended_value) {
30312: case ZEND_ASSIGN_OBJ:
30313: return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30314: break;
30315: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 30316: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30317:
1.1.1.2 misho 30318: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30319: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 30320: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 30321: if (IS_CV == IS_VAR && !0) {
30322: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
30323: }
30324: return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30325: } else {
1.1.1.2 misho 30326: zval *dim = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 30327:
1.1.1.2 misho 30328: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
30329: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
30330: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 30331: }
30332: }
30333: break;
30334: default:
1.1.1.2 misho 30335: value = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30336: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30337: /* do nothing */
30338: break;
30339: }
30340:
1.1.1.2 misho 30341: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 30342: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
30343: }
30344:
1.1.1.2 misho 30345: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
30346: if (RETURN_VALUE_USED(opline)) {
30347: PZVAL_LOCK(&EG(uninitialized_zval));
30348: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 30349: }
30350: zval_dtor(free_op2.var);
30351:
1.1.1.2 misho 30352: CHECK_EXCEPTION();
30353: if (opline->extended_value == ZEND_ASSIGN_DIM) {
30354: ZEND_VM_INC_OPCODE();
30355: }
1.1 misho 30356: ZEND_VM_NEXT_OPCODE();
30357: }
30358:
30359: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
30360:
1.1.1.2 misho 30361: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
30362: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 30363: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
30364: /* proxy object */
30365: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
30366: Z_ADDREF_P(objval);
30367: binary_op(objval, objval, value TSRMLS_CC);
30368: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
30369: zval_ptr_dtor(&objval);
30370: } else {
30371: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
30372: }
30373:
1.1.1.2 misho 30374: if (RETURN_VALUE_USED(opline)) {
1.1 misho 30375: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 30376: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 30377: }
30378: zval_dtor(free_op2.var);
30379:
30380: if (opline->extended_value == ZEND_ASSIGN_DIM) {
30381: FREE_OP(free_op_data1);
30382: FREE_OP_VAR_PTR(free_op_data2);
30383:
1.1.1.2 misho 30384: CHECK_EXCEPTION();
30385: ZEND_VM_INC_OPCODE();
30386: } else {
30387:
30388: CHECK_EXCEPTION();
30389: }
1.1 misho 30390: ZEND_VM_NEXT_OPCODE();
30391: }
30392:
30393: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30394: {
30395: return zend_binary_assign_op_helper_SPEC_CV_TMP(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30396: }
30397:
30398: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30399: {
30400: return zend_binary_assign_op_helper_SPEC_CV_TMP(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30401: }
30402:
30403: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30404: {
30405: return zend_binary_assign_op_helper_SPEC_CV_TMP(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30406: }
30407:
30408: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30409: {
30410: return zend_binary_assign_op_helper_SPEC_CV_TMP(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30411: }
30412:
30413: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30414: {
30415: return zend_binary_assign_op_helper_SPEC_CV_TMP(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30416: }
30417:
30418: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30419: {
30420: return zend_binary_assign_op_helper_SPEC_CV_TMP(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30421: }
30422:
30423: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30424: {
30425: return zend_binary_assign_op_helper_SPEC_CV_TMP(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30426: }
30427:
30428: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30429: {
30430: return zend_binary_assign_op_helper_SPEC_CV_TMP(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30431: }
30432:
30433: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30434: {
30435: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30436: }
30437:
30438: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30439: {
30440: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30441: }
30442:
30443: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30444: {
30445: return zend_binary_assign_op_helper_SPEC_CV_TMP(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30446: }
30447:
30448: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
30449: {
1.1.1.2 misho 30450: USE_OPLINE
1.1 misho 30451: zend_free_op free_op2;
1.1.1.2 misho 30452: zval **object_ptr;
1.1 misho 30453: zval *object;
1.1.1.2 misho 30454: zval *property;
30455: zval **retval;
1.1 misho 30456: int have_get_ptr = 0;
30457:
1.1.1.2 misho 30458: SAVE_OPLINE();
30459: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
30460: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30461: retval = &EX_T(opline->result.var).var.ptr;
30462:
30463: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 30464: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
30465: }
30466:
30467: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
30468: object = *object_ptr;
30469:
1.1.1.2 misho 30470: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 30471: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
30472: zval_dtor(free_op2.var);
1.1.1.2 misho 30473: if (RETURN_VALUE_USED(opline)) {
30474: PZVAL_LOCK(&EG(uninitialized_zval));
30475: *retval = &EG(uninitialized_zval);
1.1 misho 30476: }
30477:
1.1.1.2 misho 30478: CHECK_EXCEPTION();
1.1 misho 30479: ZEND_VM_NEXT_OPCODE();
30480: }
30481:
30482: /* here we are sure we are dealing with an object */
30483:
30484: if (1) {
30485: MAKE_REAL_ZVAL_PTR(property);
30486: }
30487:
30488: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 30489: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30490: if (zptr != NULL) { /* NULL means no success in getting PTR */
30491: SEPARATE_ZVAL_IF_NOT_REF(zptr);
30492:
30493: have_get_ptr = 1;
30494: incdec_op(*zptr);
1.1.1.2 misho 30495: if (RETURN_VALUE_USED(opline)) {
1.1 misho 30496: *retval = *zptr;
30497: PZVAL_LOCK(*retval);
30498: }
30499: }
30500: }
30501:
30502: if (!have_get_ptr) {
30503: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 30504: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30505:
1.1.1.2 misho 30506: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 30507: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
30508:
30509: if (Z_REFCOUNT_P(z) == 0) {
30510: GC_REMOVE_ZVAL_FROM_BUFFER(z);
30511: zval_dtor(z);
30512: FREE_ZVAL(z);
30513: }
30514: z = value;
30515: }
30516: Z_ADDREF_P(z);
30517: SEPARATE_ZVAL_IF_NOT_REF(&z);
30518: incdec_op(z);
30519: *retval = z;
1.1.1.2 misho 30520: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
30521: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 30522: zval_ptr_dtor(&z);
30523: } else {
30524: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 30525: if (RETURN_VALUE_USED(opline)) {
30526: PZVAL_LOCK(&EG(uninitialized_zval));
30527: *retval = &EG(uninitialized_zval);
1.1 misho 30528: }
30529: }
30530: }
30531:
30532: if (1) {
30533: zval_ptr_dtor(&property);
30534: } else {
30535: zval_dtor(free_op2.var);
30536: }
30537:
1.1.1.2 misho 30538: CHECK_EXCEPTION();
1.1 misho 30539: ZEND_VM_NEXT_OPCODE();
30540: }
30541:
30542: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30543: {
30544: return zend_pre_incdec_property_helper_SPEC_CV_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30545: }
30546:
30547: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30548: {
30549: return zend_pre_incdec_property_helper_SPEC_CV_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30550: }
30551:
30552: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
30553: {
1.1.1.2 misho 30554: USE_OPLINE
1.1 misho 30555: zend_free_op free_op2;
1.1.1.2 misho 30556: zval **object_ptr;
1.1 misho 30557: zval *object;
1.1.1.2 misho 30558: zval *property;
30559: zval *retval;
1.1 misho 30560: int have_get_ptr = 0;
30561:
1.1.1.2 misho 30562: SAVE_OPLINE();
30563: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
30564: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30565: retval = &EX_T(opline->result.var).tmp_var;
30566:
30567: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 30568: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
30569: }
30570:
30571: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
30572: object = *object_ptr;
30573:
1.1.1.2 misho 30574: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 30575: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
30576: zval_dtor(free_op2.var);
1.1.1.2 misho 30577: ZVAL_NULL(retval);
1.1 misho 30578:
1.1.1.2 misho 30579: CHECK_EXCEPTION();
1.1 misho 30580: ZEND_VM_NEXT_OPCODE();
30581: }
30582:
30583: /* here we are sure we are dealing with an object */
30584:
30585: if (1) {
30586: MAKE_REAL_ZVAL_PTR(property);
30587: }
30588:
30589: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 30590: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30591: if (zptr != NULL) { /* NULL means no success in getting PTR */
30592: have_get_ptr = 1;
30593: SEPARATE_ZVAL_IF_NOT_REF(zptr);
30594:
1.1.1.2 misho 30595: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 30596: zendi_zval_copy_ctor(*retval);
30597:
30598: incdec_op(*zptr);
30599:
30600: }
30601: }
30602:
30603: if (!have_get_ptr) {
30604: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 30605: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30606: zval *z_copy;
30607:
1.1.1.2 misho 30608: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 30609: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
30610:
30611: if (Z_REFCOUNT_P(z) == 0) {
30612: GC_REMOVE_ZVAL_FROM_BUFFER(z);
30613: zval_dtor(z);
30614: FREE_ZVAL(z);
30615: }
30616: z = value;
30617: }
1.1.1.2 misho 30618: ZVAL_COPY_VALUE(retval, z);
1.1 misho 30619: zendi_zval_copy_ctor(*retval);
30620: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 30621: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 30622: zendi_zval_copy_ctor(*z_copy);
30623: incdec_op(z_copy);
30624: Z_ADDREF_P(z);
1.1.1.2 misho 30625: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30626: zval_ptr_dtor(&z_copy);
30627: zval_ptr_dtor(&z);
30628: } else {
30629: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 30630: ZVAL_NULL(retval);
1.1 misho 30631: }
30632: }
30633:
30634: if (1) {
30635: zval_ptr_dtor(&property);
30636: } else {
30637: zval_dtor(free_op2.var);
30638: }
30639:
1.1.1.2 misho 30640: CHECK_EXCEPTION();
1.1 misho 30641: ZEND_VM_NEXT_OPCODE();
30642: }
30643:
30644: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30645: {
30646: return zend_post_incdec_property_helper_SPEC_CV_TMP(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30647: }
30648:
30649: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30650: {
30651: return zend_post_incdec_property_helper_SPEC_CV_TMP(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
30652: }
30653:
30654: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30655: {
1.1.1.2 misho 30656: USE_OPLINE
1.1 misho 30657: zend_free_op free_op2;
1.1.1.5 ! misho 30658: zval *container;
1.1 misho 30659:
1.1.1.2 misho 30660: SAVE_OPLINE();
30661:
1.1.1.5 ! misho 30662: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 30663: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 30664: }
1.1.1.5 ! misho 30665: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 30666: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
1.1 misho 30667: zval_dtor(free_op2.var);
30668:
1.1.1.2 misho 30669: CHECK_EXCEPTION();
1.1 misho 30670: ZEND_VM_NEXT_OPCODE();
30671: }
30672:
30673: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30674: {
1.1.1.2 misho 30675: USE_OPLINE
1.1 misho 30676: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30677: zval **container;
30678:
30679: SAVE_OPLINE();
30680: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30681:
1.1.1.2 misho 30682: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30683: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
30684: }
1.1.1.2 misho 30685: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 30686: zval_dtor(free_op2.var);
1.1.1.2 misho 30687: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30688: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30689: }
30690:
30691: /* We are going to assign the result by reference */
1.1.1.2 misho 30692: if (UNEXPECTED(opline->extended_value != 0)) {
30693: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
30694:
30695: if (retval_ptr) {
30696: Z_DELREF_PP(retval_ptr);
30697: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
30698: Z_ADDREF_PP(retval_ptr);
30699: }
1.1 misho 30700: }
30701:
1.1.1.2 misho 30702: CHECK_EXCEPTION();
1.1 misho 30703: ZEND_VM_NEXT_OPCODE();
30704: }
30705:
30706: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30707: {
1.1.1.2 misho 30708: USE_OPLINE
1.1 misho 30709: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30710: zval **container;
1.1 misho 30711:
1.1.1.2 misho 30712: SAVE_OPLINE();
30713: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
30714:
30715: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30716: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
30717: }
1.1.1.2 misho 30718: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
1.1 misho 30719: zval_dtor(free_op2.var);
1.1.1.2 misho 30720: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30721: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30722: }
30723:
1.1.1.2 misho 30724: CHECK_EXCEPTION();
1.1 misho 30725: ZEND_VM_NEXT_OPCODE();
30726: }
30727:
30728: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30729: {
1.1.1.2 misho 30730: USE_OPLINE
1.1 misho 30731: zend_free_op free_op2;
1.1.1.5 ! misho 30732: zval *container;
1.1 misho 30733:
1.1.1.2 misho 30734: SAVE_OPLINE();
1.1.1.5 ! misho 30735: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 30736: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_IS TSRMLS_CC);
1.1 misho 30737: zval_dtor(free_op2.var);
30738:
1.1.1.2 misho 30739: CHECK_EXCEPTION();
1.1 misho 30740: ZEND_VM_NEXT_OPCODE();
30741: }
30742:
30743: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30744: {
1.1.1.2 misho 30745: USE_OPLINE
1.1 misho 30746: zend_free_op free_op1, free_op2;
30747:
1.1.1.2 misho 30748: SAVE_OPLINE();
30749:
30750: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 30751: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
! 30752:
1.1.1.2 misho 30753: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30754: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
30755: }
1.1.1.2 misho 30756: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
30757: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30758: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30759: }
1.1.1.5 ! misho 30760: zval_dtor(free_op2.var);
! 30761:
1.1 misho 30762: } else {
1.1.1.5 ! misho 30763: zval *container;
! 30764:
1.1 misho 30765: if (IS_TMP_VAR == IS_UNUSED) {
30766: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
30767: }
1.1.1.5 ! misho 30768: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 30769: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_R TSRMLS_CC);
1.1.1.5 ! misho 30770: zval_dtor(free_op2.var);
1.1 misho 30771:
1.1.1.5 ! misho 30772: }
1.1.1.2 misho 30773: CHECK_EXCEPTION();
1.1 misho 30774: ZEND_VM_NEXT_OPCODE();
30775: }
30776:
30777: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30778: {
1.1.1.2 misho 30779: USE_OPLINE
1.1 misho 30780: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30781: zval **container;
30782:
30783: SAVE_OPLINE();
30784: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30785:
30786: if (IS_CV == IS_CV) {
30787: if (container != &EG(uninitialized_zval_ptr)) {
30788: SEPARATE_ZVAL_IF_NOT_REF(container);
30789: }
30790: }
1.1.1.2 misho 30791: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30792: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
30793: }
1.1.1.2 misho 30794: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 30795: zval_dtor(free_op2.var);
1.1.1.2 misho 30796: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30797: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30798: }
30799:
1.1.1.2 misho 30800: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 30801: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
30802: } else {
30803: zend_free_op free_res;
1.1.1.2 misho 30804: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 30805:
1.1.1.2 misho 30806: PZVAL_UNLOCK(*retval_ptr, &free_res);
30807: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
30808: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 30809: }
1.1.1.2 misho 30810: PZVAL_LOCK(*retval_ptr);
1.1 misho 30811: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 30812: CHECK_EXCEPTION();
30813: ZEND_VM_NEXT_OPCODE();
1.1 misho 30814: }
30815: }
30816:
1.1.1.2 misho 30817: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_TMP(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 30818: {
1.1.1.2 misho 30819: USE_OPLINE
1.1 misho 30820:
1.1.1.2 misho 30821: zval *container;
1.1 misho 30822: zend_free_op free_op2;
1.1.1.2 misho 30823: zval *offset;
1.1 misho 30824:
1.1.1.2 misho 30825: SAVE_OPLINE();
30826: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
30827: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30828:
30829: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
30830: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
30831: zend_error(E_NOTICE, "Trying to get property of non-object");
30832: PZVAL_LOCK(&EG(uninitialized_zval));
30833: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 30834: zval_dtor(free_op2.var);
30835: } else {
30836: zval *retval;
30837:
30838: if (1) {
30839: MAKE_REAL_ZVAL_PTR(offset);
30840: }
30841:
30842: /* here we are sure we are dealing with an object */
1.1.1.2 misho 30843: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 30844:
1.1.1.2 misho 30845: PZVAL_LOCK(retval);
30846: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 30847:
30848: if (1) {
30849: zval_ptr_dtor(&offset);
30850: } else {
30851: zval_dtor(free_op2.var);
30852: }
30853: }
30854:
1.1.1.2 misho 30855: CHECK_EXCEPTION();
1.1 misho 30856: ZEND_VM_NEXT_OPCODE();
30857: }
30858:
30859: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30860: {
1.1.1.2 misho 30861: return zend_fetch_property_address_read_helper_SPEC_CV_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 30862: }
30863:
30864: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30865: {
1.1.1.2 misho 30866: USE_OPLINE
1.1 misho 30867: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30868: zval *property;
1.1 misho 30869: zval **container;
30870:
1.1.1.2 misho 30871: SAVE_OPLINE();
30872: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30873:
1.1 misho 30874: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 30875: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
30876: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 30877: }
30878:
30879: if (1) {
30880: MAKE_REAL_ZVAL_PTR(property);
30881: }
1.1.1.2 misho 30882: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
30883: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30884: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
30885: }
1.1.1.2 misho 30886:
30887: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 30888: if (1) {
30889: zval_ptr_dtor(&property);
30890: } else {
30891: zval_dtor(free_op2.var);
30892: }
1.1.1.2 misho 30893: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30894: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30895: }
30896:
30897: /* We are going to assign the result by reference */
30898: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 30899: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
30900:
30901: Z_DELREF_PP(retval_ptr);
30902: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
30903: Z_ADDREF_PP(retval_ptr);
30904: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
30905: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 30906: }
30907:
1.1.1.2 misho 30908: CHECK_EXCEPTION();
1.1 misho 30909: ZEND_VM_NEXT_OPCODE();
30910: }
30911:
30912: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30913: {
1.1.1.2 misho 30914: USE_OPLINE
1.1 misho 30915: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30916: zval *property;
30917: zval **container;
30918:
30919: SAVE_OPLINE();
30920: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30921: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30922:
30923: if (1) {
30924: MAKE_REAL_ZVAL_PTR(property);
30925: }
1.1.1.2 misho 30926: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 30927: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
30928: }
1.1.1.2 misho 30929: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 30930: if (1) {
30931: zval_ptr_dtor(&property);
30932: } else {
30933: zval_dtor(free_op2.var);
30934: }
1.1.1.2 misho 30935: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
30936: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 30937: }
30938:
1.1.1.2 misho 30939: CHECK_EXCEPTION();
1.1 misho 30940: ZEND_VM_NEXT_OPCODE();
30941: }
30942:
30943: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30944: {
1.1.1.2 misho 30945: USE_OPLINE
30946:
30947: zval *container;
30948: zend_free_op free_op2;
30949: zval *offset;
30950:
30951: SAVE_OPLINE();
30952: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
30953: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30954:
30955: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
30956: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
30957: PZVAL_LOCK(&EG(uninitialized_zval));
30958: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
30959: zval_dtor(free_op2.var);
30960: } else {
30961: zval *retval;
30962:
30963: if (1) {
30964: MAKE_REAL_ZVAL_PTR(offset);
30965: }
30966:
30967: /* here we are sure we are dealing with an object */
30968: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
30969:
30970: PZVAL_LOCK(retval);
30971: AI_SET_PTR(&EX_T(opline->result.var), retval);
30972:
30973: if (1) {
30974: zval_ptr_dtor(&offset);
30975: } else {
30976: zval_dtor(free_op2.var);
30977: }
30978: }
30979:
30980: CHECK_EXCEPTION();
30981: ZEND_VM_NEXT_OPCODE();
1.1 misho 30982: }
30983:
30984: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
30985: {
1.1.1.2 misho 30986: USE_OPLINE
1.1 misho 30987:
1.1.1.2 misho 30988: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 30989: /* Behave like FETCH_OBJ_W */
30990: zend_free_op free_op1, free_op2;
1.1.1.2 misho 30991: zval *property;
30992: zval **container;
30993:
30994: SAVE_OPLINE();
30995: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
30996: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 30997:
30998: if (1) {
30999: MAKE_REAL_ZVAL_PTR(property);
31000: }
1.1.1.2 misho 31001: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 31002: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
31003: }
1.1.1.2 misho 31004: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 31005: if (1) {
31006: zval_ptr_dtor(&property);
31007: } else {
31008: zval_dtor(free_op2.var);
31009: }
1.1.1.2 misho 31010: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
31011: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 31012: }
31013:
1.1.1.2 misho 31014: CHECK_EXCEPTION();
1.1 misho 31015: ZEND_VM_NEXT_OPCODE();
31016: } else {
1.1.1.2 misho 31017: return zend_fetch_property_address_read_helper_SPEC_CV_TMP(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 31018: }
31019: }
31020:
31021: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31022: {
1.1.1.2 misho 31023: USE_OPLINE
1.1 misho 31024: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 31025: zval **container;
31026: zval *property;
31027:
31028: SAVE_OPLINE();
31029: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
31030: property = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31031:
31032: if (IS_CV == IS_CV) {
31033: if (container != &EG(uninitialized_zval_ptr)) {
31034: SEPARATE_ZVAL_IF_NOT_REF(container);
31035: }
31036: }
31037: if (1) {
31038: MAKE_REAL_ZVAL_PTR(property);
31039: }
1.1.1.2 misho 31040: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 31041: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
31042: }
1.1.1.2 misho 31043: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 31044: if (1) {
31045: zval_ptr_dtor(&property);
31046: } else {
31047: zval_dtor(free_op2.var);
31048: }
1.1.1.2 misho 31049: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
31050: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 31051: }
31052:
1.1.1.2 misho 31053: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
31054: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
31055: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 31056: }
1.1.1.2 misho 31057: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 31058: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 31059: CHECK_EXCEPTION();
1.1 misho 31060: ZEND_VM_NEXT_OPCODE();
31061: }
31062:
31063: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31064: {
1.1.1.2 misho 31065: USE_OPLINE
1.1 misho 31066: zend_free_op free_op2;
1.1.1.2 misho 31067: zval **object_ptr;
31068: zval *property_name;
31069:
31070: SAVE_OPLINE();
31071: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
31072: property_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31073:
31074: if (1) {
31075: MAKE_REAL_ZVAL_PTR(property_name);
31076: }
1.1.1.2 misho 31077: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 31078: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
31079: }
1.1.1.2 misho 31080: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 31081: if (1) {
31082: zval_ptr_dtor(&property_name);
31083: } else {
31084: zval_dtor(free_op2.var);
31085: }
31086:
31087: /* assign_obj has two opcodes! */
1.1.1.2 misho 31088: CHECK_EXCEPTION();
1.1 misho 31089: ZEND_VM_INC_OPCODE();
31090: ZEND_VM_NEXT_OPCODE();
31091: }
31092:
31093: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31094: {
1.1.1.2 misho 31095: USE_OPLINE
31096:
31097: zval **object_ptr;
1.1 misho 31098:
1.1.1.2 misho 31099: SAVE_OPLINE();
31100: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31101:
1.1.1.2 misho 31102: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 31103: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
31104: }
31105: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
31106: zend_free_op free_op2;
1.1.1.2 misho 31107: zval *property_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31108:
31109: if (1) {
31110: MAKE_REAL_ZVAL_PTR(property_name);
31111: }
1.1.1.2 misho 31112: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 31113: if (1) {
31114: zval_ptr_dtor(&property_name);
31115: } else {
31116: zval_dtor(free_op2.var);
31117: }
31118: } else {
31119: zend_free_op free_op2, free_op_data1, free_op_data2;
31120: zval *value;
1.1.1.2 misho 31121: zval *dim = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31122: zval **variable_ptr_ptr;
31123:
1.1.1.2 misho 31124: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 31125: zval_dtor(free_op2.var);
31126:
1.1.1.2 misho 31127: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
31128: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
31129: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
31130: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
31131: if (RETURN_VALUE_USED(opline)) {
31132: zval *retval;
31133:
31134: ALLOC_ZVAL(retval);
31135: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
31136: INIT_PZVAL(retval);
31137: AI_SET_PTR(&EX_T(opline->result.var), retval);
31138: }
31139: } else if (RETURN_VALUE_USED(opline)) {
31140: PZVAL_LOCK(&EG(uninitialized_zval));
31141: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
31142: }
31143: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
31144: if (IS_TMP_FREE(free_op_data1)) {
31145: zval_dtor(value);
31146: }
31147: if (RETURN_VALUE_USED(opline)) {
31148: PZVAL_LOCK(&EG(uninitialized_zval));
31149: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
31150: }
31151: } else {
31152: if ((opline+1)->op1_type == IS_TMP_VAR) {
31153: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31154: } else if ((opline+1)->op1_type == IS_CONST) {
31155: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31156: } else {
31157: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31158: }
31159: if (RETURN_VALUE_USED(opline)) {
1.1 misho 31160: PZVAL_LOCK(value);
1.1.1.2 misho 31161: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 31162: }
31163: }
31164: FREE_OP_VAR_PTR(free_op_data2);
31165: FREE_OP_IF_VAR(free_op_data1);
31166: }
31167:
31168: /* assign_dim has two opcodes! */
1.1.1.2 misho 31169: CHECK_EXCEPTION();
1.1 misho 31170: ZEND_VM_INC_OPCODE();
31171: ZEND_VM_NEXT_OPCODE();
31172: }
31173:
31174: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31175: {
1.1.1.2 misho 31176: USE_OPLINE
1.1 misho 31177: zend_free_op free_op2;
1.1.1.2 misho 31178: zval *value;
31179: zval **variable_ptr_ptr;
1.1 misho 31180:
1.1.1.2 misho 31181: SAVE_OPLINE();
31182: value = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
31183: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
31184:
31185: if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
31186: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_TMP_VAR TSRMLS_CC)) {
31187: if (RETURN_VALUE_USED(opline)) {
31188: zval *retval;
31189:
31190: ALLOC_ZVAL(retval);
31191: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
31192: INIT_PZVAL(retval);
31193: AI_SET_PTR(&EX_T(opline->result.var), retval);
31194: }
31195: } else if (RETURN_VALUE_USED(opline)) {
31196: PZVAL_LOCK(&EG(uninitialized_zval));
31197: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
31198: }
31199: } else if (IS_CV == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
31200: if (1) {
31201: zval_dtor(value);
31202: }
31203: if (RETURN_VALUE_USED(opline)) {
31204: PZVAL_LOCK(&EG(uninitialized_zval));
31205: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
31206: }
31207: } else {
31208: if (IS_TMP_VAR == IS_TMP_VAR) {
31209: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31210: } else if (IS_TMP_VAR == IS_CONST) {
31211: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31212: } else {
31213: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
31214: }
31215: if (RETURN_VALUE_USED(opline)) {
1.1 misho 31216: PZVAL_LOCK(value);
1.1.1.2 misho 31217: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 31218: }
31219: }
31220:
31221: /* zend_assign_to_variable() always takes care of op2, never free it! */
31222:
1.1.1.2 misho 31223: CHECK_EXCEPTION();
1.1 misho 31224: ZEND_VM_NEXT_OPCODE();
31225: }
31226:
31227: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31228: {
1.1.1.2 misho 31229: USE_OPLINE
1.1 misho 31230: zval *function_name;
31231: char *function_name_strval;
31232: int function_name_strlen;
31233: zend_free_op free_op2;
31234:
1.1.1.2 misho 31235: SAVE_OPLINE();
1.1 misho 31236: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
31237:
1.1.1.2 misho 31238: function_name = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31239:
1.1.1.2 misho 31240: if (IS_TMP_VAR != IS_CONST &&
31241: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 31242: zend_error_noreturn(E_ERROR, "Method name must be a string");
31243: }
31244:
31245: function_name_strval = Z_STRVAL_P(function_name);
31246: function_name_strlen = Z_STRLEN_P(function_name);
31247:
1.1.1.2 misho 31248: EX(object) = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31249:
1.1.1.2 misho 31250: if (EXPECTED(EX(object) != NULL) &&
31251: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
31252: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 31253:
1.1.1.2 misho 31254: if (IS_TMP_VAR != IS_CONST ||
31255: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
31256: zval *object = EX(object);
31257:
31258: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
31259: zend_error_noreturn(E_ERROR, "Object does not support method calls");
31260: }
31261:
31262: /* First, locate the function. */
31263: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_TMP_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
31264: if (UNEXPECTED(EX(fbc) == NULL)) {
31265: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
31266: }
31267: if (IS_TMP_VAR == IS_CONST &&
31268: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
31269: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
31270: EXPECTED(EX(object) == object)) {
31271: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
31272: }
1.1 misho 31273: }
31274: } else {
31275: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
31276: }
31277:
31278: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
31279: EX(object) = NULL;
31280: } else {
31281: if (!PZVAL_IS_REF(EX(object))) {
31282: Z_ADDREF_P(EX(object)); /* For $this pointer */
31283: } else {
31284: zval *this_ptr;
31285: ALLOC_ZVAL(this_ptr);
31286: INIT_PZVAL_COPY(this_ptr, EX(object));
31287: zval_copy_ctor(this_ptr);
31288: EX(object) = this_ptr;
31289: }
31290: }
31291:
31292: zval_dtor(free_op2.var);
31293:
1.1.1.2 misho 31294: CHECK_EXCEPTION();
1.1 misho 31295: ZEND_VM_NEXT_OPCODE();
31296: }
31297:
31298: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31299: {
1.1.1.2 misho 31300: USE_OPLINE
1.1 misho 31301: zend_free_op free_op2;
31302:
1.1.1.2 misho 31303: SAVE_OPLINE();
1.1 misho 31304: if (IS_CV==IS_VAR) {
1.1.1.2 misho 31305: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 31306: }
1.1.1.2 misho 31307: is_equal_function(&EX_T(opline->result.var).tmp_var,
31308: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31309: _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31310:
31311: zval_dtor(free_op2.var);
1.1.1.2 misho 31312: CHECK_EXCEPTION();
1.1 misho 31313: ZEND_VM_NEXT_OPCODE();
31314: }
31315:
31316: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31317: {
1.1.1.2 misho 31318: USE_OPLINE
31319:
1.1 misho 31320: zval *expr_ptr;
31321:
1.1.1.2 misho 31322: SAVE_OPLINE();
31323: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
31324: zval **expr_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31325:
1.1.1.2 misho 31326: if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
31327: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
31328: }
31329: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 31330: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 31331: Z_ADDREF_P(expr_ptr);
1.1 misho 31332: } else {
1.1.1.2 misho 31333: expr_ptr=_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
31334: if (0) { /* temporary variable */
31335: zval *new_expr;
1.1 misho 31336:
1.1.1.2 misho 31337: ALLOC_ZVAL(new_expr);
31338: INIT_PZVAL_COPY(new_expr, expr_ptr);
31339: expr_ptr = new_expr;
31340: } else if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 31341: zval *new_expr;
31342:
31343: ALLOC_ZVAL(new_expr);
31344: INIT_PZVAL_COPY(new_expr, expr_ptr);
31345: expr_ptr = new_expr;
31346: zendi_zval_copy_ctor(*expr_ptr);
31347: } else {
31348: Z_ADDREF_P(expr_ptr);
31349: }
31350: }
1.1.1.2 misho 31351:
31352: if (IS_TMP_VAR != IS_UNUSED) {
31353: zend_free_op free_op2;
31354: zval *offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
31355: ulong hval;
31356:
1.1 misho 31357: switch (Z_TYPE_P(offset)) {
31358: case IS_DOUBLE:
1.1.1.2 misho 31359: hval = zend_dval_to_lval(Z_DVAL_P(offset));
31360: goto num_index;
1.1 misho 31361: case IS_LONG:
31362: case IS_BOOL:
1.1.1.2 misho 31363: hval = Z_LVAL_P(offset);
31364: num_index:
31365: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 31366: break;
31367: case IS_STRING:
1.1.1.2 misho 31368: if (IS_TMP_VAR == IS_CONST) {
31369: hval = Z_HASH_P(offset);
31370: } else {
31371: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
31372: if (IS_INTERNED(Z_STRVAL_P(offset))) {
31373: hval = INTERNED_HASH(Z_STRVAL_P(offset));
31374: } else {
31375: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
31376: }
31377: }
31378: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 31379: break;
31380: case IS_NULL:
1.1.1.2 misho 31381: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 31382: break;
31383: default:
31384: zend_error(E_WARNING, "Illegal offset type");
31385: zval_ptr_dtor(&expr_ptr);
31386: /* do nothing */
31387: break;
31388: }
31389: zval_dtor(free_op2.var);
31390: } else {
1.1.1.2 misho 31391: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 31392: }
1.1.1.2 misho 31393: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
1.1 misho 31394:
31395: } else {
31396:
31397: }
1.1.1.2 misho 31398: CHECK_EXCEPTION();
1.1 misho 31399: ZEND_VM_NEXT_OPCODE();
31400: }
31401:
31402: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31403: {
1.1.1.2 misho 31404: USE_OPLINE
1.1 misho 31405:
1.1.1.2 misho 31406: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 31407: if (IS_CV == IS_UNUSED) {
31408: ZEND_VM_NEXT_OPCODE();
31409: #if 0 || IS_CV != IS_UNUSED
31410: } else {
31411: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
31412: #endif
31413: }
31414: }
31415:
31416: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31417: {
1.1.1.2 misho 31418: USE_OPLINE
1.1 misho 31419: zend_free_op free_op2;
1.1.1.2 misho 31420: zval **container;
1.1 misho 31421: zval *offset;
1.1.1.2 misho 31422: ulong hval;
1.1 misho 31423:
1.1.1.2 misho 31424: SAVE_OPLINE();
31425: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31426: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
31427: SEPARATE_ZVAL_IF_NOT_REF(container);
31428: }
1.1.1.2 misho 31429: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31430:
31431: if (IS_CV != IS_VAR || container) {
31432: switch (Z_TYPE_PP(container)) {
31433: case IS_ARRAY: {
31434: HashTable *ht = Z_ARRVAL_PP(container);
31435:
31436: switch (Z_TYPE_P(offset)) {
31437: case IS_DOUBLE:
1.1.1.2 misho 31438: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 31439: zend_hash_index_del(ht, hval);
31440: break;
1.1 misho 31441: case IS_RESOURCE:
31442: case IS_BOOL:
31443: case IS_LONG:
1.1.1.2 misho 31444: hval = Z_LVAL_P(offset);
31445: zend_hash_index_del(ht, hval);
1.1 misho 31446: break;
31447: case IS_STRING:
31448: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
31449: Z_ADDREF_P(offset);
31450: }
1.1.1.2 misho 31451: if (IS_TMP_VAR == IS_CONST) {
31452: hval = Z_HASH_P(offset);
31453: } else {
31454: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
31455: if (IS_INTERNED(Z_STRVAL_P(offset))) {
31456: hval = INTERNED_HASH(Z_STRVAL_P(offset));
31457: } else {
31458: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 31459: }
31460: }
1.1.1.2 misho 31461: if (ht == &EG(symbol_table)) {
31462: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
31463: } else {
31464: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
31465: }
31466: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
31467: zval_ptr_dtor(&offset);
31468: }
31469: break;
31470: num_index_dim:
31471: zend_hash_index_del(ht, hval);
1.1 misho 31472: if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
31473: zval_ptr_dtor(&offset);
31474: }
31475: break;
31476: case IS_NULL:
31477: zend_hash_del(ht, "", sizeof(""));
31478: break;
31479: default:
31480: zend_error(E_WARNING, "Illegal offset type in unset");
31481: break;
31482: }
31483: zval_dtor(free_op2.var);
31484: break;
31485: }
31486: case IS_OBJECT:
1.1.1.2 misho 31487: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 31488: zend_error_noreturn(E_ERROR, "Cannot use object as array");
31489: }
31490: if (1) {
31491: MAKE_REAL_ZVAL_PTR(offset);
31492: }
31493: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
31494: if (1) {
31495: zval_ptr_dtor(&offset);
31496: } else {
31497: zval_dtor(free_op2.var);
31498: }
31499: break;
31500: case IS_STRING:
31501: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
31502: ZEND_VM_CONTINUE(); /* bailed out before */
31503: default:
31504: zval_dtor(free_op2.var);
31505: break;
31506: }
31507: } else {
31508: zval_dtor(free_op2.var);
31509: }
31510:
1.1.1.2 misho 31511: CHECK_EXCEPTION();
1.1 misho 31512: ZEND_VM_NEXT_OPCODE();
31513: }
31514:
31515: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31516: {
1.1.1.2 misho 31517: USE_OPLINE
1.1 misho 31518: zend_free_op free_op2;
1.1.1.2 misho 31519: zval **container;
31520: zval *offset;
31521:
31522: SAVE_OPLINE();
31523: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
31524: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31525:
31526: if (IS_CV != IS_VAR || container) {
31527: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
31528: SEPARATE_ZVAL_IF_NOT_REF(container);
31529: }
31530: if (Z_TYPE_PP(container) == IS_OBJECT) {
31531: if (1) {
31532: MAKE_REAL_ZVAL_PTR(offset);
31533: }
31534: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 31535: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 31536: } else {
31537: zend_error(E_NOTICE, "Trying to unset property of non-object");
31538: }
31539: if (1) {
31540: zval_ptr_dtor(&offset);
31541: } else {
31542: zval_dtor(free_op2.var);
31543: }
31544: } else {
31545: zval_dtor(free_op2.var);
31546: }
31547: } else {
31548: zval_dtor(free_op2.var);
31549: }
31550:
1.1.1.2 misho 31551: CHECK_EXCEPTION();
1.1 misho 31552: ZEND_VM_NEXT_OPCODE();
31553: }
31554:
31555: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
31556: {
1.1.1.2 misho 31557: USE_OPLINE
31558: zend_free_op free_op2;
31559: zval **container;
1.1 misho 31560: zval **value = NULL;
31561: int result = 0;
1.1.1.2 misho 31562: ulong hval;
31563: zval *offset;
1.1 misho 31564:
1.1.1.2 misho 31565: SAVE_OPLINE();
31566: container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31567:
1.1.1.2 misho 31568: offset = _get_zval_ptr_tmp(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 31569:
1.1.1.2 misho 31570: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
31571: HashTable *ht;
31572: int isset = 0;
1.1 misho 31573:
1.1.1.2 misho 31574: ht = Z_ARRVAL_PP(container);
31575:
31576: switch (Z_TYPE_P(offset)) {
31577: case IS_DOUBLE:
31578: hval = zend_dval_to_lval(Z_DVAL_P(offset));
31579: goto num_index_prop;
31580: case IS_RESOURCE:
31581: case IS_BOOL:
31582: case IS_LONG:
31583: hval = Z_LVAL_P(offset);
31584: num_index_prop:
31585: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
31586: isset = 1;
31587: }
31588: break;
31589: case IS_STRING:
31590: if (IS_TMP_VAR == IS_CONST) {
31591: hval = Z_HASH_P(offset);
31592: } else {
31593: if (!prop_dim) {
31594: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 31595: }
1.1.1.2 misho 31596: if (IS_INTERNED(Z_STRVAL_P(offset))) {
31597: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 31598: } else {
1.1.1.2 misho 31599: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 31600: }
1.1.1.2 misho 31601: }
31602: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
31603: isset = 1;
31604: }
31605: break;
31606: case IS_NULL:
31607: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
31608: isset = 1;
31609: }
31610: break;
31611: default:
31612: zend_error(E_WARNING, "Illegal offset type in isset or empty");
31613: break;
31614: }
31615:
31616: if (opline->extended_value & ZEND_ISSET) {
31617: if (isset && Z_TYPE_PP(value) == IS_NULL) {
31618: result = 0;
31619: } else {
31620: result = isset;
1.1 misho 31621: }
1.1.1.2 misho 31622: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
31623: if (!isset || !i_zend_is_true(*value)) {
31624: result = 0;
31625: } else {
31626: result = 1;
1.1 misho 31627: }
1.1.1.2 misho 31628: }
31629: zval_dtor(free_op2.var);
31630: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
31631: if (1) {
31632: MAKE_REAL_ZVAL_PTR(offset);
31633: }
31634: if (prop_dim) {
31635: if (Z_OBJ_HT_P(*container)->has_property) {
31636: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 31637: } else {
1.1.1.2 misho 31638: zend_error(E_NOTICE, "Trying to check property of non-object");
31639: result = 0;
1.1 misho 31640: }
1.1.1.2 misho 31641: } else {
31642: if (Z_OBJ_HT_P(*container)->has_dimension) {
31643: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 31644: } else {
1.1.1.2 misho 31645: zend_error(E_NOTICE, "Trying to check element of non-array");
31646: result = 0;
1.1 misho 31647: }
1.1.1.2 misho 31648: }
31649: if (1) {
31650: zval_ptr_dtor(&offset);
31651: } else {
31652: zval_dtor(free_op2.var);
31653: }
31654: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
31655: zval tmp;
1.1 misho 31656:
1.1.1.2 misho 31657: if (Z_TYPE_P(offset) != IS_LONG) {
31658: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
31659: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
31660: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
31661: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 31662: zval_copy_ctor(&tmp);
31663: convert_to_long(&tmp);
31664: offset = &tmp;
1.1.1.2 misho 31665: } else {
31666: /* can not be converted to proper offset, return "not set" */
31667: result = 0;
1.1 misho 31668: }
1.1.1.2 misho 31669: }
31670: if (Z_TYPE_P(offset) == IS_LONG) {
31671: if (opline->extended_value & ZEND_ISSET) {
31672: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
31673: result = 1;
31674: }
31675: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
31676: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
31677: result = 1;
1.1 misho 31678: }
31679: }
31680: }
1.1.1.2 misho 31681: zval_dtor(free_op2.var);
31682: } else {
31683: zval_dtor(free_op2.var);
1.1 misho 31684: }
31685:
1.1.1.2 misho 31686: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
31687: if (opline->extended_value & ZEND_ISSET) {
31688: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
31689: } else {
31690: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 31691: }
31692:
1.1.1.2 misho 31693: CHECK_EXCEPTION();
1.1 misho 31694: ZEND_VM_NEXT_OPCODE();
31695: }
31696:
31697: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31698: {
31699: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
31700: }
31701:
31702: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31703: {
31704: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_TMP(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
31705: }
31706:
31707: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31708: {
1.1.1.2 misho 31709: USE_OPLINE
1.1 misho 31710: zend_free_op free_op2;
31711:
1.1.1.2 misho 31712: SAVE_OPLINE();
31713: fast_add_function(&EX_T(opline->result.var).tmp_var,
31714: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31715: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31716:
31717: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31718: CHECK_EXCEPTION();
1.1 misho 31719: ZEND_VM_NEXT_OPCODE();
31720: }
31721:
31722: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31723: {
1.1.1.2 misho 31724: USE_OPLINE
1.1 misho 31725: zend_free_op free_op2;
31726:
1.1.1.2 misho 31727: SAVE_OPLINE();
31728: fast_sub_function(&EX_T(opline->result.var).tmp_var,
31729: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31730: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31731:
31732: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31733: CHECK_EXCEPTION();
1.1 misho 31734: ZEND_VM_NEXT_OPCODE();
31735: }
31736:
31737: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31738: {
1.1.1.2 misho 31739: USE_OPLINE
1.1 misho 31740: zend_free_op free_op2;
31741:
1.1.1.2 misho 31742: SAVE_OPLINE();
31743: fast_mul_function(&EX_T(opline->result.var).tmp_var,
31744: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31745: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31746:
31747: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31748: CHECK_EXCEPTION();
1.1 misho 31749: ZEND_VM_NEXT_OPCODE();
31750: }
31751:
31752: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31753: {
1.1.1.2 misho 31754: USE_OPLINE
1.1 misho 31755: zend_free_op free_op2;
31756:
1.1.1.2 misho 31757: SAVE_OPLINE();
31758: fast_div_function(&EX_T(opline->result.var).tmp_var,
31759: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31760: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31761:
31762: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31763: CHECK_EXCEPTION();
1.1 misho 31764: ZEND_VM_NEXT_OPCODE();
31765: }
31766:
31767: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31768: {
1.1.1.2 misho 31769: USE_OPLINE
1.1 misho 31770: zend_free_op free_op2;
31771:
1.1.1.2 misho 31772: SAVE_OPLINE();
31773: fast_mod_function(&EX_T(opline->result.var).tmp_var,
31774: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31775: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31776:
31777: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31778: CHECK_EXCEPTION();
1.1 misho 31779: ZEND_VM_NEXT_OPCODE();
31780: }
31781:
31782: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31783: {
1.1.1.2 misho 31784: USE_OPLINE
1.1 misho 31785: zend_free_op free_op2;
31786:
1.1.1.2 misho 31787: SAVE_OPLINE();
31788: shift_left_function(&EX_T(opline->result.var).tmp_var,
31789: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31790: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31791:
31792: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31793: CHECK_EXCEPTION();
1.1 misho 31794: ZEND_VM_NEXT_OPCODE();
31795: }
31796:
31797: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31798: {
1.1.1.2 misho 31799: USE_OPLINE
1.1 misho 31800: zend_free_op free_op2;
31801:
1.1.1.2 misho 31802: SAVE_OPLINE();
31803: shift_right_function(&EX_T(opline->result.var).tmp_var,
31804: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31805: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31806:
31807: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31808: CHECK_EXCEPTION();
1.1 misho 31809: ZEND_VM_NEXT_OPCODE();
31810: }
31811:
31812: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31813: {
1.1.1.2 misho 31814: USE_OPLINE
1.1 misho 31815: zend_free_op free_op2;
31816:
1.1.1.2 misho 31817: SAVE_OPLINE();
31818: concat_function(&EX_T(opline->result.var).tmp_var,
31819: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31820: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31821:
31822: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31823: CHECK_EXCEPTION();
1.1 misho 31824: ZEND_VM_NEXT_OPCODE();
31825: }
31826:
31827: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31828: {
1.1.1.2 misho 31829: USE_OPLINE
1.1 misho 31830: zend_free_op free_op2;
31831:
1.1.1.2 misho 31832: SAVE_OPLINE();
31833: is_identical_function(&EX_T(opline->result.var).tmp_var,
31834: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31835: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31836:
31837: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31838: CHECK_EXCEPTION();
1.1 misho 31839: ZEND_VM_NEXT_OPCODE();
31840: }
31841:
31842: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31843: {
1.1.1.2 misho 31844: USE_OPLINE
1.1 misho 31845: zend_free_op free_op2;
1.1.1.2 misho 31846: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 31847:
1.1.1.2 misho 31848: SAVE_OPLINE();
1.1 misho 31849: is_identical_function(result,
1.1.1.2 misho 31850: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31851: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31852: Z_LVAL_P(result) = !Z_LVAL_P(result);
31853:
31854: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31855: CHECK_EXCEPTION();
1.1 misho 31856: ZEND_VM_NEXT_OPCODE();
31857: }
31858:
31859: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31860: {
1.1.1.2 misho 31861: USE_OPLINE
1.1 misho 31862: zend_free_op free_op2;
1.1.1.2 misho 31863: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 31864:
1.1.1.2 misho 31865: SAVE_OPLINE();
31866: ZVAL_BOOL(result, fast_equal_function(result,
31867: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31868: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 31869:
31870: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31871: CHECK_EXCEPTION();
1.1 misho 31872: ZEND_VM_NEXT_OPCODE();
31873: }
31874:
31875: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31876: {
1.1.1.2 misho 31877: USE_OPLINE
1.1 misho 31878: zend_free_op free_op2;
1.1.1.2 misho 31879: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 31880:
1.1.1.2 misho 31881: SAVE_OPLINE();
31882: ZVAL_BOOL(result, fast_not_equal_function(result,
31883: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31884: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 31885:
31886: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31887: CHECK_EXCEPTION();
1.1 misho 31888: ZEND_VM_NEXT_OPCODE();
31889: }
31890:
31891: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31892: {
1.1.1.2 misho 31893: USE_OPLINE
1.1 misho 31894: zend_free_op free_op2;
1.1.1.2 misho 31895: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 31896:
1.1.1.2 misho 31897: SAVE_OPLINE();
31898: ZVAL_BOOL(result, fast_is_smaller_function(result,
31899: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31900: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 31901:
31902: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31903: CHECK_EXCEPTION();
1.1 misho 31904: ZEND_VM_NEXT_OPCODE();
31905: }
31906:
31907: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31908: {
1.1.1.2 misho 31909: USE_OPLINE
1.1 misho 31910: zend_free_op free_op2;
1.1.1.2 misho 31911: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 31912:
1.1.1.2 misho 31913: SAVE_OPLINE();
31914: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
31915: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31916: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC));
1.1 misho 31917:
31918: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31919: CHECK_EXCEPTION();
1.1 misho 31920: ZEND_VM_NEXT_OPCODE();
31921: }
31922:
31923: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31924: {
1.1.1.2 misho 31925: USE_OPLINE
1.1 misho 31926: zend_free_op free_op2;
31927:
1.1.1.2 misho 31928: SAVE_OPLINE();
31929: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
31930: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31931: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31932:
31933: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31934: CHECK_EXCEPTION();
1.1 misho 31935: ZEND_VM_NEXT_OPCODE();
31936: }
31937:
31938: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31939: {
1.1.1.2 misho 31940: USE_OPLINE
1.1 misho 31941: zend_free_op free_op2;
31942:
1.1.1.2 misho 31943: SAVE_OPLINE();
31944: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
31945: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31946: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31947:
31948: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31949: CHECK_EXCEPTION();
1.1 misho 31950: ZEND_VM_NEXT_OPCODE();
31951: }
31952:
31953: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31954: {
1.1.1.2 misho 31955: USE_OPLINE
1.1 misho 31956: zend_free_op free_op2;
31957:
1.1.1.2 misho 31958: SAVE_OPLINE();
31959: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
31960: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31961: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31962:
31963: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31964: CHECK_EXCEPTION();
1.1 misho 31965: ZEND_VM_NEXT_OPCODE();
31966: }
31967:
31968: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
31969: {
1.1.1.2 misho 31970: USE_OPLINE
1.1 misho 31971: zend_free_op free_op2;
31972:
1.1.1.2 misho 31973: SAVE_OPLINE();
31974: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
31975: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
31976: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 31977:
31978: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 31979: CHECK_EXCEPTION();
1.1 misho 31980: ZEND_VM_NEXT_OPCODE();
31981: }
31982:
31983: 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)
31984: {
1.1.1.2 misho 31985: USE_OPLINE
1.1 misho 31986: zend_free_op free_op2, free_op_data1;
1.1.1.2 misho 31987: zval **object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 31988: zval *object;
1.1.1.2 misho 31989: zval *property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
31990: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 31991: int have_get_ptr = 0;
31992:
1.1.1.2 misho 31993: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 31994: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
31995: }
31996:
31997: make_real_object(object_ptr TSRMLS_CC);
31998: object = *object_ptr;
31999:
1.1.1.2 misho 32000: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 32001: zend_error(E_WARNING, "Attempt to assign property of non-object");
32002: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32003: FREE_OP(free_op_data1);
32004:
1.1.1.2 misho 32005: if (RETURN_VALUE_USED(opline)) {
32006: PZVAL_LOCK(&EG(uninitialized_zval));
32007: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
32008: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 32009: }
32010: } else {
32011: /* here we are sure we are dealing with an object */
32012: if (0) {
32013: MAKE_REAL_ZVAL_PTR(property);
32014: }
32015:
32016: /* here property is a string */
32017: if (opline->extended_value == ZEND_ASSIGN_OBJ
32018: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 32019: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32020: if (zptr != NULL) { /* NULL means no success in getting PTR */
32021: SEPARATE_ZVAL_IF_NOT_REF(zptr);
32022:
32023: have_get_ptr = 1;
32024: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 32025: if (RETURN_VALUE_USED(opline)) {
1.1 misho 32026: PZVAL_LOCK(*zptr);
1.1.1.2 misho 32027: EX_T(opline->result.var).var.ptr = *zptr;
32028: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 32029: }
32030: }
32031: }
32032:
32033: if (!have_get_ptr) {
32034: zval *z = NULL;
32035:
32036: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
32037: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 32038: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32039: }
32040: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
32041: if (Z_OBJ_HT_P(object)->read_dimension) {
32042: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
32043: }
32044: }
32045: if (z) {
32046: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
32047: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
32048:
32049: if (Z_REFCOUNT_P(z) == 0) {
32050: GC_REMOVE_ZVAL_FROM_BUFFER(z);
32051: zval_dtor(z);
32052: FREE_ZVAL(z);
32053: }
32054: z = value;
32055: }
32056: Z_ADDREF_P(z);
32057: SEPARATE_ZVAL_IF_NOT_REF(&z);
32058: binary_op(z, z, value TSRMLS_CC);
32059: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 32060: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32061: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
32062: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
32063: }
1.1.1.2 misho 32064: if (RETURN_VALUE_USED(opline)) {
1.1 misho 32065: PZVAL_LOCK(z);
1.1.1.2 misho 32066: EX_T(opline->result.var).var.ptr = z;
32067: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 32068: }
32069: zval_ptr_dtor(&z);
32070: } else {
32071: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 32072: if (RETURN_VALUE_USED(opline)) {
32073: PZVAL_LOCK(&EG(uninitialized_zval));
32074: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
32075: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 32076: }
32077: }
32078: }
32079:
32080: if (0) {
32081: zval_ptr_dtor(&property);
32082: } else {
32083: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32084: }
32085: FREE_OP(free_op_data1);
32086: }
32087:
32088: /* assign_obj has two opcodes! */
1.1.1.2 misho 32089: CHECK_EXCEPTION();
1.1 misho 32090: ZEND_VM_INC_OPCODE();
32091: ZEND_VM_NEXT_OPCODE();
32092: }
32093:
32094: 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)
32095: {
1.1.1.2 misho 32096: USE_OPLINE
1.1 misho 32097: zend_free_op free_op2, free_op_data2, free_op_data1;
32098: zval **var_ptr;
32099: zval *value;
32100:
1.1.1.2 misho 32101: SAVE_OPLINE();
1.1 misho 32102: switch (opline->extended_value) {
32103: case ZEND_ASSIGN_OBJ:
32104: return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32105: break;
32106: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 32107: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32108:
1.1.1.2 misho 32109: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32110: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 32111: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 32112: if (IS_CV == IS_VAR && !0) {
32113: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
32114: }
32115: return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32116: } else {
1.1.1.2 misho 32117: zval *dim = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 32118:
1.1.1.2 misho 32119: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
32120: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
32121: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 32122: }
32123: }
32124: break;
32125: default:
1.1.1.2 misho 32126: value = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32127: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32128: /* do nothing */
32129: break;
32130: }
32131:
1.1.1.2 misho 32132: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 32133: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
32134: }
32135:
1.1.1.2 misho 32136: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
32137: if (RETURN_VALUE_USED(opline)) {
32138: PZVAL_LOCK(&EG(uninitialized_zval));
32139: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 32140: }
32141: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32142:
1.1.1.2 misho 32143: CHECK_EXCEPTION();
32144: if (opline->extended_value == ZEND_ASSIGN_DIM) {
32145: ZEND_VM_INC_OPCODE();
32146: }
1.1 misho 32147: ZEND_VM_NEXT_OPCODE();
32148: }
32149:
32150: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
32151:
1.1.1.2 misho 32152: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
32153: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 32154: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
32155: /* proxy object */
32156: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
32157: Z_ADDREF_P(objval);
32158: binary_op(objval, objval, value TSRMLS_CC);
32159: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
32160: zval_ptr_dtor(&objval);
32161: } else {
32162: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
32163: }
32164:
1.1.1.2 misho 32165: if (RETURN_VALUE_USED(opline)) {
1.1 misho 32166: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 32167: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 32168: }
32169: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32170:
32171: if (opline->extended_value == ZEND_ASSIGN_DIM) {
32172: FREE_OP(free_op_data1);
32173: FREE_OP_VAR_PTR(free_op_data2);
32174:
1.1.1.2 misho 32175: CHECK_EXCEPTION();
32176: ZEND_VM_INC_OPCODE();
32177: } else {
32178:
32179: CHECK_EXCEPTION();
32180: }
1.1 misho 32181: ZEND_VM_NEXT_OPCODE();
32182: }
32183:
32184: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32185: {
32186: return zend_binary_assign_op_helper_SPEC_CV_VAR(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32187: }
32188:
32189: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32190: {
32191: return zend_binary_assign_op_helper_SPEC_CV_VAR(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32192: }
32193:
32194: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32195: {
32196: return zend_binary_assign_op_helper_SPEC_CV_VAR(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32197: }
32198:
32199: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32200: {
32201: return zend_binary_assign_op_helper_SPEC_CV_VAR(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32202: }
32203:
32204: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32205: {
32206: return zend_binary_assign_op_helper_SPEC_CV_VAR(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32207: }
32208:
32209: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32210: {
32211: return zend_binary_assign_op_helper_SPEC_CV_VAR(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32212: }
32213:
32214: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32215: {
32216: return zend_binary_assign_op_helper_SPEC_CV_VAR(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32217: }
32218:
32219: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32220: {
32221: return zend_binary_assign_op_helper_SPEC_CV_VAR(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32222: }
32223:
32224: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32225: {
32226: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32227: }
32228:
32229: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32230: {
32231: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32232: }
32233:
32234: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32235: {
32236: return zend_binary_assign_op_helper_SPEC_CV_VAR(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32237: }
32238:
32239: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
32240: {
1.1.1.2 misho 32241: USE_OPLINE
1.1 misho 32242: zend_free_op free_op2;
1.1.1.2 misho 32243: zval **object_ptr;
1.1 misho 32244: zval *object;
1.1.1.2 misho 32245: zval *property;
32246: zval **retval;
1.1 misho 32247: int have_get_ptr = 0;
32248:
1.1.1.2 misho 32249: SAVE_OPLINE();
32250: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
32251: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32252: retval = &EX_T(opline->result.var).var.ptr;
32253:
32254: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 32255: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
32256: }
32257:
32258: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
32259: object = *object_ptr;
32260:
1.1.1.2 misho 32261: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 32262: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
32263: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 32264: if (RETURN_VALUE_USED(opline)) {
32265: PZVAL_LOCK(&EG(uninitialized_zval));
32266: *retval = &EG(uninitialized_zval);
1.1 misho 32267: }
32268:
1.1.1.2 misho 32269: CHECK_EXCEPTION();
1.1 misho 32270: ZEND_VM_NEXT_OPCODE();
32271: }
32272:
32273: /* here we are sure we are dealing with an object */
32274:
32275: if (0) {
32276: MAKE_REAL_ZVAL_PTR(property);
32277: }
32278:
32279: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 32280: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32281: if (zptr != NULL) { /* NULL means no success in getting PTR */
32282: SEPARATE_ZVAL_IF_NOT_REF(zptr);
32283:
32284: have_get_ptr = 1;
32285: incdec_op(*zptr);
1.1.1.2 misho 32286: if (RETURN_VALUE_USED(opline)) {
1.1 misho 32287: *retval = *zptr;
32288: PZVAL_LOCK(*retval);
32289: }
32290: }
32291: }
32292:
32293: if (!have_get_ptr) {
32294: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 32295: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32296:
1.1.1.2 misho 32297: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 32298: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
32299:
32300: if (Z_REFCOUNT_P(z) == 0) {
32301: GC_REMOVE_ZVAL_FROM_BUFFER(z);
32302: zval_dtor(z);
32303: FREE_ZVAL(z);
32304: }
32305: z = value;
32306: }
32307: Z_ADDREF_P(z);
32308: SEPARATE_ZVAL_IF_NOT_REF(&z);
32309: incdec_op(z);
32310: *retval = z;
1.1.1.2 misho 32311: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
32312: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 32313: zval_ptr_dtor(&z);
32314: } else {
32315: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 32316: if (RETURN_VALUE_USED(opline)) {
32317: PZVAL_LOCK(&EG(uninitialized_zval));
32318: *retval = &EG(uninitialized_zval);
1.1 misho 32319: }
32320: }
32321: }
32322:
32323: if (0) {
32324: zval_ptr_dtor(&property);
32325: } else {
32326: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32327: }
32328:
1.1.1.2 misho 32329: CHECK_EXCEPTION();
1.1 misho 32330: ZEND_VM_NEXT_OPCODE();
32331: }
32332:
32333: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32334: {
32335: return zend_pre_incdec_property_helper_SPEC_CV_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32336: }
32337:
32338: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32339: {
32340: return zend_pre_incdec_property_helper_SPEC_CV_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32341: }
32342:
32343: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
32344: {
1.1.1.2 misho 32345: USE_OPLINE
1.1 misho 32346: zend_free_op free_op2;
1.1.1.2 misho 32347: zval **object_ptr;
1.1 misho 32348: zval *object;
1.1.1.2 misho 32349: zval *property;
32350: zval *retval;
1.1 misho 32351: int have_get_ptr = 0;
32352:
1.1.1.2 misho 32353: SAVE_OPLINE();
32354: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
32355: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32356: retval = &EX_T(opline->result.var).tmp_var;
32357:
32358: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 32359: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
32360: }
32361:
32362: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
32363: object = *object_ptr;
32364:
1.1.1.2 misho 32365: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 32366: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
32367: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 32368: ZVAL_NULL(retval);
1.1 misho 32369:
1.1.1.2 misho 32370: CHECK_EXCEPTION();
1.1 misho 32371: ZEND_VM_NEXT_OPCODE();
32372: }
32373:
32374: /* here we are sure we are dealing with an object */
32375:
32376: if (0) {
32377: MAKE_REAL_ZVAL_PTR(property);
32378: }
32379:
32380: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 32381: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32382: if (zptr != NULL) { /* NULL means no success in getting PTR */
32383: have_get_ptr = 1;
32384: SEPARATE_ZVAL_IF_NOT_REF(zptr);
32385:
1.1.1.2 misho 32386: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 32387: zendi_zval_copy_ctor(*retval);
32388:
32389: incdec_op(*zptr);
32390:
32391: }
32392: }
32393:
32394: if (!have_get_ptr) {
32395: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 32396: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32397: zval *z_copy;
32398:
1.1.1.2 misho 32399: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 32400: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
32401:
32402: if (Z_REFCOUNT_P(z) == 0) {
32403: GC_REMOVE_ZVAL_FROM_BUFFER(z);
32404: zval_dtor(z);
32405: FREE_ZVAL(z);
32406: }
32407: z = value;
32408: }
1.1.1.2 misho 32409: ZVAL_COPY_VALUE(retval, z);
1.1 misho 32410: zendi_zval_copy_ctor(*retval);
32411: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 32412: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 32413: zendi_zval_copy_ctor(*z_copy);
32414: incdec_op(z_copy);
32415: Z_ADDREF_P(z);
1.1.1.2 misho 32416: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32417: zval_ptr_dtor(&z_copy);
32418: zval_ptr_dtor(&z);
32419: } else {
32420: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 32421: ZVAL_NULL(retval);
32422: }
32423: }
32424:
32425: if (0) {
32426: zval_ptr_dtor(&property);
32427: } else {
32428: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32429: }
32430:
32431: CHECK_EXCEPTION();
32432: ZEND_VM_NEXT_OPCODE();
32433: }
32434:
32435: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32436: {
32437: return zend_post_incdec_property_helper_SPEC_CV_VAR(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32438: }
32439:
32440: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32441: {
32442: return zend_post_incdec_property_helper_SPEC_CV_VAR(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32443: }
32444:
32445: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEND_OPCODE_HANDLER_ARGS)
32446: {
32447: USE_OPLINE
32448: zend_free_op free_op1;
32449: zval *varname;
32450: zval **retval;
32451: zval tmp_varname;
32452: HashTable *target_symbol_table;
32453: ulong hash_value;
32454:
32455: SAVE_OPLINE();
32456: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
32457:
32458: if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
32459: ZVAL_COPY_VALUE(&tmp_varname, varname);
32460: zval_copy_ctor(&tmp_varname);
32461: Z_SET_REFCOUNT(tmp_varname, 1);
32462: Z_UNSET_ISREF(tmp_varname);
32463: convert_to_string(&tmp_varname);
32464: varname = &tmp_varname;
32465: }
32466:
32467: if (IS_VAR != IS_UNUSED) {
32468: zend_class_entry *ce;
32469:
32470: if (IS_VAR == IS_CONST) {
32471: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
32472: ce = CACHED_PTR(opline->op2.literal->cache_slot);
32473: } else {
32474: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
32475: if (UNEXPECTED(ce == NULL)) {
32476: if (IS_CV != IS_CONST && varname == &tmp_varname) {
32477: zval_dtor(&tmp_varname);
32478: }
32479:
32480: CHECK_EXCEPTION();
32481: ZEND_VM_NEXT_OPCODE();
32482: }
32483: CACHE_PTR(opline->op2.literal->cache_slot, ce);
32484: }
32485: } else {
32486: ce = EX_T(opline->op2.var).class_entry;
32487: }
32488: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
32489:
32490: } else {
32491: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
32492: /*
32493: if (!target_symbol_table) {
32494: CHECK_EXCEPTION();
32495: ZEND_VM_NEXT_OPCODE();
32496: }
32497: */
32498: if (IS_CV == IS_CONST) {
32499: hash_value = Z_HASH_P(varname);
32500: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
32501: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
32502: } else {
32503: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
32504: }
32505:
32506: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
32507: switch (type) {
32508: case BP_VAR_R:
32509: case BP_VAR_UNSET:
32510: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
32511: /* break missing intentionally */
32512: case BP_VAR_IS:
32513: retval = &EG(uninitialized_zval_ptr);
32514: break;
32515: case BP_VAR_RW:
32516: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
32517: /* break missing intentionally */
32518: case BP_VAR_W:
32519: Z_ADDREF_P(&EG(uninitialized_zval));
32520: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
32521: break;
32522: EMPTY_SWITCH_DEFAULT_CASE()
32523: }
32524: }
32525: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
32526: case ZEND_FETCH_GLOBAL:
32527: if (IS_CV != IS_TMP_VAR) {
32528:
32529: }
32530: break;
32531: case ZEND_FETCH_LOCAL:
32532:
32533: break;
32534: case ZEND_FETCH_STATIC:
32535: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
32536: break;
32537: case ZEND_FETCH_GLOBAL_LOCK:
32538: if (IS_CV == IS_VAR && !free_op1.var) {
32539: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
32540: }
32541: break;
32542: }
32543: }
32544:
32545:
32546: if (IS_CV != IS_CONST && varname == &tmp_varname) {
32547: zval_dtor(&tmp_varname);
32548: }
32549: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
32550: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
32551: }
32552: PZVAL_LOCK(*retval);
32553: switch (type) {
32554: case BP_VAR_R:
32555: case BP_VAR_IS:
32556: AI_SET_PTR(&EX_T(opline->result.var), *retval);
32557: break;
32558: case BP_VAR_UNSET: {
32559: zend_free_op free_res;
32560:
32561: PZVAL_UNLOCK(*retval, &free_res);
32562: if (retval != &EG(uninitialized_zval_ptr)) {
32563: SEPARATE_ZVAL_IF_NOT_REF(retval);
32564: }
32565: PZVAL_LOCK(*retval);
32566: FREE_OP_VAR_PTR(free_res);
1.1 misho 32567: }
1.1.1.2 misho 32568: /* break missing intentionally */
32569: default:
32570: EX_T(opline->result.var).var.ptr_ptr = retval;
32571: break;
1.1 misho 32572: }
1.1.1.2 misho 32573: CHECK_EXCEPTION();
32574: ZEND_VM_NEXT_OPCODE();
32575: }
32576:
32577: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32578: {
32579: return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32580: }
32581:
32582: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32583: {
32584: return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32585: }
1.1 misho 32586:
1.1.1.2 misho 32587: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32588: {
32589: return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
32590: }
1.1 misho 32591:
1.1.1.2 misho 32592: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32593: {
32594: USE_OPLINE
32595:
32596: return zend_fetch_var_address_helper_SPEC_CV_VAR(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 32597: }
32598:
1.1.1.2 misho 32599: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 32600: {
1.1.1.2 misho 32601: return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 32602: }
32603:
1.1.1.2 misho 32604: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 32605: {
1.1.1.2 misho 32606: return zend_fetch_var_address_helper_SPEC_CV_VAR(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 32607: }
32608:
32609: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32610: {
1.1.1.2 misho 32611: USE_OPLINE
1.1 misho 32612: zend_free_op free_op2;
1.1.1.5 ! misho 32613: zval *container;
1.1 misho 32614:
1.1.1.2 misho 32615: SAVE_OPLINE();
32616:
1.1.1.5 ! misho 32617: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 32618: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 32619: }
1.1.1.5 ! misho 32620: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 32621: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
1.1 misho 32622: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32623:
1.1.1.2 misho 32624: CHECK_EXCEPTION();
1.1 misho 32625: ZEND_VM_NEXT_OPCODE();
32626: }
32627:
32628: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32629: {
1.1.1.2 misho 32630: USE_OPLINE
1.1 misho 32631: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32632: zval **container;
1.1 misho 32633:
1.1.1.2 misho 32634: SAVE_OPLINE();
32635: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
32636:
32637: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32638: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
32639: }
1.1.1.2 misho 32640: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 32641: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 32642: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32643: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32644: }
32645:
32646: /* We are going to assign the result by reference */
1.1.1.2 misho 32647: if (UNEXPECTED(opline->extended_value != 0)) {
32648: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
32649:
32650: if (retval_ptr) {
32651: Z_DELREF_PP(retval_ptr);
32652: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
32653: Z_ADDREF_PP(retval_ptr);
32654: }
1.1 misho 32655: }
32656:
1.1.1.2 misho 32657: CHECK_EXCEPTION();
1.1 misho 32658: ZEND_VM_NEXT_OPCODE();
32659: }
32660:
32661: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32662: {
1.1.1.2 misho 32663: USE_OPLINE
1.1 misho 32664: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32665: zval **container;
32666:
32667: SAVE_OPLINE();
32668: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32669:
1.1.1.2 misho 32670: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32671: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
32672: }
1.1.1.2 misho 32673: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
1.1 misho 32674: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 32675: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32676: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32677: }
32678:
1.1.1.2 misho 32679: CHECK_EXCEPTION();
1.1 misho 32680: ZEND_VM_NEXT_OPCODE();
32681: }
32682:
32683: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32684: {
1.1.1.2 misho 32685: USE_OPLINE
1.1 misho 32686: zend_free_op free_op2;
1.1.1.5 ! misho 32687: zval *container;
1.1 misho 32688:
1.1.1.2 misho 32689: SAVE_OPLINE();
1.1.1.5 ! misho 32690: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 32691: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_IS TSRMLS_CC);
1.1 misho 32692: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32693:
1.1.1.2 misho 32694: CHECK_EXCEPTION();
1.1 misho 32695: ZEND_VM_NEXT_OPCODE();
32696: }
32697:
32698: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32699: {
1.1.1.2 misho 32700: USE_OPLINE
1.1 misho 32701: zend_free_op free_op1, free_op2;
32702:
1.1.1.2 misho 32703: SAVE_OPLINE();
32704:
32705: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 32706: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
! 32707:
1.1.1.2 misho 32708: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32709: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
32710: }
1.1.1.2 misho 32711: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
32712: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32713: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32714: }
1.1.1.5 ! misho 32715: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
! 32716:
1.1 misho 32717: } else {
1.1.1.5 ! misho 32718: zval *container;
! 32719:
1.1 misho 32720: if (IS_VAR == IS_UNUSED) {
32721: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
32722: }
1.1.1.5 ! misho 32723: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 32724: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_R TSRMLS_CC);
1.1.1.5 ! misho 32725: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 32726:
1.1.1.5 ! misho 32727: }
1.1.1.2 misho 32728: CHECK_EXCEPTION();
1.1 misho 32729: ZEND_VM_NEXT_OPCODE();
32730: }
32731:
32732: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32733: {
1.1.1.2 misho 32734: USE_OPLINE
1.1 misho 32735: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32736: zval **container;
32737:
32738: SAVE_OPLINE();
32739: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32740:
32741: if (IS_CV == IS_CV) {
32742: if (container != &EG(uninitialized_zval_ptr)) {
32743: SEPARATE_ZVAL_IF_NOT_REF(container);
32744: }
32745: }
1.1.1.2 misho 32746: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32747: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
32748: }
1.1.1.2 misho 32749: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 32750: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 32751: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32752: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32753: }
32754:
1.1.1.2 misho 32755: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 32756: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
32757: } else {
32758: zend_free_op free_res;
1.1.1.2 misho 32759: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 32760:
1.1.1.2 misho 32761: PZVAL_UNLOCK(*retval_ptr, &free_res);
32762: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
32763: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 32764: }
1.1.1.2 misho 32765: PZVAL_LOCK(*retval_ptr);
1.1 misho 32766: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 32767: CHECK_EXCEPTION();
32768: ZEND_VM_NEXT_OPCODE();
1.1 misho 32769: }
32770: }
32771:
1.1.1.2 misho 32772: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 32773: {
1.1.1.2 misho 32774: USE_OPLINE
1.1 misho 32775:
1.1.1.2 misho 32776: zval *container;
1.1 misho 32777: zend_free_op free_op2;
1.1.1.2 misho 32778: zval *offset;
1.1 misho 32779:
1.1.1.2 misho 32780: SAVE_OPLINE();
32781: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
32782: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32783:
32784: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
32785: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
32786: zend_error(E_NOTICE, "Trying to get property of non-object");
32787: PZVAL_LOCK(&EG(uninitialized_zval));
32788: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 32789: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32790: } else {
32791: zval *retval;
32792:
32793: if (0) {
32794: MAKE_REAL_ZVAL_PTR(offset);
32795: }
32796:
32797: /* here we are sure we are dealing with an object */
1.1.1.2 misho 32798: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 32799:
1.1.1.2 misho 32800: PZVAL_LOCK(retval);
32801: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 32802:
32803: if (0) {
32804: zval_ptr_dtor(&offset);
32805: } else {
32806: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32807: }
32808: }
32809:
1.1.1.2 misho 32810: CHECK_EXCEPTION();
1.1 misho 32811: ZEND_VM_NEXT_OPCODE();
32812: }
32813:
32814: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32815: {
1.1.1.2 misho 32816: return zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 32817: }
32818:
32819: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32820: {
1.1.1.2 misho 32821: USE_OPLINE
1.1 misho 32822: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32823: zval *property;
1.1 misho 32824: zval **container;
32825:
1.1.1.2 misho 32826: SAVE_OPLINE();
32827: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32828:
1.1 misho 32829: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 32830: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
32831: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 32832: }
32833:
32834: if (0) {
32835: MAKE_REAL_ZVAL_PTR(property);
32836: }
1.1.1.2 misho 32837: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
32838: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32839: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
32840: }
1.1.1.2 misho 32841:
32842: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 32843: if (0) {
32844: zval_ptr_dtor(&property);
32845: } else {
32846: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32847: }
1.1.1.2 misho 32848: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32849: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32850: }
32851:
32852: /* We are going to assign the result by reference */
32853: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 32854: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
32855:
32856: Z_DELREF_PP(retval_ptr);
32857: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
32858: Z_ADDREF_PP(retval_ptr);
32859: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
32860: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 32861: }
32862:
1.1.1.2 misho 32863: CHECK_EXCEPTION();
1.1 misho 32864: ZEND_VM_NEXT_OPCODE();
32865: }
32866:
32867: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32868: {
1.1.1.2 misho 32869: USE_OPLINE
1.1 misho 32870: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32871: zval *property;
32872: zval **container;
32873:
32874: SAVE_OPLINE();
32875: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32876: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32877:
32878: if (0) {
32879: MAKE_REAL_ZVAL_PTR(property);
32880: }
1.1.1.2 misho 32881: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32882: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
32883: }
1.1.1.2 misho 32884: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 32885: if (0) {
32886: zval_ptr_dtor(&property);
32887: } else {
32888: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32889: }
1.1.1.2 misho 32890: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32891: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32892: }
32893:
1.1.1.2 misho 32894: CHECK_EXCEPTION();
1.1 misho 32895: ZEND_VM_NEXT_OPCODE();
32896: }
32897:
32898: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32899: {
1.1.1.2 misho 32900: USE_OPLINE
32901:
32902: zval *container;
32903: zend_free_op free_op2;
32904: zval *offset;
32905:
32906: SAVE_OPLINE();
32907: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
32908: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32909:
32910: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
32911: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
32912: PZVAL_LOCK(&EG(uninitialized_zval));
32913: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
32914: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32915: } else {
32916: zval *retval;
32917:
32918: if (0) {
32919: MAKE_REAL_ZVAL_PTR(offset);
32920: }
32921:
32922: /* here we are sure we are dealing with an object */
32923: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
32924:
32925: PZVAL_LOCK(retval);
32926: AI_SET_PTR(&EX_T(opline->result.var), retval);
32927:
32928: if (0) {
32929: zval_ptr_dtor(&offset);
32930: } else {
32931: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32932: }
32933: }
32934:
32935: CHECK_EXCEPTION();
32936: ZEND_VM_NEXT_OPCODE();
1.1 misho 32937: }
32938:
32939: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32940: {
1.1.1.2 misho 32941: USE_OPLINE
1.1 misho 32942:
1.1.1.2 misho 32943: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 32944: /* Behave like FETCH_OBJ_W */
32945: zend_free_op free_op1, free_op2;
1.1.1.2 misho 32946: zval *property;
32947: zval **container;
32948:
32949: SAVE_OPLINE();
32950: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
32951: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 32952:
32953: if (0) {
32954: MAKE_REAL_ZVAL_PTR(property);
32955: }
1.1.1.2 misho 32956: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32957: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
32958: }
1.1.1.2 misho 32959: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 32960: if (0) {
32961: zval_ptr_dtor(&property);
32962: } else {
32963: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
32964: }
1.1.1.2 misho 32965: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
32966: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 32967: }
32968:
1.1.1.2 misho 32969: CHECK_EXCEPTION();
1.1 misho 32970: ZEND_VM_NEXT_OPCODE();
32971: } else {
1.1.1.2 misho 32972: return zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 32973: }
32974: }
32975:
32976: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
32977: {
1.1.1.2 misho 32978: USE_OPLINE
1.1 misho 32979: zend_free_op free_op1, free_op2, free_res;
1.1.1.2 misho 32980: zval **container;
32981: zval *property;
32982:
32983: SAVE_OPLINE();
32984: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
32985: property = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 32986:
32987: if (IS_CV == IS_CV) {
32988: if (container != &EG(uninitialized_zval_ptr)) {
32989: SEPARATE_ZVAL_IF_NOT_REF(container);
32990: }
32991: }
32992: if (0) {
32993: MAKE_REAL_ZVAL_PTR(property);
32994: }
1.1.1.2 misho 32995: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 32996: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
32997: }
1.1.1.2 misho 32998: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 32999: if (0) {
33000: zval_ptr_dtor(&property);
33001: } else {
33002: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33003: }
1.1.1.2 misho 33004: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
33005: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 33006: }
33007:
1.1.1.2 misho 33008: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
33009: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
33010: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 33011: }
1.1.1.2 misho 33012: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 33013: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 33014: CHECK_EXCEPTION();
1.1 misho 33015: ZEND_VM_NEXT_OPCODE();
33016: }
33017:
33018: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33019: {
1.1.1.2 misho 33020: USE_OPLINE
1.1 misho 33021: zend_free_op free_op2;
1.1.1.2 misho 33022: zval **object_ptr;
33023: zval *property_name;
33024:
33025: SAVE_OPLINE();
33026: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
33027: property_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33028:
33029: if (0) {
33030: MAKE_REAL_ZVAL_PTR(property_name);
33031: }
1.1.1.2 misho 33032: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 33033: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
33034: }
1.1.1.2 misho 33035: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33036: if (0) {
33037: zval_ptr_dtor(&property_name);
33038: } else {
33039: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33040: }
33041:
33042: /* assign_obj has two opcodes! */
1.1.1.2 misho 33043: CHECK_EXCEPTION();
1.1 misho 33044: ZEND_VM_INC_OPCODE();
33045: ZEND_VM_NEXT_OPCODE();
33046: }
33047:
33048: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33049: {
1.1.1.2 misho 33050: USE_OPLINE
1.1 misho 33051:
1.1.1.2 misho 33052: zval **object_ptr;
1.1 misho 33053:
1.1.1.2 misho 33054: SAVE_OPLINE();
33055: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
33056:
33057: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 33058: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
33059: }
33060: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
33061: zend_free_op free_op2;
1.1.1.2 misho 33062: zval *property_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33063:
33064: if (0) {
33065: MAKE_REAL_ZVAL_PTR(property_name);
33066: }
1.1.1.2 misho 33067: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33068: if (0) {
33069: zval_ptr_dtor(&property_name);
33070: } else {
33071: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33072: }
33073: } else {
33074: zend_free_op free_op2, free_op_data1, free_op_data2;
33075: zval *value;
1.1.1.2 misho 33076: zval *dim = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33077: zval **variable_ptr_ptr;
33078:
1.1.1.2 misho 33079: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
1.1 misho 33080: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33081:
1.1.1.2 misho 33082: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
33083: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
33084: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
33085: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
33086: if (RETURN_VALUE_USED(opline)) {
33087: zval *retval;
33088:
33089: ALLOC_ZVAL(retval);
33090: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
33091: INIT_PZVAL(retval);
33092: AI_SET_PTR(&EX_T(opline->result.var), retval);
33093: }
33094: } else if (RETURN_VALUE_USED(opline)) {
33095: PZVAL_LOCK(&EG(uninitialized_zval));
33096: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
33097: }
33098: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
33099: if (IS_TMP_FREE(free_op_data1)) {
33100: zval_dtor(value);
33101: }
33102: if (RETURN_VALUE_USED(opline)) {
33103: PZVAL_LOCK(&EG(uninitialized_zval));
33104: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
33105: }
33106: } else {
33107: if ((opline+1)->op1_type == IS_TMP_VAR) {
33108: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33109: } else if ((opline+1)->op1_type == IS_CONST) {
33110: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33111: } else {
33112: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33113: }
33114: if (RETURN_VALUE_USED(opline)) {
1.1 misho 33115: PZVAL_LOCK(value);
1.1.1.2 misho 33116: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 33117: }
33118: }
33119: FREE_OP_VAR_PTR(free_op_data2);
33120: FREE_OP_IF_VAR(free_op_data1);
33121: }
33122:
33123: /* assign_dim has two opcodes! */
1.1.1.2 misho 33124: CHECK_EXCEPTION();
1.1 misho 33125: ZEND_VM_INC_OPCODE();
33126: ZEND_VM_NEXT_OPCODE();
33127: }
33128:
33129: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33130: {
1.1.1.2 misho 33131: USE_OPLINE
1.1 misho 33132: zend_free_op free_op2;
1.1.1.2 misho 33133: zval *value;
33134: zval **variable_ptr_ptr;
1.1 misho 33135:
1.1.1.2 misho 33136: SAVE_OPLINE();
33137: value = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
33138: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
33139:
33140: if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
33141: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_VAR TSRMLS_CC)) {
33142: if (RETURN_VALUE_USED(opline)) {
33143: zval *retval;
33144:
33145: ALLOC_ZVAL(retval);
33146: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
33147: INIT_PZVAL(retval);
33148: AI_SET_PTR(&EX_T(opline->result.var), retval);
33149: }
33150: } else if (RETURN_VALUE_USED(opline)) {
33151: PZVAL_LOCK(&EG(uninitialized_zval));
33152: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
33153: }
33154: } else if (IS_CV == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
33155: if (0) {
33156: zval_dtor(value);
33157: }
33158: if (RETURN_VALUE_USED(opline)) {
33159: PZVAL_LOCK(&EG(uninitialized_zval));
33160: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
33161: }
33162: } else {
33163: if (IS_VAR == IS_TMP_VAR) {
33164: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33165: } else if (IS_VAR == IS_CONST) {
33166: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33167: } else {
33168: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
33169: }
33170: if (RETURN_VALUE_USED(opline)) {
1.1 misho 33171: PZVAL_LOCK(value);
1.1.1.2 misho 33172: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 33173: }
33174: }
33175:
33176: /* zend_assign_to_variable() always takes care of op2, never free it! */
33177: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33178:
1.1.1.2 misho 33179: CHECK_EXCEPTION();
1.1 misho 33180: ZEND_VM_NEXT_OPCODE();
33181: }
33182:
33183: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33184: {
1.1.1.2 misho 33185: USE_OPLINE
1.1 misho 33186: zend_free_op free_op2;
33187: zval **variable_ptr_ptr;
1.1.1.2 misho 33188: zval **value_ptr_ptr;
33189:
33190: SAVE_OPLINE();
33191: value_ptr_ptr = _get_zval_ptr_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33192:
33193: if (IS_VAR == IS_VAR &&
33194: value_ptr_ptr &&
33195: !Z_ISREF_PP(value_ptr_ptr) &&
33196: opline->extended_value == ZEND_RETURNS_FUNCTION &&
1.1.1.2 misho 33197: !EX_T(opline->op2.var).var.fcall_returned_reference) {
1.1 misho 33198: if (free_op2.var == NULL) {
33199: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
33200: }
33201: zend_error(E_STRICT, "Only variables should be assigned by reference");
33202: if (UNEXPECTED(EG(exception) != NULL)) {
33203: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 33204: HANDLE_EXCEPTION();
1.1 misho 33205: }
33206: return ZEND_ASSIGN_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
33207: } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
33208: PZVAL_LOCK(*value_ptr_ptr);
33209: }
1.1.1.2 misho 33210: if (IS_CV == IS_VAR && UNEXPECTED(EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr)) {
1.1 misho 33211: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
33212: }
33213:
1.1.1.2 misho 33214: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
33215: if ((IS_VAR == IS_VAR && UNEXPECTED(value_ptr_ptr == NULL)) ||
33216: (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL))) {
1.1 misho 33217: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
33218: }
33219: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
33220:
33221: if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
33222: Z_DELREF_PP(variable_ptr_ptr);
33223: }
33224:
1.1.1.2 misho 33225: if (RETURN_VALUE_USED(opline)) {
1.1 misho 33226: PZVAL_LOCK(*variable_ptr_ptr);
1.1.1.2 misho 33227: AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr);
1.1 misho 33228: }
33229:
33230: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33231:
1.1.1.2 misho 33232: CHECK_EXCEPTION();
1.1 misho 33233: ZEND_VM_NEXT_OPCODE();
33234: }
33235:
33236: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33237: {
1.1.1.2 misho 33238: USE_OPLINE
1.1 misho 33239: zval *function_name;
33240: char *function_name_strval;
33241: int function_name_strlen;
33242: zend_free_op free_op2;
33243:
1.1.1.2 misho 33244: SAVE_OPLINE();
1.1 misho 33245: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
33246:
1.1.1.2 misho 33247: function_name = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33248:
1.1.1.2 misho 33249: if (IS_VAR != IS_CONST &&
33250: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 33251: zend_error_noreturn(E_ERROR, "Method name must be a string");
33252: }
33253:
33254: function_name_strval = Z_STRVAL_P(function_name);
33255: function_name_strlen = Z_STRLEN_P(function_name);
33256:
1.1.1.2 misho 33257: EX(object) = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 33258:
1.1.1.2 misho 33259: if (EXPECTED(EX(object) != NULL) &&
33260: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
33261: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 33262:
1.1.1.2 misho 33263: if (IS_VAR != IS_CONST ||
33264: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
33265: zval *object = EX(object);
33266:
33267: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
33268: zend_error_noreturn(E_ERROR, "Object does not support method calls");
33269: }
33270:
33271: /* First, locate the function. */
33272: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_VAR == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
33273: if (UNEXPECTED(EX(fbc) == NULL)) {
33274: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
33275: }
33276: if (IS_VAR == IS_CONST &&
33277: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
33278: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
33279: EXPECTED(EX(object) == object)) {
33280: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
33281: }
1.1 misho 33282: }
33283: } else {
33284: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
33285: }
33286:
33287: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
33288: EX(object) = NULL;
33289: } else {
33290: if (!PZVAL_IS_REF(EX(object))) {
33291: Z_ADDREF_P(EX(object)); /* For $this pointer */
33292: } else {
33293: zval *this_ptr;
33294: ALLOC_ZVAL(this_ptr);
33295: INIT_PZVAL_COPY(this_ptr, EX(object));
33296: zval_copy_ctor(this_ptr);
33297: EX(object) = this_ptr;
33298: }
33299: }
33300:
33301: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33302:
1.1.1.2 misho 33303: CHECK_EXCEPTION();
1.1 misho 33304: ZEND_VM_NEXT_OPCODE();
33305: }
33306:
33307: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33308: {
1.1.1.2 misho 33309: USE_OPLINE
1.1 misho 33310: zend_free_op free_op2;
33311:
1.1.1.2 misho 33312: SAVE_OPLINE();
1.1 misho 33313: if (IS_CV==IS_VAR) {
1.1.1.2 misho 33314: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 33315: }
1.1.1.2 misho 33316: is_equal_function(&EX_T(opline->result.var).tmp_var,
33317: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
33318: _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC) TSRMLS_CC);
1.1 misho 33319:
33320: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1.1.2 misho 33321: CHECK_EXCEPTION();
1.1 misho 33322: ZEND_VM_NEXT_OPCODE();
33323: }
33324:
33325: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33326: {
1.1.1.2 misho 33327: USE_OPLINE
33328:
1.1 misho 33329: zval *expr_ptr;
33330:
1.1.1.2 misho 33331: SAVE_OPLINE();
33332: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
33333: zval **expr_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 33334:
1.1.1.2 misho 33335: if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
33336: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
33337: }
33338: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 33339: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 33340: Z_ADDREF_P(expr_ptr);
1.1 misho 33341: } else {
1.1.1.2 misho 33342: expr_ptr=_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
33343: if (0) { /* temporary variable */
33344: zval *new_expr;
1.1 misho 33345:
1.1.1.2 misho 33346: ALLOC_ZVAL(new_expr);
33347: INIT_PZVAL_COPY(new_expr, expr_ptr);
33348: expr_ptr = new_expr;
33349: } else if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 33350: zval *new_expr;
33351:
33352: ALLOC_ZVAL(new_expr);
33353: INIT_PZVAL_COPY(new_expr, expr_ptr);
33354: expr_ptr = new_expr;
33355: zendi_zval_copy_ctor(*expr_ptr);
33356: } else {
33357: Z_ADDREF_P(expr_ptr);
33358: }
33359: }
1.1.1.2 misho 33360:
33361: if (IS_VAR != IS_UNUSED) {
33362: zend_free_op free_op2;
33363: zval *offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
33364: ulong hval;
33365:
1.1 misho 33366: switch (Z_TYPE_P(offset)) {
33367: case IS_DOUBLE:
1.1.1.2 misho 33368: hval = zend_dval_to_lval(Z_DVAL_P(offset));
33369: goto num_index;
1.1 misho 33370: case IS_LONG:
33371: case IS_BOOL:
1.1.1.2 misho 33372: hval = Z_LVAL_P(offset);
33373: num_index:
33374: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 33375: break;
33376: case IS_STRING:
1.1.1.2 misho 33377: if (IS_VAR == IS_CONST) {
33378: hval = Z_HASH_P(offset);
33379: } else {
33380: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
33381: if (IS_INTERNED(Z_STRVAL_P(offset))) {
33382: hval = INTERNED_HASH(Z_STRVAL_P(offset));
33383: } else {
33384: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
33385: }
33386: }
33387: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 33388: break;
33389: case IS_NULL:
1.1.1.2 misho 33390: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 33391: break;
33392: default:
33393: zend_error(E_WARNING, "Illegal offset type");
33394: zval_ptr_dtor(&expr_ptr);
33395: /* do nothing */
33396: break;
33397: }
33398: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33399: } else {
1.1.1.2 misho 33400: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 33401: }
1.1.1.2 misho 33402: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
1.1 misho 33403:
33404: } else {
33405:
33406: }
1.1.1.2 misho 33407: CHECK_EXCEPTION();
1.1 misho 33408: ZEND_VM_NEXT_OPCODE();
33409: }
33410:
33411: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33412: {
1.1.1.2 misho 33413: USE_OPLINE
1.1 misho 33414:
1.1.1.2 misho 33415: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 33416: if (IS_CV == IS_UNUSED) {
33417: ZEND_VM_NEXT_OPCODE();
33418: #if 0 || IS_CV != IS_UNUSED
33419: } else {
33420: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
33421: #endif
33422: }
33423: }
33424:
1.1.1.2 misho 33425: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33426: {
33427: USE_OPLINE
33428: zval tmp, *varname;
33429: HashTable *target_symbol_table;
33430:
33431:
33432: SAVE_OPLINE();
33433: if (IS_CV == IS_CV &&
33434: IS_VAR == IS_UNUSED &&
33435: (opline->extended_value & ZEND_QUICK_SET)) {
33436: if (EG(active_symbol_table)) {
33437: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
33438:
33439: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
33440: EX_CV(opline->op1.var) = NULL;
33441: } else if (EX_CV(opline->op1.var)) {
33442: zval_ptr_dtor(EX_CV(opline->op1.var));
33443: EX_CV(opline->op1.var) = NULL;
33444: }
33445: CHECK_EXCEPTION();
33446: ZEND_VM_NEXT_OPCODE();
33447: }
33448:
33449: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
33450:
33451: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
33452: ZVAL_COPY_VALUE(&tmp, varname);
33453: zval_copy_ctor(&tmp);
33454: convert_to_string(&tmp);
33455: varname = &tmp;
33456: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
33457: Z_ADDREF_P(varname);
33458: }
33459:
33460: if (IS_VAR != IS_UNUSED) {
33461: zend_class_entry *ce;
33462:
33463: if (IS_VAR == IS_CONST) {
33464: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
33465: ce = CACHED_PTR(opline->op2.literal->cache_slot);
33466: } else {
33467: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 33468: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 33469: if (IS_CV != IS_CONST && varname == &tmp) {
33470: zval_dtor(&tmp);
33471: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
33472: zval_ptr_dtor(&varname);
33473: }
33474:
1.1.1.4 misho 33475: HANDLE_EXCEPTION();
33476: }
33477: if (UNEXPECTED(ce == NULL)) {
33478: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 33479: }
33480: CACHE_PTR(opline->op2.literal->cache_slot, ce);
33481: }
33482: } else {
33483: ce = EX_T(opline->op2.var).class_entry;
33484: }
33485: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
33486: } else {
33487: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
33488:
33489: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
33490: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
33491: }
33492:
33493: if (IS_CV != IS_CONST && varname == &tmp) {
33494: zval_dtor(&tmp);
33495: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
33496: zval_ptr_dtor(&varname);
33497: }
33498:
33499: CHECK_EXCEPTION();
33500: ZEND_VM_NEXT_OPCODE();
33501: }
33502:
1.1 misho 33503: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33504: {
1.1.1.2 misho 33505: USE_OPLINE
1.1 misho 33506: zend_free_op free_op2;
1.1.1.2 misho 33507: zval **container;
1.1 misho 33508: zval *offset;
1.1.1.2 misho 33509: ulong hval;
1.1 misho 33510:
1.1.1.2 misho 33511: SAVE_OPLINE();
33512: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 33513: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
33514: SEPARATE_ZVAL_IF_NOT_REF(container);
33515: }
1.1.1.2 misho 33516: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33517:
33518: if (IS_CV != IS_VAR || container) {
33519: switch (Z_TYPE_PP(container)) {
33520: case IS_ARRAY: {
33521: HashTable *ht = Z_ARRVAL_PP(container);
33522:
33523: switch (Z_TYPE_P(offset)) {
33524: case IS_DOUBLE:
1.1.1.2 misho 33525: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 33526: zend_hash_index_del(ht, hval);
33527: break;
1.1 misho 33528: case IS_RESOURCE:
33529: case IS_BOOL:
33530: case IS_LONG:
1.1.1.2 misho 33531: hval = Z_LVAL_P(offset);
33532: zend_hash_index_del(ht, hval);
1.1 misho 33533: break;
33534: case IS_STRING:
33535: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
33536: Z_ADDREF_P(offset);
33537: }
1.1.1.2 misho 33538: if (IS_VAR == IS_CONST) {
33539: hval = Z_HASH_P(offset);
33540: } else {
33541: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
33542: if (IS_INTERNED(Z_STRVAL_P(offset))) {
33543: hval = INTERNED_HASH(Z_STRVAL_P(offset));
33544: } else {
33545: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 33546: }
33547: }
1.1.1.2 misho 33548: if (ht == &EG(symbol_table)) {
33549: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
33550: } else {
33551: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
33552: }
33553: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
33554: zval_ptr_dtor(&offset);
33555: }
33556: break;
33557: num_index_dim:
33558: zend_hash_index_del(ht, hval);
1.1 misho 33559: if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
33560: zval_ptr_dtor(&offset);
33561: }
33562: break;
33563: case IS_NULL:
33564: zend_hash_del(ht, "", sizeof(""));
33565: break;
33566: default:
33567: zend_error(E_WARNING, "Illegal offset type in unset");
33568: break;
33569: }
33570: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33571: break;
33572: }
33573: case IS_OBJECT:
1.1.1.2 misho 33574: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 33575: zend_error_noreturn(E_ERROR, "Cannot use object as array");
33576: }
33577: if (0) {
33578: MAKE_REAL_ZVAL_PTR(offset);
33579: }
33580: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
33581: if (0) {
33582: zval_ptr_dtor(&offset);
33583: } else {
33584: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33585: }
33586: break;
33587: case IS_STRING:
33588: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
33589: ZEND_VM_CONTINUE(); /* bailed out before */
33590: default:
33591: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33592: break;
33593: }
1.1.1.2 misho 33594: } else {
33595: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33596: }
33597:
33598: CHECK_EXCEPTION();
33599: ZEND_VM_NEXT_OPCODE();
33600: }
33601:
33602: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33603: {
33604: USE_OPLINE
33605: zend_free_op free_op2;
33606: zval **container;
33607: zval *offset;
33608:
33609: SAVE_OPLINE();
33610: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
33611: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
33612:
33613: if (IS_CV != IS_VAR || container) {
33614: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
33615: SEPARATE_ZVAL_IF_NOT_REF(container);
33616: }
33617: if (Z_TYPE_PP(container) == IS_OBJECT) {
33618: if (0) {
33619: MAKE_REAL_ZVAL_PTR(offset);
33620: }
33621: if (Z_OBJ_HT_P(*container)->unset_property) {
33622: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
33623: } else {
33624: zend_error(E_NOTICE, "Trying to unset property of non-object");
33625: }
33626: if (0) {
33627: zval_ptr_dtor(&offset);
33628: } else {
33629: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33630: }
33631: } else {
33632: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33633: }
33634: } else {
33635: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33636: }
33637:
33638: CHECK_EXCEPTION();
33639: ZEND_VM_NEXT_OPCODE();
33640: }
33641:
33642: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33643: {
33644: USE_OPLINE
33645: zval **value;
33646: zend_bool isset = 1;
33647:
33648: SAVE_OPLINE();
33649: if (IS_CV == IS_CV &&
33650: IS_VAR == IS_UNUSED &&
33651: (opline->extended_value & ZEND_QUICK_SET)) {
33652: if (EX_CV(opline->op1.var)) {
33653: value = EX_CV(opline->op1.var);
33654: } else if (EG(active_symbol_table)) {
33655: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
33656:
33657: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
33658: isset = 0;
33659: }
33660: } else {
33661: isset = 0;
33662: }
33663: } else {
33664: HashTable *target_symbol_table;
33665:
33666: zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
33667:
33668: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
33669: ZVAL_COPY_VALUE(&tmp, varname);
33670: zval_copy_ctor(&tmp);
33671: convert_to_string(&tmp);
33672: varname = &tmp;
33673: }
33674:
33675: if (IS_VAR != IS_UNUSED) {
33676: zend_class_entry *ce;
33677:
33678: if (IS_VAR == IS_CONST) {
33679: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
33680: ce = CACHED_PTR(opline->op2.literal->cache_slot);
33681: } else {
33682: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
33683: if (UNEXPECTED(ce == NULL)) {
33684: CHECK_EXCEPTION();
33685: ZEND_VM_NEXT_OPCODE();
33686: }
33687: CACHE_PTR(opline->op2.literal->cache_slot, ce);
33688: }
33689: } else {
33690: ce = EX_T(opline->op2.var).class_entry;
33691: }
33692: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
33693: if (!value) {
33694: isset = 0;
33695: }
33696: } else {
33697: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
33698: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
33699: isset = 0;
33700: }
33701: }
1.1 misho 33702:
1.1.1.2 misho 33703: if (IS_CV != IS_CONST && varname == &tmp) {
33704: zval_dtor(&tmp);
33705: }
1.1 misho 33706:
1.1.1.2 misho 33707: }
1.1 misho 33708:
1.1.1.2 misho 33709: if (opline->extended_value & ZEND_ISSET) {
33710: if (isset && Z_TYPE_PP(value) != IS_NULL) {
33711: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
33712: } else {
33713: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
1.1 misho 33714: }
1.1.1.2 misho 33715: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
33716: if (!isset || !i_zend_is_true(*value)) {
33717: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
1.1 misho 33718: } else {
1.1.1.2 misho 33719: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
1.1 misho 33720: }
33721: }
33722:
1.1.1.2 misho 33723: CHECK_EXCEPTION();
1.1 misho 33724: ZEND_VM_NEXT_OPCODE();
33725: }
33726:
33727: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
33728: {
1.1.1.2 misho 33729: USE_OPLINE
33730: zend_free_op free_op2;
33731: zval **container;
1.1 misho 33732: zval **value = NULL;
33733: int result = 0;
1.1.1.2 misho 33734: ulong hval;
33735: zval *offset;
1.1 misho 33736:
1.1.1.2 misho 33737: SAVE_OPLINE();
33738: container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 33739:
1.1.1.2 misho 33740: offset = _get_zval_ptr_var(opline->op2.var, EX_Ts(), &free_op2 TSRMLS_CC);
1.1 misho 33741:
1.1.1.2 misho 33742: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
33743: HashTable *ht;
33744: int isset = 0;
1.1 misho 33745:
1.1.1.2 misho 33746: ht = Z_ARRVAL_PP(container);
33747:
33748: switch (Z_TYPE_P(offset)) {
33749: case IS_DOUBLE:
33750: hval = zend_dval_to_lval(Z_DVAL_P(offset));
33751: goto num_index_prop;
33752: case IS_RESOURCE:
33753: case IS_BOOL:
33754: case IS_LONG:
33755: hval = Z_LVAL_P(offset);
33756: num_index_prop:
33757: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
33758: isset = 1;
33759: }
33760: break;
33761: case IS_STRING:
33762: if (IS_VAR == IS_CONST) {
33763: hval = Z_HASH_P(offset);
33764: } else {
33765: if (!prop_dim) {
33766: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 33767: }
1.1.1.2 misho 33768: if (IS_INTERNED(Z_STRVAL_P(offset))) {
33769: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 33770: } else {
1.1.1.2 misho 33771: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 33772: }
1.1.1.2 misho 33773: }
33774: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
33775: isset = 1;
33776: }
33777: break;
33778: case IS_NULL:
33779: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
33780: isset = 1;
33781: }
33782: break;
33783: default:
33784: zend_error(E_WARNING, "Illegal offset type in isset or empty");
33785: break;
33786: }
33787:
33788: if (opline->extended_value & ZEND_ISSET) {
33789: if (isset && Z_TYPE_PP(value) == IS_NULL) {
33790: result = 0;
33791: } else {
33792: result = isset;
1.1 misho 33793: }
1.1.1.2 misho 33794: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
33795: if (!isset || !i_zend_is_true(*value)) {
33796: result = 0;
33797: } else {
33798: result = 1;
1.1 misho 33799: }
1.1.1.2 misho 33800: }
33801: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33802: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
33803: if (0) {
33804: MAKE_REAL_ZVAL_PTR(offset);
33805: }
33806: if (prop_dim) {
33807: if (Z_OBJ_HT_P(*container)->has_property) {
33808: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33809: } else {
1.1.1.2 misho 33810: zend_error(E_NOTICE, "Trying to check property of non-object");
33811: result = 0;
1.1 misho 33812: }
1.1.1.2 misho 33813: } else {
33814: if (Z_OBJ_HT_P(*container)->has_dimension) {
33815: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
1.1 misho 33816: } else {
1.1.1.2 misho 33817: zend_error(E_NOTICE, "Trying to check element of non-array");
33818: result = 0;
1.1 misho 33819: }
1.1.1.2 misho 33820: }
33821: if (0) {
33822: zval_ptr_dtor(&offset);
33823: } else {
33824: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33825: }
33826: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
33827: zval tmp;
1.1 misho 33828:
1.1.1.2 misho 33829: if (Z_TYPE_P(offset) != IS_LONG) {
33830: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
33831: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
33832: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
33833: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 33834: zval_copy_ctor(&tmp);
33835: convert_to_long(&tmp);
33836: offset = &tmp;
1.1.1.2 misho 33837: } else {
33838: /* can not be converted to proper offset, return "not set" */
33839: result = 0;
1.1 misho 33840: }
1.1.1.2 misho 33841: }
33842: if (Z_TYPE_P(offset) == IS_LONG) {
33843: if (opline->extended_value & ZEND_ISSET) {
33844: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
33845: result = 1;
33846: }
33847: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
33848: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
33849: result = 1;
1.1 misho 33850: }
33851: }
33852: }
1.1.1.2 misho 33853: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
33854: } else {
33855: if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
1.1 misho 33856: }
33857:
1.1.1.2 misho 33858: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
33859: if (opline->extended_value & ZEND_ISSET) {
33860: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
33861: } else {
33862: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 33863: }
33864:
1.1.1.2 misho 33865: CHECK_EXCEPTION();
1.1 misho 33866: ZEND_VM_NEXT_OPCODE();
33867: }
33868:
33869: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33870: {
33871: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
33872: }
33873:
33874: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
33875: {
33876: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_VAR(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
33877: }
33878:
33879: 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)
33880: {
1.1.1.2 misho 33881: USE_OPLINE
1.1 misho 33882: zend_free_op free_op_data1;
1.1.1.2 misho 33883: zval **object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 33884: zval *object;
33885: zval *property = NULL;
1.1.1.2 misho 33886: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 33887: int have_get_ptr = 0;
33888:
1.1.1.2 misho 33889: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 33890: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
33891: }
33892:
33893: make_real_object(object_ptr TSRMLS_CC);
33894: object = *object_ptr;
33895:
1.1.1.2 misho 33896: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 33897: zend_error(E_WARNING, "Attempt to assign property of non-object");
33898:
33899: FREE_OP(free_op_data1);
33900:
1.1.1.2 misho 33901: if (RETURN_VALUE_USED(opline)) {
33902: PZVAL_LOCK(&EG(uninitialized_zval));
33903: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
33904: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 33905: }
33906: } else {
33907: /* here we are sure we are dealing with an object */
33908: if (0) {
33909: MAKE_REAL_ZVAL_PTR(property);
33910: }
33911:
33912: /* here property is a string */
33913: if (opline->extended_value == ZEND_ASSIGN_OBJ
33914: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 33915: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33916: if (zptr != NULL) { /* NULL means no success in getting PTR */
33917: SEPARATE_ZVAL_IF_NOT_REF(zptr);
33918:
33919: have_get_ptr = 1;
33920: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 33921: if (RETURN_VALUE_USED(opline)) {
1.1 misho 33922: PZVAL_LOCK(*zptr);
1.1.1.2 misho 33923: EX_T(opline->result.var).var.ptr = *zptr;
33924: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 33925: }
33926: }
33927: }
33928:
33929: if (!have_get_ptr) {
33930: zval *z = NULL;
33931:
33932: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
33933: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 33934: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33935: }
33936: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
33937: if (Z_OBJ_HT_P(object)->read_dimension) {
33938: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
33939: }
33940: }
33941: if (z) {
33942: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
33943: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
33944:
33945: if (Z_REFCOUNT_P(z) == 0) {
33946: GC_REMOVE_ZVAL_FROM_BUFFER(z);
33947: zval_dtor(z);
33948: FREE_ZVAL(z);
33949: }
33950: z = value;
33951: }
33952: Z_ADDREF_P(z);
33953: SEPARATE_ZVAL_IF_NOT_REF(&z);
33954: binary_op(z, z, value TSRMLS_CC);
33955: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 33956: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 33957: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
33958: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
33959: }
1.1.1.2 misho 33960: if (RETURN_VALUE_USED(opline)) {
1.1 misho 33961: PZVAL_LOCK(z);
1.1.1.2 misho 33962: EX_T(opline->result.var).var.ptr = z;
33963: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 33964: }
33965: zval_ptr_dtor(&z);
33966: } else {
33967: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 33968: if (RETURN_VALUE_USED(opline)) {
33969: PZVAL_LOCK(&EG(uninitialized_zval));
33970: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
33971: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 33972: }
33973: }
33974: }
33975:
33976: if (0) {
33977: zval_ptr_dtor(&property);
33978: } else {
33979:
33980: }
33981: FREE_OP(free_op_data1);
33982: }
33983:
33984: /* assign_obj has two opcodes! */
1.1.1.2 misho 33985: CHECK_EXCEPTION();
1.1 misho 33986: ZEND_VM_INC_OPCODE();
33987: ZEND_VM_NEXT_OPCODE();
33988: }
33989:
33990: 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)
33991: {
1.1.1.2 misho 33992: USE_OPLINE
1.1 misho 33993: zend_free_op free_op_data2, free_op_data1;
33994: zval **var_ptr;
33995: zval *value;
33996:
1.1.1.2 misho 33997: SAVE_OPLINE();
1.1 misho 33998: switch (opline->extended_value) {
33999: case ZEND_ASSIGN_OBJ:
34000: return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34001: break;
34002: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 34003: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 34004:
1.1.1.2 misho 34005: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 34006: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 34007: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 34008: if (IS_CV == IS_VAR && !0) {
34009: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
34010: }
34011: return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34012: } else {
34013: zval *dim = NULL;
34014:
1.1.1.2 misho 34015: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
34016: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
34017: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 34018: }
34019: }
34020: break;
34021: default:
34022: value = NULL;
1.1.1.2 misho 34023: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 34024: /* do nothing */
34025: break;
34026: }
34027:
1.1.1.2 misho 34028: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 34029: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
34030: }
34031:
1.1.1.2 misho 34032: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
34033: if (RETURN_VALUE_USED(opline)) {
34034: PZVAL_LOCK(&EG(uninitialized_zval));
34035: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 34036: }
34037:
34038:
1.1.1.2 misho 34039: CHECK_EXCEPTION();
34040: if (opline->extended_value == ZEND_ASSIGN_DIM) {
34041: ZEND_VM_INC_OPCODE();
34042: }
1.1 misho 34043: ZEND_VM_NEXT_OPCODE();
34044: }
34045:
34046: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
34047:
1.1.1.2 misho 34048: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
34049: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 34050: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
34051: /* proxy object */
34052: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
34053: Z_ADDREF_P(objval);
34054: binary_op(objval, objval, value TSRMLS_CC);
34055: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
34056: zval_ptr_dtor(&objval);
34057: } else {
34058: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
34059: }
34060:
1.1.1.2 misho 34061: if (RETURN_VALUE_USED(opline)) {
1.1 misho 34062: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 34063: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 34064: }
34065:
34066: if (opline->extended_value == ZEND_ASSIGN_DIM) {
34067: FREE_OP(free_op_data1);
34068: FREE_OP_VAR_PTR(free_op_data2);
34069:
1.1.1.2 misho 34070: CHECK_EXCEPTION();
34071: ZEND_VM_INC_OPCODE();
34072: } else {
34073:
34074: CHECK_EXCEPTION();
34075: }
1.1 misho 34076: ZEND_VM_NEXT_OPCODE();
34077: }
34078:
34079: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34080: {
34081: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34082: }
34083:
34084: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34085: {
34086: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34087: }
34088:
34089: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34090: {
34091: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34092: }
34093:
34094: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34095: {
34096: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34097: }
34098:
34099: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34100: {
34101: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34102: }
34103:
34104: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34105: {
34106: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34107: }
34108:
34109: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34110: {
34111: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34112: }
34113:
34114: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34115: {
34116: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34117: }
34118:
34119: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34120: {
34121: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34122: }
34123:
34124: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34125: {
34126: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34127: }
34128:
34129: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34130: {
34131: return zend_binary_assign_op_helper_SPEC_CV_UNUSED(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34132: }
34133:
1.1.1.2 misho 34134: static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type, ZEND_OPCODE_HANDLER_ARGS)
34135: {
34136: USE_OPLINE
34137: zend_free_op free_op1;
34138: zval *varname;
34139: zval **retval;
34140: zval tmp_varname;
34141: HashTable *target_symbol_table;
34142: ulong hash_value;
34143:
34144: SAVE_OPLINE();
34145: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
34146:
34147: if (IS_CV != IS_CONST && UNEXPECTED(Z_TYPE_P(varname) != IS_STRING)) {
34148: ZVAL_COPY_VALUE(&tmp_varname, varname);
34149: zval_copy_ctor(&tmp_varname);
34150: Z_SET_REFCOUNT(tmp_varname, 1);
34151: Z_UNSET_ISREF(tmp_varname);
34152: convert_to_string(&tmp_varname);
34153: varname = &tmp_varname;
34154: }
34155:
34156: if (IS_UNUSED != IS_UNUSED) {
34157: zend_class_entry *ce;
34158:
34159: if (IS_UNUSED == IS_CONST) {
34160: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
34161: ce = CACHED_PTR(opline->op2.literal->cache_slot);
34162: } else {
34163: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
34164: if (UNEXPECTED(ce == NULL)) {
34165: if (IS_CV != IS_CONST && varname == &tmp_varname) {
34166: zval_dtor(&tmp_varname);
34167: }
34168:
34169: CHECK_EXCEPTION();
34170: ZEND_VM_NEXT_OPCODE();
34171: }
34172: CACHE_PTR(opline->op2.literal->cache_slot, ce);
34173: }
34174: } else {
34175: ce = EX_T(opline->op2.var).class_entry;
34176: }
34177: retval = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 0, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
34178:
34179: } else {
34180: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
34181: /*
34182: if (!target_symbol_table) {
34183: CHECK_EXCEPTION();
34184: ZEND_VM_NEXT_OPCODE();
34185: }
34186: */
34187: if (IS_CV == IS_CONST) {
34188: hash_value = Z_HASH_P(varname);
34189: } else if (IS_INTERNED(Z_STRVAL_P(varname))) {
34190: hash_value = INTERNED_HASH(Z_STRVAL_P(varname));
34191: } else {
34192: hash_value = zend_hash_func(Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1);
34193: }
34194:
34195: if (zend_hash_quick_find(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, (void **) &retval) == FAILURE) {
34196: switch (type) {
34197: case BP_VAR_R:
34198: case BP_VAR_UNSET:
34199: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
34200: /* break missing intentionally */
34201: case BP_VAR_IS:
34202: retval = &EG(uninitialized_zval_ptr);
34203: break;
34204: case BP_VAR_RW:
34205: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
34206: /* break missing intentionally */
34207: case BP_VAR_W:
34208: Z_ADDREF_P(&EG(uninitialized_zval));
34209: zend_hash_quick_update(target_symbol_table, Z_STRVAL_P(varname), Z_STRLEN_P(varname)+1, hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **) &retval);
34210: break;
34211: EMPTY_SWITCH_DEFAULT_CASE()
34212: }
34213: }
34214: switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) {
34215: case ZEND_FETCH_GLOBAL:
34216: if (IS_CV != IS_TMP_VAR) {
34217:
34218: }
34219: break;
34220: case ZEND_FETCH_LOCAL:
34221:
34222: break;
34223: case ZEND_FETCH_STATIC:
34224: zval_update_constant(retval, (void*) 1 TSRMLS_CC);
34225: break;
34226: case ZEND_FETCH_GLOBAL_LOCK:
34227: if (IS_CV == IS_VAR && !free_op1.var) {
34228: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
34229: }
34230: break;
34231: }
34232: }
34233:
34234:
34235: if (IS_CV != IS_CONST && varname == &tmp_varname) {
34236: zval_dtor(&tmp_varname);
34237: }
34238: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
34239: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
34240: }
34241: PZVAL_LOCK(*retval);
34242: switch (type) {
34243: case BP_VAR_R:
34244: case BP_VAR_IS:
34245: AI_SET_PTR(&EX_T(opline->result.var), *retval);
34246: break;
34247: case BP_VAR_UNSET: {
34248: zend_free_op free_res;
34249:
34250: PZVAL_UNLOCK(*retval, &free_res);
34251: if (retval != &EG(uninitialized_zval_ptr)) {
34252: SEPARATE_ZVAL_IF_NOT_REF(retval);
34253: }
34254: PZVAL_LOCK(*retval);
34255: FREE_OP_VAR_PTR(free_res);
34256: }
34257: /* break missing intentionally */
34258: default:
34259: EX_T(opline->result.var).var.ptr_ptr = retval;
34260: break;
34261: }
34262: CHECK_EXCEPTION();
34263: ZEND_VM_NEXT_OPCODE();
34264: }
34265:
34266: static int ZEND_FASTCALL ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34267: {
34268: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34269: }
34270:
34271: static int ZEND_FASTCALL ZEND_FETCH_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34272: {
34273: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_W, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34274: }
34275:
34276: static int ZEND_FASTCALL ZEND_FETCH_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34277: {
34278: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_RW, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34279: }
34280:
34281: static int ZEND_FASTCALL ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34282: {
34283: USE_OPLINE
34284:
34285: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))?BP_VAR_W:BP_VAR_R, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34286: }
34287:
34288: static int ZEND_FASTCALL ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34289: {
34290: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_UNSET, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34291: }
34292:
34293: static int ZEND_FASTCALL ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34294: {
34295: return zend_fetch_var_address_helper_SPEC_CV_UNUSED(BP_VAR_IS, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34296: }
34297:
1.1 misho 34298: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34299: {
1.1.1.2 misho 34300: USE_OPLINE
1.1 misho 34301: zend_free_op free_op1;
1.1.1.2 misho 34302: zval **container;
34303:
34304: SAVE_OPLINE();
34305: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 34306:
1.1.1.2 misho 34307: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 34308: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
34309: }
1.1.1.2 misho 34310: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
1.1 misho 34311:
1.1.1.2 misho 34312: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
34313: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 34314: }
34315:
34316: /* We are going to assign the result by reference */
1.1.1.2 misho 34317: if (UNEXPECTED(opline->extended_value != 0)) {
34318: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
34319:
34320: if (retval_ptr) {
34321: Z_DELREF_PP(retval_ptr);
34322: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
34323: Z_ADDREF_PP(retval_ptr);
34324: }
1.1 misho 34325: }
34326:
1.1.1.2 misho 34327: CHECK_EXCEPTION();
1.1 misho 34328: ZEND_VM_NEXT_OPCODE();
34329: }
34330:
34331: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34332: {
1.1.1.2 misho 34333: USE_OPLINE
1.1 misho 34334: zend_free_op free_op1;
1.1.1.2 misho 34335: zval **container;
1.1 misho 34336:
1.1.1.2 misho 34337: SAVE_OPLINE();
34338: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
34339:
34340: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 34341: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
34342: }
1.1.1.2 misho 34343: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
1.1 misho 34344:
1.1.1.2 misho 34345: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
34346: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 34347: }
34348:
1.1.1.2 misho 34349: CHECK_EXCEPTION();
1.1 misho 34350: ZEND_VM_NEXT_OPCODE();
34351: }
34352:
34353: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34354: {
1.1.1.2 misho 34355: USE_OPLINE
1.1 misho 34356: zend_free_op free_op1;
34357:
1.1.1.2 misho 34358: SAVE_OPLINE();
34359:
34360: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 34361: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
! 34362:
1.1.1.2 misho 34363: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 34364: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
34365: }
1.1.1.2 misho 34366: zend_fetch_dimension_address(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
34367: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
34368: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 34369: }
1.1.1.5 ! misho 34370:
! 34371:
1.1 misho 34372: } else {
1.1.1.5 ! misho 34373: zval *container;
! 34374:
1.1 misho 34375: if (IS_UNUSED == IS_UNUSED) {
34376: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
34377: }
1.1.1.5 ! misho 34378: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 34379: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_R TSRMLS_CC);
1.1 misho 34380:
34381:
1.1.1.5 ! misho 34382: }
1.1.1.2 misho 34383: CHECK_EXCEPTION();
1.1 misho 34384: ZEND_VM_NEXT_OPCODE();
34385: }
34386:
34387: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34388: {
1.1.1.2 misho 34389: USE_OPLINE
1.1 misho 34390:
1.1.1.2 misho 34391: zval **object_ptr;
1.1 misho 34392:
1.1.1.2 misho 34393: SAVE_OPLINE();
34394: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
34395:
34396: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 34397: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
34398: }
34399: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
34400:
34401: zval *property_name = NULL;
34402:
34403: if (0) {
34404: MAKE_REAL_ZVAL_PTR(property_name);
34405: }
1.1.1.2 misho 34406: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_UNUSED == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 34407: if (0) {
34408: zval_ptr_dtor(&property_name);
34409: } else {
34410:
34411: }
34412: } else {
34413: zend_free_op free_op_data1, free_op_data2;
34414: zval *value;
34415: zval *dim = NULL;
34416: zval **variable_ptr_ptr;
34417:
1.1.1.2 misho 34418: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W TSRMLS_CC);
34419:
34420: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
34421: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
34422: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
34423: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
34424: if (RETURN_VALUE_USED(opline)) {
34425: zval *retval;
1.1 misho 34426:
1.1.1.2 misho 34427: ALLOC_ZVAL(retval);
34428: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
34429: INIT_PZVAL(retval);
34430: AI_SET_PTR(&EX_T(opline->result.var), retval);
34431: }
34432: } else if (RETURN_VALUE_USED(opline)) {
34433: PZVAL_LOCK(&EG(uninitialized_zval));
34434: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
34435: }
34436: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
34437: if (IS_TMP_FREE(free_op_data1)) {
34438: zval_dtor(value);
34439: }
34440: if (RETURN_VALUE_USED(opline)) {
34441: PZVAL_LOCK(&EG(uninitialized_zval));
34442: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
34443: }
34444: } else {
34445: if ((opline+1)->op1_type == IS_TMP_VAR) {
34446: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
34447: } else if ((opline+1)->op1_type == IS_CONST) {
34448: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
34449: } else {
34450: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
34451: }
34452: if (RETURN_VALUE_USED(opline)) {
1.1 misho 34453: PZVAL_LOCK(value);
1.1.1.2 misho 34454: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 34455: }
34456: }
34457: FREE_OP_VAR_PTR(free_op_data2);
34458: FREE_OP_IF_VAR(free_op_data1);
34459: }
34460:
34461: /* assign_dim has two opcodes! */
1.1.1.2 misho 34462: CHECK_EXCEPTION();
1.1 misho 34463: ZEND_VM_INC_OPCODE();
34464: ZEND_VM_NEXT_OPCODE();
34465: }
34466:
34467: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34468: {
1.1.1.2 misho 34469: USE_OPLINE
1.1 misho 34470:
34471: zval *expr_ptr;
34472:
1.1.1.2 misho 34473: SAVE_OPLINE();
34474: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
34475: zval **expr_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 34476:
1.1.1.2 misho 34477: if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
34478: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
34479: }
34480: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 34481: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 34482: Z_ADDREF_P(expr_ptr);
1.1 misho 34483: } else {
1.1.1.2 misho 34484: expr_ptr=_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
34485: if (0) { /* temporary variable */
34486: zval *new_expr;
1.1 misho 34487:
1.1.1.2 misho 34488: ALLOC_ZVAL(new_expr);
34489: INIT_PZVAL_COPY(new_expr, expr_ptr);
34490: expr_ptr = new_expr;
34491: } else if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 34492: zval *new_expr;
34493:
34494: ALLOC_ZVAL(new_expr);
34495: INIT_PZVAL_COPY(new_expr, expr_ptr);
34496: expr_ptr = new_expr;
34497: zendi_zval_copy_ctor(*expr_ptr);
34498: } else {
34499: Z_ADDREF_P(expr_ptr);
34500: }
34501: }
1.1.1.2 misho 34502:
34503: if (IS_UNUSED != IS_UNUSED) {
34504:
34505: zval *offset = NULL;
34506: ulong hval;
34507:
1.1 misho 34508: switch (Z_TYPE_P(offset)) {
34509: case IS_DOUBLE:
1.1.1.2 misho 34510: hval = zend_dval_to_lval(Z_DVAL_P(offset));
34511: goto num_index;
1.1 misho 34512: case IS_LONG:
34513: case IS_BOOL:
1.1.1.2 misho 34514: hval = Z_LVAL_P(offset);
34515: num_index:
34516: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 34517: break;
34518: case IS_STRING:
1.1.1.2 misho 34519: if (IS_UNUSED == IS_CONST) {
34520: hval = Z_HASH_P(offset);
34521: } else {
34522: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
34523: if (IS_INTERNED(Z_STRVAL_P(offset))) {
34524: hval = INTERNED_HASH(Z_STRVAL_P(offset));
34525: } else {
34526: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
34527: }
34528: }
34529: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 34530: break;
34531: case IS_NULL:
1.1.1.2 misho 34532: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 34533: break;
34534: default:
34535: zend_error(E_WARNING, "Illegal offset type");
34536: zval_ptr_dtor(&expr_ptr);
34537: /* do nothing */
34538: break;
34539: }
34540:
34541: } else {
1.1.1.2 misho 34542: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 34543: }
1.1.1.2 misho 34544: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
1.1 misho 34545:
34546: } else {
34547:
34548: }
1.1.1.2 misho 34549: CHECK_EXCEPTION();
1.1 misho 34550: ZEND_VM_NEXT_OPCODE();
34551: }
34552:
34553: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34554: {
1.1.1.2 misho 34555: USE_OPLINE
1.1 misho 34556:
1.1.1.2 misho 34557: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 34558: if (IS_CV == IS_UNUSED) {
34559: ZEND_VM_NEXT_OPCODE();
34560: #if 0 || IS_CV != IS_UNUSED
34561: } else {
34562: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
34563: #endif
34564: }
34565: }
34566:
1.1.1.2 misho 34567: static int ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34568: {
34569: USE_OPLINE
34570: zval tmp, *varname;
34571: HashTable *target_symbol_table;
34572:
34573:
34574: SAVE_OPLINE();
34575: if (IS_CV == IS_CV &&
34576: IS_UNUSED == IS_UNUSED &&
34577: (opline->extended_value & ZEND_QUICK_SET)) {
34578: if (EG(active_symbol_table)) {
34579: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
34580:
34581: zend_delete_variable(EX(prev_execute_data), EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value TSRMLS_CC);
34582: EX_CV(opline->op1.var) = NULL;
34583: } else if (EX_CV(opline->op1.var)) {
34584: zval_ptr_dtor(EX_CV(opline->op1.var));
34585: EX_CV(opline->op1.var) = NULL;
34586: }
34587: CHECK_EXCEPTION();
34588: ZEND_VM_NEXT_OPCODE();
34589: }
34590:
34591: varname = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
34592:
34593: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
34594: ZVAL_COPY_VALUE(&tmp, varname);
34595: zval_copy_ctor(&tmp);
34596: convert_to_string(&tmp);
34597: varname = &tmp;
34598: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
34599: Z_ADDREF_P(varname);
34600: }
34601:
34602: if (IS_UNUSED != IS_UNUSED) {
34603: zend_class_entry *ce;
34604:
34605: if (IS_UNUSED == IS_CONST) {
34606: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
34607: ce = CACHED_PTR(opline->op2.literal->cache_slot);
34608: } else {
34609: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
1.1.1.4 misho 34610: if (UNEXPECTED(EG(exception) != NULL)) {
1.1.1.2 misho 34611: if (IS_CV != IS_CONST && varname == &tmp) {
34612: zval_dtor(&tmp);
34613: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
34614: zval_ptr_dtor(&varname);
34615: }
34616:
1.1.1.4 misho 34617: HANDLE_EXCEPTION();
34618: }
34619: if (UNEXPECTED(ce == NULL)) {
34620: zend_error_noreturn(E_ERROR, "Class '%s' not found", Z_STRVAL_P(opline->op2.zv));
1.1.1.2 misho 34621: }
34622: CACHE_PTR(opline->op2.literal->cache_slot, ce);
34623: }
34624: } else {
34625: ce = EX_T(opline->op2.var).class_entry;
34626: }
34627: zend_std_unset_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
34628: } else {
34629: ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
34630:
34631: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
34632: zend_delete_variable(execute_data, target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value TSRMLS_CC);
34633: }
34634:
34635: if (IS_CV != IS_CONST && varname == &tmp) {
34636: zval_dtor(&tmp);
34637: } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
34638: zval_ptr_dtor(&varname);
34639: }
34640:
34641: CHECK_EXCEPTION();
34642: ZEND_VM_NEXT_OPCODE();
34643: }
34644:
34645: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34646: {
34647: USE_OPLINE
34648: zval **value;
34649: zend_bool isset = 1;
34650:
34651: SAVE_OPLINE();
34652: if (IS_CV == IS_CV &&
34653: IS_UNUSED == IS_UNUSED &&
34654: (opline->extended_value & ZEND_QUICK_SET)) {
34655: if (EX_CV(opline->op1.var)) {
34656: value = EX_CV(opline->op1.var);
34657: } else if (EG(active_symbol_table)) {
34658: zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.var);
34659:
34660: if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
34661: isset = 0;
34662: }
34663: } else {
34664: isset = 0;
34665: }
34666: } else {
34667: HashTable *target_symbol_table;
34668:
34669: zval tmp, *varname = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
34670:
34671: if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
34672: ZVAL_COPY_VALUE(&tmp, varname);
34673: zval_copy_ctor(&tmp);
34674: convert_to_string(&tmp);
34675: varname = &tmp;
34676: }
34677:
34678: if (IS_UNUSED != IS_UNUSED) {
34679: zend_class_entry *ce;
34680:
34681: if (IS_UNUSED == IS_CONST) {
34682: if (CACHED_PTR(opline->op2.literal->cache_slot)) {
34683: ce = CACHED_PTR(opline->op2.literal->cache_slot);
34684: } else {
34685: ce = zend_fetch_class_by_name(Z_STRVAL_P(opline->op2.zv), Z_STRLEN_P(opline->op2.zv), opline->op2.literal + 1, 0 TSRMLS_CC);
34686: if (UNEXPECTED(ce == NULL)) {
34687: CHECK_EXCEPTION();
34688: ZEND_VM_NEXT_OPCODE();
34689: }
34690: CACHE_PTR(opline->op2.literal->cache_slot, ce);
34691: }
34692: } else {
34693: ce = EX_T(opline->op2.var).class_entry;
34694: }
34695: value = zend_std_get_static_property(ce, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1, ((IS_CV == IS_CONST) ? opline->op1.literal : NULL) TSRMLS_CC);
34696: if (!value) {
34697: isset = 0;
34698: }
34699: } else {
34700: target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
34701: if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
34702: isset = 0;
34703: }
34704: }
34705:
34706: if (IS_CV != IS_CONST && varname == &tmp) {
34707: zval_dtor(&tmp);
34708: }
34709:
34710: }
34711:
34712: if (opline->extended_value & ZEND_ISSET) {
34713: if (isset && Z_TYPE_PP(value) != IS_NULL) {
34714: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
34715: } else {
34716: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
34717: }
34718: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
34719: if (!isset || !i_zend_is_true(*value)) {
34720: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 1);
34721: } else {
34722: ZVAL_BOOL(&EX_T(opline->result.var).tmp_var, 0);
34723: }
34724: }
34725:
34726: CHECK_EXCEPTION();
34727: ZEND_VM_NEXT_OPCODE();
34728: }
34729:
1.1 misho 34730: static int ZEND_FASTCALL ZEND_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34731: {
1.1.1.2 misho 34732: USE_OPLINE
1.1 misho 34733:
34734:
1.1.1.2 misho 34735: SAVE_OPLINE();
34736: fast_add_function(&EX_T(opline->result.var).tmp_var,
34737: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34738: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34739:
34740:
1.1.1.2 misho 34741: CHECK_EXCEPTION();
1.1 misho 34742: ZEND_VM_NEXT_OPCODE();
34743: }
34744:
34745: static int ZEND_FASTCALL ZEND_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34746: {
1.1.1.2 misho 34747: USE_OPLINE
1.1 misho 34748:
34749:
1.1.1.2 misho 34750: SAVE_OPLINE();
34751: fast_sub_function(&EX_T(opline->result.var).tmp_var,
34752: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34753: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34754:
34755:
1.1.1.2 misho 34756: CHECK_EXCEPTION();
1.1 misho 34757: ZEND_VM_NEXT_OPCODE();
34758: }
34759:
34760: static int ZEND_FASTCALL ZEND_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34761: {
1.1.1.2 misho 34762: USE_OPLINE
1.1 misho 34763:
34764:
1.1.1.2 misho 34765: SAVE_OPLINE();
34766: fast_mul_function(&EX_T(opline->result.var).tmp_var,
34767: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34768: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34769:
34770:
1.1.1.2 misho 34771: CHECK_EXCEPTION();
1.1 misho 34772: ZEND_VM_NEXT_OPCODE();
34773: }
34774:
34775: static int ZEND_FASTCALL ZEND_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34776: {
1.1.1.2 misho 34777: USE_OPLINE
1.1 misho 34778:
34779:
1.1.1.2 misho 34780: SAVE_OPLINE();
34781: fast_div_function(&EX_T(opline->result.var).tmp_var,
34782: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34783: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34784:
34785:
1.1.1.2 misho 34786: CHECK_EXCEPTION();
1.1 misho 34787: ZEND_VM_NEXT_OPCODE();
34788: }
34789:
34790: static int ZEND_FASTCALL ZEND_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34791: {
1.1.1.2 misho 34792: USE_OPLINE
1.1 misho 34793:
34794:
1.1.1.2 misho 34795: SAVE_OPLINE();
34796: fast_mod_function(&EX_T(opline->result.var).tmp_var,
34797: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34798: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34799:
34800:
1.1.1.2 misho 34801: CHECK_EXCEPTION();
1.1 misho 34802: ZEND_VM_NEXT_OPCODE();
34803: }
34804:
34805: static int ZEND_FASTCALL ZEND_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34806: {
1.1.1.2 misho 34807: USE_OPLINE
1.1 misho 34808:
34809:
1.1.1.2 misho 34810: SAVE_OPLINE();
34811: shift_left_function(&EX_T(opline->result.var).tmp_var,
34812: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34813: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34814:
34815:
1.1.1.2 misho 34816: CHECK_EXCEPTION();
1.1 misho 34817: ZEND_VM_NEXT_OPCODE();
34818: }
34819:
34820: static int ZEND_FASTCALL ZEND_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34821: {
1.1.1.2 misho 34822: USE_OPLINE
1.1 misho 34823:
34824:
1.1.1.2 misho 34825: SAVE_OPLINE();
34826: shift_right_function(&EX_T(opline->result.var).tmp_var,
34827: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34828: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34829:
34830:
1.1.1.2 misho 34831: CHECK_EXCEPTION();
1.1 misho 34832: ZEND_VM_NEXT_OPCODE();
34833: }
34834:
34835: static int ZEND_FASTCALL ZEND_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34836: {
1.1.1.2 misho 34837: USE_OPLINE
1.1 misho 34838:
34839:
1.1.1.2 misho 34840: SAVE_OPLINE();
34841: concat_function(&EX_T(opline->result.var).tmp_var,
34842: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34843: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34844:
34845:
1.1.1.2 misho 34846: CHECK_EXCEPTION();
1.1 misho 34847: ZEND_VM_NEXT_OPCODE();
34848: }
34849:
34850: static int ZEND_FASTCALL ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34851: {
1.1.1.2 misho 34852: USE_OPLINE
1.1 misho 34853:
34854:
1.1.1.2 misho 34855: SAVE_OPLINE();
34856: is_identical_function(&EX_T(opline->result.var).tmp_var,
34857: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34858: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34859:
34860:
1.1.1.2 misho 34861: CHECK_EXCEPTION();
1.1 misho 34862: ZEND_VM_NEXT_OPCODE();
34863: }
34864:
34865: static int ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34866: {
1.1.1.2 misho 34867: USE_OPLINE
1.1 misho 34868:
1.1.1.2 misho 34869: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 34870:
1.1.1.2 misho 34871: SAVE_OPLINE();
1.1 misho 34872: is_identical_function(result,
1.1.1.2 misho 34873: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34874: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34875: Z_LVAL_P(result) = !Z_LVAL_P(result);
34876:
34877:
1.1.1.2 misho 34878: CHECK_EXCEPTION();
1.1 misho 34879: ZEND_VM_NEXT_OPCODE();
34880: }
34881:
34882: static int ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34883: {
1.1.1.2 misho 34884: USE_OPLINE
1.1 misho 34885:
1.1.1.2 misho 34886: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 34887:
1.1.1.2 misho 34888: SAVE_OPLINE();
34889: ZVAL_BOOL(result, fast_equal_function(result,
34890: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34891: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 34892:
34893:
1.1.1.2 misho 34894: CHECK_EXCEPTION();
1.1 misho 34895: ZEND_VM_NEXT_OPCODE();
34896: }
34897:
34898: static int ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34899: {
1.1.1.2 misho 34900: USE_OPLINE
1.1 misho 34901:
1.1.1.2 misho 34902: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 34903:
1.1.1.2 misho 34904: SAVE_OPLINE();
34905: ZVAL_BOOL(result, fast_not_equal_function(result,
34906: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34907: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 34908:
34909:
1.1.1.2 misho 34910: CHECK_EXCEPTION();
1.1 misho 34911: ZEND_VM_NEXT_OPCODE();
34912: }
34913:
34914: static int ZEND_FASTCALL ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34915: {
1.1.1.2 misho 34916: USE_OPLINE
1.1 misho 34917:
1.1.1.2 misho 34918: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 34919:
1.1.1.2 misho 34920: SAVE_OPLINE();
34921: ZVAL_BOOL(result, fast_is_smaller_function(result,
34922: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34923: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 34924:
34925:
1.1.1.2 misho 34926: CHECK_EXCEPTION();
1.1 misho 34927: ZEND_VM_NEXT_OPCODE();
34928: }
34929:
34930: static int ZEND_FASTCALL ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34931: {
1.1.1.2 misho 34932: USE_OPLINE
1.1 misho 34933:
1.1.1.2 misho 34934: zval *result = &EX_T(opline->result.var).tmp_var;
1.1 misho 34935:
1.1.1.2 misho 34936: SAVE_OPLINE();
34937: ZVAL_BOOL(result, fast_is_smaller_or_equal_function(result,
34938: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34939: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC));
1.1 misho 34940:
34941:
1.1.1.2 misho 34942: CHECK_EXCEPTION();
1.1 misho 34943: ZEND_VM_NEXT_OPCODE();
34944: }
34945:
34946: static int ZEND_FASTCALL ZEND_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34947: {
1.1.1.2 misho 34948: USE_OPLINE
1.1 misho 34949:
34950:
1.1.1.2 misho 34951: SAVE_OPLINE();
34952: bitwise_or_function(&EX_T(opline->result.var).tmp_var,
34953: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34954: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34955:
34956:
1.1.1.2 misho 34957: CHECK_EXCEPTION();
1.1 misho 34958: ZEND_VM_NEXT_OPCODE();
34959: }
34960:
34961: static int ZEND_FASTCALL ZEND_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34962: {
1.1.1.2 misho 34963: USE_OPLINE
1.1 misho 34964:
34965:
1.1.1.2 misho 34966: SAVE_OPLINE();
34967: bitwise_and_function(&EX_T(opline->result.var).tmp_var,
34968: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34969: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34970:
34971:
1.1.1.2 misho 34972: CHECK_EXCEPTION();
1.1 misho 34973: ZEND_VM_NEXT_OPCODE();
34974: }
34975:
34976: static int ZEND_FASTCALL ZEND_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34977: {
1.1.1.2 misho 34978: USE_OPLINE
1.1 misho 34979:
34980:
1.1.1.2 misho 34981: SAVE_OPLINE();
34982: bitwise_xor_function(&EX_T(opline->result.var).tmp_var,
34983: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34984: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 34985:
34986:
1.1.1.2 misho 34987: CHECK_EXCEPTION();
1.1 misho 34988: ZEND_VM_NEXT_OPCODE();
34989: }
34990:
34991: static int ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
34992: {
1.1.1.2 misho 34993: USE_OPLINE
1.1 misho 34994:
34995:
1.1.1.2 misho 34996: SAVE_OPLINE();
34997: boolean_xor_function(&EX_T(opline->result.var).tmp_var,
34998: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
34999: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 35000:
35001:
1.1.1.2 misho 35002: CHECK_EXCEPTION();
1.1 misho 35003: ZEND_VM_NEXT_OPCODE();
35004: }
35005:
35006: 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)
35007: {
1.1.1.2 misho 35008: USE_OPLINE
1.1 misho 35009: zend_free_op free_op_data1;
1.1.1.2 misho 35010: zval **object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35011: zval *object;
1.1.1.2 misho 35012: zval *property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35013: zval *value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
1.1 misho 35014: int have_get_ptr = 0;
35015:
1.1.1.2 misho 35016: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 35017: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
35018: }
35019:
35020: make_real_object(object_ptr TSRMLS_CC);
35021: object = *object_ptr;
35022:
1.1.1.2 misho 35023: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 35024: zend_error(E_WARNING, "Attempt to assign property of non-object");
35025:
35026: FREE_OP(free_op_data1);
35027:
1.1.1.2 misho 35028: if (RETURN_VALUE_USED(opline)) {
35029: PZVAL_LOCK(&EG(uninitialized_zval));
35030: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
35031: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 35032: }
35033: } else {
35034: /* here we are sure we are dealing with an object */
35035: if (0) {
35036: MAKE_REAL_ZVAL_PTR(property);
35037: }
35038:
35039: /* here property is a string */
35040: if (opline->extended_value == ZEND_ASSIGN_OBJ
35041: && Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 35042: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35043: if (zptr != NULL) { /* NULL means no success in getting PTR */
35044: SEPARATE_ZVAL_IF_NOT_REF(zptr);
35045:
35046: have_get_ptr = 1;
35047: binary_op(*zptr, *zptr, value TSRMLS_CC);
1.1.1.2 misho 35048: if (RETURN_VALUE_USED(opline)) {
1.1 misho 35049: PZVAL_LOCK(*zptr);
1.1.1.2 misho 35050: EX_T(opline->result.var).var.ptr = *zptr;
35051: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 35052: }
35053: }
35054: }
35055:
35056: if (!have_get_ptr) {
35057: zval *z = NULL;
35058:
35059: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
35060: if (Z_OBJ_HT_P(object)->read_property) {
1.1.1.2 misho 35061: z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35062: }
35063: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
35064: if (Z_OBJ_HT_P(object)->read_dimension) {
35065: z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
35066: }
35067: }
35068: if (z) {
35069: if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
35070: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
35071:
35072: if (Z_REFCOUNT_P(z) == 0) {
35073: GC_REMOVE_ZVAL_FROM_BUFFER(z);
35074: zval_dtor(z);
35075: FREE_ZVAL(z);
35076: }
35077: z = value;
35078: }
35079: Z_ADDREF_P(z);
35080: SEPARATE_ZVAL_IF_NOT_REF(&z);
35081: binary_op(z, z, value TSRMLS_CC);
35082: if (opline->extended_value == ZEND_ASSIGN_OBJ) {
1.1.1.2 misho 35083: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35084: } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
35085: Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
35086: }
1.1.1.2 misho 35087: if (RETURN_VALUE_USED(opline)) {
1.1 misho 35088: PZVAL_LOCK(z);
1.1.1.2 misho 35089: EX_T(opline->result.var).var.ptr = z;
35090: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 35091: }
35092: zval_ptr_dtor(&z);
35093: } else {
35094: zend_error(E_WARNING, "Attempt to assign property of non-object");
1.1.1.2 misho 35095: if (RETURN_VALUE_USED(opline)) {
35096: PZVAL_LOCK(&EG(uninitialized_zval));
35097: EX_T(opline->result.var).var.ptr = &EG(uninitialized_zval);
35098: EX_T(opline->result.var).var.ptr_ptr = NULL;
1.1 misho 35099: }
35100: }
35101: }
35102:
35103: if (0) {
35104: zval_ptr_dtor(&property);
35105: } else {
35106:
35107: }
35108: FREE_OP(free_op_data1);
35109: }
35110:
35111: /* assign_obj has two opcodes! */
1.1.1.2 misho 35112: CHECK_EXCEPTION();
1.1 misho 35113: ZEND_VM_INC_OPCODE();
35114: ZEND_VM_NEXT_OPCODE();
35115: }
35116:
35117: 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)
35118: {
1.1.1.2 misho 35119: USE_OPLINE
1.1 misho 35120: zend_free_op free_op_data2, free_op_data1;
35121: zval **var_ptr;
35122: zval *value;
35123:
1.1.1.2 misho 35124: SAVE_OPLINE();
1.1 misho 35125: switch (opline->extended_value) {
35126: case ZEND_ASSIGN_OBJ:
35127: return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35128: break;
35129: case ZEND_ASSIGN_DIM: {
1.1.1.2 misho 35130: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35131:
1.1.1.2 misho 35132: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35133: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
1.1.1.2 misho 35134: } else if (UNEXPECTED(Z_TYPE_PP(container) == IS_OBJECT)) {
1.1 misho 35135: if (IS_CV == IS_VAR && !0) {
35136: Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
35137: }
35138: return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35139: } else {
1.1.1.2 misho 35140: zval *dim = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 35141:
1.1.1.2 misho 35142: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
35143: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
35144: var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
1.1 misho 35145: }
35146: }
35147: break;
35148: default:
1.1.1.2 misho 35149: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35150: var_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35151: /* do nothing */
35152: break;
35153: }
35154:
1.1.1.2 misho 35155: if (UNEXPECTED(var_ptr == NULL)) {
1.1 misho 35156: zend_error_noreturn(E_ERROR, "Cannot use assign-op operators with overloaded objects nor string offsets");
35157: }
35158:
1.1.1.2 misho 35159: if (UNEXPECTED(*var_ptr == &EG(error_zval))) {
35160: if (RETURN_VALUE_USED(opline)) {
35161: PZVAL_LOCK(&EG(uninitialized_zval));
35162: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 35163: }
35164:
35165:
1.1.1.2 misho 35166: CHECK_EXCEPTION();
35167: if (opline->extended_value == ZEND_ASSIGN_DIM) {
35168: ZEND_VM_INC_OPCODE();
35169: }
1.1 misho 35170: ZEND_VM_NEXT_OPCODE();
35171: }
35172:
35173: SEPARATE_ZVAL_IF_NOT_REF(var_ptr);
35174:
1.1.1.2 misho 35175: if (UNEXPECTED(Z_TYPE_PP(var_ptr) == IS_OBJECT)
35176: && Z_OBJ_HANDLER_PP(var_ptr, get)
1.1 misho 35177: && Z_OBJ_HANDLER_PP(var_ptr, set)) {
35178: /* proxy object */
35179: zval *objval = Z_OBJ_HANDLER_PP(var_ptr, get)(*var_ptr TSRMLS_CC);
35180: Z_ADDREF_P(objval);
35181: binary_op(objval, objval, value TSRMLS_CC);
35182: Z_OBJ_HANDLER_PP(var_ptr, set)(var_ptr, objval TSRMLS_CC);
35183: zval_ptr_dtor(&objval);
35184: } else {
35185: binary_op(*var_ptr, *var_ptr, value TSRMLS_CC);
35186: }
35187:
1.1.1.2 misho 35188: if (RETURN_VALUE_USED(opline)) {
1.1 misho 35189: PZVAL_LOCK(*var_ptr);
1.1.1.2 misho 35190: AI_SET_PTR(&EX_T(opline->result.var), *var_ptr);
1.1 misho 35191: }
35192:
35193: if (opline->extended_value == ZEND_ASSIGN_DIM) {
35194: FREE_OP(free_op_data1);
35195: FREE_OP_VAR_PTR(free_op_data2);
35196:
1.1.1.2 misho 35197: CHECK_EXCEPTION();
35198: ZEND_VM_INC_OPCODE();
35199: } else {
35200:
35201: CHECK_EXCEPTION();
35202: }
1.1 misho 35203: ZEND_VM_NEXT_OPCODE();
35204: }
35205:
35206: static int ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35207: {
35208: return zend_binary_assign_op_helper_SPEC_CV_CV(add_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35209: }
35210:
35211: static int ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35212: {
35213: return zend_binary_assign_op_helper_SPEC_CV_CV(sub_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35214: }
35215:
35216: static int ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35217: {
35218: return zend_binary_assign_op_helper_SPEC_CV_CV(mul_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35219: }
35220:
35221: static int ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35222: {
35223: return zend_binary_assign_op_helper_SPEC_CV_CV(div_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35224: }
35225:
35226: static int ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35227: {
35228: return zend_binary_assign_op_helper_SPEC_CV_CV(mod_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35229: }
35230:
35231: static int ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35232: {
35233: return zend_binary_assign_op_helper_SPEC_CV_CV(shift_left_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35234: }
35235:
35236: static int ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35237: {
35238: return zend_binary_assign_op_helper_SPEC_CV_CV(shift_right_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35239: }
35240:
35241: static int ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35242: {
35243: return zend_binary_assign_op_helper_SPEC_CV_CV(concat_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35244: }
35245:
35246: static int ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35247: {
35248: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_or_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35249: }
35250:
35251: static int ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35252: {
35253: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_and_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35254: }
35255:
35256: static int ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35257: {
35258: return zend_binary_assign_op_helper_SPEC_CV_CV(bitwise_xor_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35259: }
35260:
35261: static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
35262: {
1.1.1.2 misho 35263: USE_OPLINE
1.1 misho 35264:
1.1.1.2 misho 35265: zval **object_ptr;
1.1 misho 35266: zval *object;
1.1.1.2 misho 35267: zval *property;
35268: zval **retval;
1.1 misho 35269: int have_get_ptr = 0;
35270:
1.1.1.2 misho 35271: SAVE_OPLINE();
35272: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
35273: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35274: retval = &EX_T(opline->result.var).var.ptr;
35275:
35276: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 35277: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
35278: }
35279:
35280: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
35281: object = *object_ptr;
35282:
1.1.1.2 misho 35283: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 35284: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
35285:
1.1.1.2 misho 35286: if (RETURN_VALUE_USED(opline)) {
35287: PZVAL_LOCK(&EG(uninitialized_zval));
35288: *retval = &EG(uninitialized_zval);
1.1 misho 35289: }
35290:
1.1.1.2 misho 35291: CHECK_EXCEPTION();
1.1 misho 35292: ZEND_VM_NEXT_OPCODE();
35293: }
35294:
35295: /* here we are sure we are dealing with an object */
35296:
35297: if (0) {
35298: MAKE_REAL_ZVAL_PTR(property);
35299: }
35300:
35301: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 35302: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35303: if (zptr != NULL) { /* NULL means no success in getting PTR */
35304: SEPARATE_ZVAL_IF_NOT_REF(zptr);
35305:
35306: have_get_ptr = 1;
35307: incdec_op(*zptr);
1.1.1.2 misho 35308: if (RETURN_VALUE_USED(opline)) {
1.1 misho 35309: *retval = *zptr;
35310: PZVAL_LOCK(*retval);
35311: }
35312: }
35313: }
35314:
35315: if (!have_get_ptr) {
35316: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 35317: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35318:
1.1.1.2 misho 35319: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 35320: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
35321:
35322: if (Z_REFCOUNT_P(z) == 0) {
35323: GC_REMOVE_ZVAL_FROM_BUFFER(z);
35324: zval_dtor(z);
35325: FREE_ZVAL(z);
35326: }
35327: z = value;
35328: }
35329: Z_ADDREF_P(z);
35330: SEPARATE_ZVAL_IF_NOT_REF(&z);
35331: incdec_op(z);
35332: *retval = z;
1.1.1.2 misho 35333: Z_OBJ_HT_P(object)->write_property(object, property, z, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
35334: SELECTIVE_PZVAL_LOCK(*retval, opline);
1.1 misho 35335: zval_ptr_dtor(&z);
35336: } else {
35337: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 35338: if (RETURN_VALUE_USED(opline)) {
35339: PZVAL_LOCK(&EG(uninitialized_zval));
35340: *retval = &EG(uninitialized_zval);
1.1 misho 35341: }
35342: }
35343: }
35344:
35345: if (0) {
35346: zval_ptr_dtor(&property);
35347: } else {
35348:
35349: }
35350:
1.1.1.2 misho 35351: CHECK_EXCEPTION();
1.1 misho 35352: ZEND_VM_NEXT_OPCODE();
35353: }
35354:
35355: static int ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35356: {
35357: return zend_pre_incdec_property_helper_SPEC_CV_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35358: }
35359:
35360: static int ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35361: {
35362: return zend_pre_incdec_property_helper_SPEC_CV_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35363: }
35364:
35365: static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_OPCODE_HANDLER_ARGS)
35366: {
1.1.1.2 misho 35367: USE_OPLINE
1.1 misho 35368:
1.1.1.2 misho 35369: zval **object_ptr;
1.1 misho 35370: zval *object;
1.1.1.2 misho 35371: zval *property;
35372: zval *retval;
1.1 misho 35373: int have_get_ptr = 0;
35374:
1.1.1.2 misho 35375: SAVE_OPLINE();
35376: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
35377: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35378: retval = &EX_T(opline->result.var).tmp_var;
35379:
35380: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 35381: zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
35382: }
35383:
35384: make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
35385: object = *object_ptr;
35386:
1.1.1.2 misho 35387: if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
1.1 misho 35388: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
35389:
1.1.1.2 misho 35390: ZVAL_NULL(retval);
1.1 misho 35391:
1.1.1.2 misho 35392: CHECK_EXCEPTION();
1.1 misho 35393: ZEND_VM_NEXT_OPCODE();
35394: }
35395:
35396: /* here we are sure we are dealing with an object */
35397:
35398: if (0) {
35399: MAKE_REAL_ZVAL_PTR(property);
35400: }
35401:
35402: if (Z_OBJ_HT_P(object)->get_property_ptr_ptr) {
1.1.1.2 misho 35403: zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35404: if (zptr != NULL) { /* NULL means no success in getting PTR */
35405: have_get_ptr = 1;
35406: SEPARATE_ZVAL_IF_NOT_REF(zptr);
35407:
1.1.1.2 misho 35408: ZVAL_COPY_VALUE(retval, *zptr);
1.1 misho 35409: zendi_zval_copy_ctor(*retval);
35410:
35411: incdec_op(*zptr);
35412:
35413: }
35414: }
35415:
35416: if (!have_get_ptr) {
35417: if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
1.1.1.2 misho 35418: zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35419: zval *z_copy;
35420:
1.1.1.2 misho 35421: if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
1.1 misho 35422: zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
35423:
35424: if (Z_REFCOUNT_P(z) == 0) {
35425: GC_REMOVE_ZVAL_FROM_BUFFER(z);
35426: zval_dtor(z);
35427: FREE_ZVAL(z);
35428: }
35429: z = value;
35430: }
1.1.1.2 misho 35431: ZVAL_COPY_VALUE(retval, z);
1.1 misho 35432: zendi_zval_copy_ctor(*retval);
35433: ALLOC_ZVAL(z_copy);
1.1.1.2 misho 35434: INIT_PZVAL_COPY(z_copy, z);
1.1 misho 35435: zendi_zval_copy_ctor(*z_copy);
35436: incdec_op(z_copy);
35437: Z_ADDREF_P(z);
1.1.1.2 misho 35438: Z_OBJ_HT_P(object)->write_property(object, property, z_copy, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35439: zval_ptr_dtor(&z_copy);
35440: zval_ptr_dtor(&z);
35441: } else {
35442: zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
1.1.1.2 misho 35443: ZVAL_NULL(retval);
1.1 misho 35444: }
35445: }
35446:
35447: if (0) {
35448: zval_ptr_dtor(&property);
35449: } else {
35450:
35451: }
35452:
1.1.1.2 misho 35453: CHECK_EXCEPTION();
1.1 misho 35454: ZEND_VM_NEXT_OPCODE();
35455: }
35456:
35457: static int ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35458: {
35459: return zend_post_incdec_property_helper_SPEC_CV_CV(increment_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35460: }
35461:
35462: static int ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35463: {
35464: return zend_post_incdec_property_helper_SPEC_CV_CV(decrement_function, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
35465: }
35466:
35467: static int ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35468: {
1.1.1.2 misho 35469: USE_OPLINE
1.1 misho 35470:
1.1.1.5 ! misho 35471: zval *container;
1.1 misho 35472:
1.1.1.2 misho 35473: SAVE_OPLINE();
35474:
1.1.1.5 ! misho 35475: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
! 35476: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 35477: }
1.1.1.5 ! misho 35478: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 35479: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
1.1 misho 35480:
35481:
1.1.1.2 misho 35482: CHECK_EXCEPTION();
1.1 misho 35483: ZEND_VM_NEXT_OPCODE();
35484: }
35485:
35486: static int ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35487: {
1.1.1.2 misho 35488: USE_OPLINE
1.1 misho 35489: zend_free_op free_op1;
1.1.1.2 misho 35490: zval **container;
1.1 misho 35491:
1.1.1.2 misho 35492: SAVE_OPLINE();
35493: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
35494:
35495: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35496: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35497: }
1.1.1.2 misho 35498: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
1.1 misho 35499:
1.1.1.2 misho 35500: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35501: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35502: }
35503:
35504: /* We are going to assign the result by reference */
1.1.1.2 misho 35505: if (UNEXPECTED(opline->extended_value != 0)) {
35506: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
35507:
35508: if (retval_ptr) {
35509: Z_DELREF_PP(retval_ptr);
35510: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
35511: Z_ADDREF_PP(retval_ptr);
35512: }
1.1 misho 35513: }
35514:
1.1.1.2 misho 35515: CHECK_EXCEPTION();
1.1 misho 35516: ZEND_VM_NEXT_OPCODE();
35517: }
35518:
35519: static int ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35520: {
1.1.1.2 misho 35521: USE_OPLINE
1.1 misho 35522: zend_free_op free_op1;
1.1.1.2 misho 35523: zval **container;
35524:
35525: SAVE_OPLINE();
35526: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35527:
1.1.1.2 misho 35528: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35529: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35530: }
1.1.1.2 misho 35531: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW TSRMLS_CC);
1.1 misho 35532:
1.1.1.2 misho 35533: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35534: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35535: }
35536:
1.1.1.2 misho 35537: CHECK_EXCEPTION();
1.1 misho 35538: ZEND_VM_NEXT_OPCODE();
35539: }
35540:
35541: static int ZEND_FASTCALL ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35542: {
1.1.1.2 misho 35543: USE_OPLINE
1.1 misho 35544:
1.1.1.5 ! misho 35545: zval *container;
1.1 misho 35546:
1.1.1.2 misho 35547: SAVE_OPLINE();
1.1.1.5 ! misho 35548: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 35549: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_IS TSRMLS_CC);
1.1 misho 35550:
35551:
1.1.1.2 misho 35552: CHECK_EXCEPTION();
1.1 misho 35553: ZEND_VM_NEXT_OPCODE();
35554: }
35555:
35556: static int ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35557: {
1.1.1.2 misho 35558: USE_OPLINE
1.1 misho 35559: zend_free_op free_op1;
35560:
1.1.1.2 misho 35561: SAVE_OPLINE();
35562:
35563: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1.1.5 ! misho 35564: zval **container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
! 35565:
1.1.1.2 misho 35566: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35567: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35568: }
1.1.1.2 misho 35569: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
35570: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35571: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35572: }
1.1.1.5 ! misho 35573:
! 35574:
1.1 misho 35575: } else {
1.1.1.5 ! misho 35576: zval *container;
! 35577:
1.1 misho 35578: if (IS_CV == IS_UNUSED) {
35579: zend_error_noreturn(E_ERROR, "Cannot use [] for reading");
35580: }
1.1.1.5 ! misho 35581: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1.1.2 misho 35582: zend_fetch_dimension_address_read(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_R TSRMLS_CC);
1.1 misho 35583:
35584:
1.1.1.5 ! misho 35585: }
1.1.1.2 misho 35586: CHECK_EXCEPTION();
1.1 misho 35587: ZEND_VM_NEXT_OPCODE();
35588: }
35589:
35590: static int ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35591: {
1.1.1.2 misho 35592: USE_OPLINE
1.1 misho 35593: zend_free_op free_op1;
1.1.1.2 misho 35594: zval **container;
35595:
35596: SAVE_OPLINE();
35597: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35598:
35599: if (IS_CV == IS_CV) {
35600: if (container != &EG(uninitialized_zval_ptr)) {
35601: SEPARATE_ZVAL_IF_NOT_REF(container);
35602: }
35603: }
1.1.1.2 misho 35604: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35605: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35606: }
1.1.1.2 misho 35607: zend_fetch_dimension_address(&EX_T(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET TSRMLS_CC);
1.1 misho 35608:
1.1.1.2 misho 35609: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35610: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35611: }
35612:
1.1.1.2 misho 35613: if (UNEXPECTED(EX_T(opline->result.var).var.ptr_ptr == NULL)) {
1.1 misho 35614: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
35615: } else {
35616: zend_free_op free_res;
1.1.1.2 misho 35617: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
1.1 misho 35618:
1.1.1.2 misho 35619: PZVAL_UNLOCK(*retval_ptr, &free_res);
35620: if (retval_ptr != &EG(uninitialized_zval_ptr)) {
35621: SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
1.1 misho 35622: }
1.1.1.2 misho 35623: PZVAL_LOCK(*retval_ptr);
1.1 misho 35624: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 35625: CHECK_EXCEPTION();
35626: ZEND_VM_NEXT_OPCODE();
1.1 misho 35627: }
35628: }
35629:
1.1.1.2 misho 35630: static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CV(ZEND_OPCODE_HANDLER_ARGS)
1.1 misho 35631: {
1.1.1.2 misho 35632: USE_OPLINE
1.1 misho 35633:
1.1.1.2 misho 35634: zval *container;
1.1 misho 35635:
1.1.1.2 misho 35636: zval *offset;
1.1 misho 35637:
1.1.1.2 misho 35638: SAVE_OPLINE();
35639: container = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
35640: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35641:
35642: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
35643: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
35644: zend_error(E_NOTICE, "Trying to get property of non-object");
35645: PZVAL_LOCK(&EG(uninitialized_zval));
35646: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
1.1 misho 35647:
35648: } else {
35649: zval *retval;
35650:
35651: if (0) {
35652: MAKE_REAL_ZVAL_PTR(offset);
35653: }
35654:
35655: /* here we are sure we are dealing with an object */
1.1.1.2 misho 35656: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35657:
1.1.1.2 misho 35658: PZVAL_LOCK(retval);
35659: AI_SET_PTR(&EX_T(opline->result.var), retval);
1.1 misho 35660:
35661: if (0) {
35662: zval_ptr_dtor(&offset);
35663: } else {
35664:
35665: }
35666: }
35667:
1.1.1.2 misho 35668: CHECK_EXCEPTION();
1.1 misho 35669: ZEND_VM_NEXT_OPCODE();
35670: }
35671:
35672: static int ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35673: {
1.1.1.2 misho 35674: return zend_fetch_property_address_read_helper_SPEC_CV_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 35675: }
35676:
35677: static int ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35678: {
1.1.1.2 misho 35679: USE_OPLINE
1.1 misho 35680: zend_free_op free_op1;
1.1.1.2 misho 35681: zval *property;
1.1 misho 35682: zval **container;
35683:
1.1.1.2 misho 35684: SAVE_OPLINE();
35685: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35686:
1.1 misho 35687: if (IS_CV == IS_VAR && (opline->extended_value & ZEND_FETCH_ADD_LOCK)) {
1.1.1.2 misho 35688: PZVAL_LOCK(*EX_T(opline->op1.var).var.ptr_ptr);
35689: EX_T(opline->op1.var).var.ptr = *EX_T(opline->op1.var).var.ptr_ptr;
1.1 misho 35690: }
35691:
35692: if (0) {
35693: MAKE_REAL_ZVAL_PTR(property);
35694: }
1.1.1.2 misho 35695: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
35696: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35697: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
35698: }
1.1.1.2 misho 35699:
35700: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 35701: if (0) {
35702: zval_ptr_dtor(&property);
35703: } else {
35704:
35705: }
1.1.1.2 misho 35706: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35707: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35708: }
35709:
35710: /* We are going to assign the result by reference */
35711: if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
1.1.1.2 misho 35712: zval **retval_ptr = EX_T(opline->result.var).var.ptr_ptr;
35713:
35714: Z_DELREF_PP(retval_ptr);
35715: SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
35716: Z_ADDREF_PP(retval_ptr);
35717: EX_T(opline->result.var).var.ptr = *EX_T(opline->result.var).var.ptr_ptr;
35718: EX_T(opline->result.var).var.ptr_ptr = &EX_T(opline->result.var).var.ptr;
1.1 misho 35719: }
35720:
1.1.1.2 misho 35721: CHECK_EXCEPTION();
1.1 misho 35722: ZEND_VM_NEXT_OPCODE();
35723: }
35724:
35725: static int ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35726: {
1.1.1.2 misho 35727: USE_OPLINE
1.1 misho 35728: zend_free_op free_op1;
1.1.1.2 misho 35729: zval *property;
35730: zval **container;
35731:
35732: SAVE_OPLINE();
35733: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35734: container = _get_zval_ptr_ptr_cv_BP_VAR_RW(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35735:
35736: if (0) {
35737: MAKE_REAL_ZVAL_PTR(property);
35738: }
1.1.1.2 misho 35739: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35740: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
35741: }
1.1.1.2 misho 35742: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
1.1 misho 35743: if (0) {
35744: zval_ptr_dtor(&property);
35745: } else {
35746:
35747: }
1.1.1.2 misho 35748: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35749: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35750: }
35751:
1.1.1.2 misho 35752: CHECK_EXCEPTION();
1.1 misho 35753: ZEND_VM_NEXT_OPCODE();
35754: }
35755:
35756: static int ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35757: {
1.1.1.2 misho 35758: USE_OPLINE
35759:
35760: zval *container;
35761:
35762: zval *offset;
35763:
35764: SAVE_OPLINE();
35765: container = _get_zval_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
35766: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35767:
35768: if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT) ||
35769: UNEXPECTED(Z_OBJ_HT_P(container)->read_property == NULL)) {
35770: PZVAL_LOCK(&EG(uninitialized_zval));
35771: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
35772:
35773: } else {
35774: zval *retval;
35775:
35776: if (0) {
35777: MAKE_REAL_ZVAL_PTR(offset);
35778: }
35779:
35780: /* here we are sure we are dealing with an object */
35781: retval = Z_OBJ_HT_P(container)->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
35782:
35783: PZVAL_LOCK(retval);
35784: AI_SET_PTR(&EX_T(opline->result.var), retval);
35785:
35786: if (0) {
35787: zval_ptr_dtor(&offset);
35788: } else {
35789:
35790: }
35791: }
35792:
35793: CHECK_EXCEPTION();
35794: ZEND_VM_NEXT_OPCODE();
1.1 misho 35795: }
35796:
35797: static int ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35798: {
1.1.1.2 misho 35799: USE_OPLINE
1.1 misho 35800:
1.1.1.2 misho 35801: if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), (opline->extended_value & ZEND_FETCH_ARG_MASK))) {
1.1 misho 35802: /* Behave like FETCH_OBJ_W */
35803: zend_free_op free_op1;
1.1.1.2 misho 35804: zval *property;
35805: zval **container;
35806:
35807: SAVE_OPLINE();
35808: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35809: container = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 35810:
35811: if (0) {
35812: MAKE_REAL_ZVAL_PTR(property);
35813: }
1.1.1.2 misho 35814: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35815: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
35816: }
1.1.1.2 misho 35817: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
1.1 misho 35818: if (0) {
35819: zval_ptr_dtor(&property);
35820: } else {
35821:
35822: }
1.1.1.2 misho 35823: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35824: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35825: }
35826:
1.1.1.2 misho 35827: CHECK_EXCEPTION();
1.1 misho 35828: ZEND_VM_NEXT_OPCODE();
35829: } else {
1.1.1.2 misho 35830: return zend_fetch_property_address_read_helper_SPEC_CV_CV(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
1.1 misho 35831: }
35832: }
35833:
35834: static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35835: {
1.1.1.2 misho 35836: USE_OPLINE
1.1 misho 35837: zend_free_op free_op1, free_res;
1.1.1.2 misho 35838: zval **container;
35839: zval *property;
35840:
35841: SAVE_OPLINE();
35842: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
35843: property = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 35844:
35845: if (IS_CV == IS_CV) {
35846: if (container != &EG(uninitialized_zval_ptr)) {
35847: SEPARATE_ZVAL_IF_NOT_REF(container);
35848: }
35849: }
35850: if (0) {
35851: MAKE_REAL_ZVAL_PTR(property);
35852: }
1.1.1.2 misho 35853: if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
1.1 misho 35854: zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
35855: }
1.1.1.2 misho 35856: zend_fetch_property_address(&EX_T(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
1.1 misho 35857: if (0) {
35858: zval_ptr_dtor(&property);
35859: } else {
35860:
35861: }
1.1.1.2 misho 35862: if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
35863: EXTRACT_ZVAL_PTR(&EX_T(opline->result.var));
1.1 misho 35864: }
35865:
1.1.1.2 misho 35866: PZVAL_UNLOCK(*EX_T(opline->result.var).var.ptr_ptr, &free_res);
35867: if (EX_T(opline->result.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) {
35868: SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 35869: }
1.1.1.2 misho 35870: PZVAL_LOCK(*EX_T(opline->result.var).var.ptr_ptr);
1.1 misho 35871: FREE_OP_VAR_PTR(free_res);
1.1.1.2 misho 35872: CHECK_EXCEPTION();
1.1 misho 35873: ZEND_VM_NEXT_OPCODE();
35874: }
35875:
35876: static int ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35877: {
1.1.1.2 misho 35878: USE_OPLINE
35879:
35880: zval **object_ptr;
35881: zval *property_name;
1.1 misho 35882:
1.1.1.2 misho 35883: SAVE_OPLINE();
35884: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
35885: property_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 35886:
35887: if (0) {
35888: MAKE_REAL_ZVAL_PTR(property_name);
35889: }
1.1.1.2 misho 35890: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 35891: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35892: }
1.1.1.2 misho 35893: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_OBJ, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35894: if (0) {
35895: zval_ptr_dtor(&property_name);
35896: } else {
35897:
35898: }
35899:
35900: /* assign_obj has two opcodes! */
1.1.1.2 misho 35901: CHECK_EXCEPTION();
1.1 misho 35902: ZEND_VM_INC_OPCODE();
35903: ZEND_VM_NEXT_OPCODE();
35904: }
35905:
35906: static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35907: {
1.1.1.2 misho 35908: USE_OPLINE
1.1 misho 35909:
1.1.1.2 misho 35910: zval **object_ptr;
1.1 misho 35911:
1.1.1.2 misho 35912: SAVE_OPLINE();
35913: object_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
35914:
35915: if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) {
1.1 misho 35916: zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
35917: }
35918: if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
35919:
1.1.1.2 misho 35920: zval *property_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 35921:
35922: if (0) {
35923: MAKE_REAL_ZVAL_PTR(property_name);
35924: }
1.1.1.2 misho 35925: zend_assign_to_object(RETURN_VALUE_USED(opline)?&EX_T(opline->result.var).var.ptr:NULL, object_ptr, property_name, (opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), ZEND_ASSIGN_DIM, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 35926: if (0) {
35927: zval_ptr_dtor(&property_name);
35928: } else {
35929:
35930: }
35931: } else {
35932: zend_free_op free_op_data1, free_op_data2;
35933: zval *value;
1.1.1.2 misho 35934: zval *dim = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 35935: zval **variable_ptr_ptr;
35936:
1.1.1.2 misho 35937: zend_fetch_dimension_address(&EX_T((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W TSRMLS_CC);
35938:
35939: value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, EX_Ts(), &free_op_data1, BP_VAR_R);
35940: variable_ptr_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, EX_Ts(), &free_op_data2 TSRMLS_CC);
35941: if (UNEXPECTED(variable_ptr_ptr == NULL)) {
35942: if (zend_assign_to_string_offset(&EX_T((opline+1)->op2.var), value, (opline+1)->op1_type TSRMLS_CC)) {
35943: if (RETURN_VALUE_USED(opline)) {
35944: zval *retval;
1.1 misho 35945:
1.1.1.2 misho 35946: ALLOC_ZVAL(retval);
35947: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T((opline+1)->op2.var).str_offset.str)+EX_T((opline+1)->op2.var).str_offset.offset, 1, 1);
35948: INIT_PZVAL(retval);
35949: AI_SET_PTR(&EX_T(opline->result.var), retval);
35950: }
35951: } else if (RETURN_VALUE_USED(opline)) {
35952: PZVAL_LOCK(&EG(uninitialized_zval));
35953: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
35954: }
35955: } else if (UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
35956: if (IS_TMP_FREE(free_op_data1)) {
35957: zval_dtor(value);
35958: }
35959: if (RETURN_VALUE_USED(opline)) {
35960: PZVAL_LOCK(&EG(uninitialized_zval));
35961: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
35962: }
35963: } else {
35964: if ((opline+1)->op1_type == IS_TMP_VAR) {
35965: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
35966: } else if ((opline+1)->op1_type == IS_CONST) {
35967: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
35968: } else {
35969: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
35970: }
35971: if (RETURN_VALUE_USED(opline)) {
1.1 misho 35972: PZVAL_LOCK(value);
1.1.1.2 misho 35973: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 35974: }
35975: }
35976: FREE_OP_VAR_PTR(free_op_data2);
35977: FREE_OP_IF_VAR(free_op_data1);
35978: }
35979:
35980: /* assign_dim has two opcodes! */
1.1.1.2 misho 35981: CHECK_EXCEPTION();
1.1 misho 35982: ZEND_VM_INC_OPCODE();
35983: ZEND_VM_NEXT_OPCODE();
35984: }
35985:
35986: static int ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
35987: {
1.1.1.2 misho 35988: USE_OPLINE
1.1 misho 35989:
1.1.1.2 misho 35990: zval *value;
35991: zval **variable_ptr_ptr;
1.1 misho 35992:
1.1.1.2 misho 35993: SAVE_OPLINE();
35994: value = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
35995: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
35996:
35997: if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL)) {
35998: if (zend_assign_to_string_offset(&EX_T(opline->op1.var), value, IS_CV TSRMLS_CC)) {
35999: if (RETURN_VALUE_USED(opline)) {
36000: zval *retval;
36001:
36002: ALLOC_ZVAL(retval);
36003: ZVAL_STRINGL(retval, Z_STRVAL_P(EX_T(opline->op1.var).str_offset.str)+EX_T(opline->op1.var).str_offset.offset, 1, 1);
36004: INIT_PZVAL(retval);
36005: AI_SET_PTR(&EX_T(opline->result.var), retval);
36006: }
36007: } else if (RETURN_VALUE_USED(opline)) {
36008: PZVAL_LOCK(&EG(uninitialized_zval));
36009: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
36010: }
36011: } else if (IS_CV == IS_VAR && UNEXPECTED(*variable_ptr_ptr == &EG(error_zval))) {
36012: if (0) {
36013: zval_dtor(value);
36014: }
36015: if (RETURN_VALUE_USED(opline)) {
36016: PZVAL_LOCK(&EG(uninitialized_zval));
36017: AI_SET_PTR(&EX_T(opline->result.var), &EG(uninitialized_zval));
36018: }
36019: } else {
36020: if (IS_CV == IS_TMP_VAR) {
36021: value = zend_assign_tmp_to_variable(variable_ptr_ptr, value TSRMLS_CC);
36022: } else if (IS_CV == IS_CONST) {
36023: value = zend_assign_const_to_variable(variable_ptr_ptr, value TSRMLS_CC);
36024: } else {
36025: value = zend_assign_to_variable(variable_ptr_ptr, value TSRMLS_CC);
36026: }
36027: if (RETURN_VALUE_USED(opline)) {
1.1 misho 36028: PZVAL_LOCK(value);
1.1.1.2 misho 36029: AI_SET_PTR(&EX_T(opline->result.var), value);
1.1 misho 36030: }
36031: }
36032:
36033: /* zend_assign_to_variable() always takes care of op2, never free it! */
36034:
1.1.1.2 misho 36035: CHECK_EXCEPTION();
1.1 misho 36036: ZEND_VM_NEXT_OPCODE();
36037: }
36038:
36039: static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36040: {
1.1.1.2 misho 36041: USE_OPLINE
1.1 misho 36042: zend_free_op free_op2;
36043: zval **variable_ptr_ptr;
1.1.1.2 misho 36044: zval **value_ptr_ptr;
36045:
36046: SAVE_OPLINE();
36047: value_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 36048:
36049: if (IS_CV == IS_VAR &&
36050: value_ptr_ptr &&
36051: !Z_ISREF_PP(value_ptr_ptr) &&
36052: opline->extended_value == ZEND_RETURNS_FUNCTION &&
1.1.1.2 misho 36053: !EX_T(opline->op2.var).var.fcall_returned_reference) {
1.1 misho 36054: if (free_op2.var == NULL) {
36055: PZVAL_LOCK(*value_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */
36056: }
36057: zend_error(E_STRICT, "Only variables should be assigned by reference");
36058: if (UNEXPECTED(EG(exception) != NULL)) {
36059:
1.1.1.2 misho 36060: HANDLE_EXCEPTION();
1.1 misho 36061: }
36062: return ZEND_ASSIGN_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
36063: } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
36064: PZVAL_LOCK(*value_ptr_ptr);
36065: }
1.1.1.2 misho 36066: if (IS_CV == IS_VAR && UNEXPECTED(EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr)) {
1.1 misho 36067: zend_error_noreturn(E_ERROR, "Cannot assign by reference to overloaded object");
36068: }
36069:
1.1.1.2 misho 36070: variable_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
36071: if ((IS_CV == IS_VAR && UNEXPECTED(value_ptr_ptr == NULL)) ||
36072: (IS_CV == IS_VAR && UNEXPECTED(variable_ptr_ptr == NULL))) {
1.1 misho 36073: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets nor overloaded objects");
36074: }
36075: zend_assign_to_variable_reference(variable_ptr_ptr, value_ptr_ptr TSRMLS_CC);
36076:
36077: if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_NEW) {
36078: Z_DELREF_PP(variable_ptr_ptr);
36079: }
36080:
1.1.1.2 misho 36081: if (RETURN_VALUE_USED(opline)) {
1.1 misho 36082: PZVAL_LOCK(*variable_ptr_ptr);
1.1.1.2 misho 36083: AI_SET_PTR(&EX_T(opline->result.var), *variable_ptr_ptr);
1.1 misho 36084: }
36085:
36086:
1.1.1.2 misho 36087: CHECK_EXCEPTION();
1.1 misho 36088: ZEND_VM_NEXT_OPCODE();
36089: }
36090:
36091: static int ZEND_FASTCALL ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36092: {
1.1.1.2 misho 36093: USE_OPLINE
1.1 misho 36094: zval *function_name;
36095: char *function_name_strval;
36096: int function_name_strlen;
36097:
36098:
1.1.1.2 misho 36099: SAVE_OPLINE();
1.1 misho 36100: zend_ptr_stack_3_push(&EG(arg_types_stack), EX(fbc), EX(object), EX(called_scope));
36101:
1.1.1.2 misho 36102: function_name = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 36103:
1.1.1.2 misho 36104: if (IS_CV != IS_CONST &&
36105: UNEXPECTED(Z_TYPE_P(function_name) != IS_STRING)) {
1.1 misho 36106: zend_error_noreturn(E_ERROR, "Method name must be a string");
36107: }
36108:
36109: function_name_strval = Z_STRVAL_P(function_name);
36110: function_name_strlen = Z_STRLEN_P(function_name);
36111:
1.1.1.2 misho 36112: EX(object) = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 36113:
1.1.1.2 misho 36114: if (EXPECTED(EX(object) != NULL) &&
36115: EXPECTED(Z_TYPE_P(EX(object)) == IS_OBJECT)) {
36116: EX(called_scope) = Z_OBJCE_P(EX(object));
1.1 misho 36117:
1.1.1.2 misho 36118: if (IS_CV != IS_CONST ||
36119: (EX(fbc) = CACHED_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope))) == NULL) {
36120: zval *object = EX(object);
36121:
36122: if (UNEXPECTED(Z_OBJ_HT_P(EX(object))->get_method == NULL)) {
36123: zend_error_noreturn(E_ERROR, "Object does not support method calls");
36124: }
36125:
36126: /* First, locate the function. */
36127: EX(fbc) = Z_OBJ_HT_P(EX(object))->get_method(&EX(object), function_name_strval, function_name_strlen, ((IS_CV == IS_CONST) ? (opline->op2.literal + 1) : NULL) TSRMLS_CC);
36128: if (UNEXPECTED(EX(fbc) == NULL)) {
36129: zend_error_noreturn(E_ERROR, "Call to undefined method %s::%s()", Z_OBJ_CLASS_NAME_P(EX(object)), function_name_strval);
36130: }
36131: if (IS_CV == IS_CONST &&
36132: EXPECTED(EX(fbc)->type <= ZEND_USER_FUNCTION) &&
36133: EXPECTED((EX(fbc)->common.fn_flags & (ZEND_ACC_CALL_VIA_HANDLER|ZEND_ACC_NEVER_CACHE)) == 0) &&
36134: EXPECTED(EX(object) == object)) {
36135: CACHE_POLYMORPHIC_PTR(opline->op2.literal->cache_slot, EX(called_scope), EX(fbc));
36136: }
1.1 misho 36137: }
36138: } else {
36139: zend_error_noreturn(E_ERROR, "Call to a member function %s() on a non-object", function_name_strval);
36140: }
36141:
36142: if ((EX(fbc)->common.fn_flags & ZEND_ACC_STATIC) != 0) {
36143: EX(object) = NULL;
36144: } else {
36145: if (!PZVAL_IS_REF(EX(object))) {
36146: Z_ADDREF_P(EX(object)); /* For $this pointer */
36147: } else {
36148: zval *this_ptr;
36149: ALLOC_ZVAL(this_ptr);
36150: INIT_PZVAL_COPY(this_ptr, EX(object));
36151: zval_copy_ctor(this_ptr);
36152: EX(object) = this_ptr;
36153: }
36154: }
36155:
36156:
1.1.1.2 misho 36157: CHECK_EXCEPTION();
1.1 misho 36158: ZEND_VM_NEXT_OPCODE();
36159: }
36160:
36161: static int ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36162: {
1.1.1.2 misho 36163: USE_OPLINE
1.1 misho 36164:
36165:
1.1.1.2 misho 36166: SAVE_OPLINE();
1.1 misho 36167: if (IS_CV==IS_VAR) {
1.1.1.2 misho 36168: PZVAL_LOCK(EX_T(opline->op1.var).var.ptr);
1.1 misho 36169: }
1.1.1.2 misho 36170: is_equal_function(&EX_T(opline->result.var).tmp_var,
36171: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC),
36172: _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC) TSRMLS_CC);
1.1 misho 36173:
1.1.1.2 misho 36174: CHECK_EXCEPTION();
1.1 misho 36175: ZEND_VM_NEXT_OPCODE();
36176: }
36177:
36178: static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36179: {
1.1.1.2 misho 36180: USE_OPLINE
1.1 misho 36181:
36182: zval *expr_ptr;
36183:
1.1.1.2 misho 36184: SAVE_OPLINE();
36185: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
36186: zval **expr_ptr_ptr = _get_zval_ptr_ptr_cv_BP_VAR_W(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 36187:
1.1.1.2 misho 36188: if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr_ptr == NULL)) {
36189: zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
36190: }
36191: SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);
1.1 misho 36192: expr_ptr = *expr_ptr_ptr;
1.1.1.2 misho 36193: Z_ADDREF_P(expr_ptr);
1.1 misho 36194: } else {
1.1.1.2 misho 36195: expr_ptr=_get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op1.var TSRMLS_CC);
36196: if (0) { /* temporary variable */
36197: zval *new_expr;
1.1 misho 36198:
1.1.1.2 misho 36199: ALLOC_ZVAL(new_expr);
36200: INIT_PZVAL_COPY(new_expr, expr_ptr);
36201: expr_ptr = new_expr;
36202: } else if (IS_CV == IS_CONST || PZVAL_IS_REF(expr_ptr)) {
1.1 misho 36203: zval *new_expr;
36204:
36205: ALLOC_ZVAL(new_expr);
36206: INIT_PZVAL_COPY(new_expr, expr_ptr);
36207: expr_ptr = new_expr;
36208: zendi_zval_copy_ctor(*expr_ptr);
36209: } else {
36210: Z_ADDREF_P(expr_ptr);
36211: }
36212: }
1.1.1.2 misho 36213:
36214: if (IS_CV != IS_UNUSED) {
36215:
36216: zval *offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
36217: ulong hval;
36218:
1.1 misho 36219: switch (Z_TYPE_P(offset)) {
36220: case IS_DOUBLE:
1.1.1.2 misho 36221: hval = zend_dval_to_lval(Z_DVAL_P(offset));
36222: goto num_index;
1.1 misho 36223: case IS_LONG:
36224: case IS_BOOL:
1.1.1.2 misho 36225: hval = Z_LVAL_P(offset);
36226: num_index:
36227: zend_hash_index_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 36228: break;
36229: case IS_STRING:
1.1.1.2 misho 36230: if (IS_CV == IS_CONST) {
36231: hval = Z_HASH_P(offset);
36232: } else {
36233: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index);
36234: if (IS_INTERNED(Z_STRVAL_P(offset))) {
36235: hval = INTERNED_HASH(Z_STRVAL_P(offset));
36236: } else {
36237: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
36238: }
36239: }
36240: zend_hash_quick_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, &expr_ptr, sizeof(zval *), NULL);
1.1 misho 36241: break;
36242: case IS_NULL:
1.1.1.2 misho 36243: zend_hash_update(Z_ARRVAL(EX_T(opline->result.var).tmp_var), "", sizeof(""), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 36244: break;
36245: default:
36246: zend_error(E_WARNING, "Illegal offset type");
36247: zval_ptr_dtor(&expr_ptr);
36248: /* do nothing */
36249: break;
36250: }
36251:
36252: } else {
1.1.1.2 misho 36253: zend_hash_next_index_insert(Z_ARRVAL(EX_T(opline->result.var).tmp_var), &expr_ptr, sizeof(zval *), NULL);
1.1 misho 36254: }
1.1.1.2 misho 36255: if ((IS_CV == IS_VAR || IS_CV == IS_CV) && opline->extended_value) {
1.1 misho 36256:
36257: } else {
36258:
36259: }
1.1.1.2 misho 36260: CHECK_EXCEPTION();
1.1 misho 36261: ZEND_VM_NEXT_OPCODE();
36262: }
36263:
36264: static int ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36265: {
1.1.1.2 misho 36266: USE_OPLINE
1.1 misho 36267:
1.1.1.2 misho 36268: array_init(&EX_T(opline->result.var).tmp_var);
1.1 misho 36269: if (IS_CV == IS_UNUSED) {
36270: ZEND_VM_NEXT_OPCODE();
36271: #if 0 || IS_CV != IS_UNUSED
36272: } else {
36273: return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
36274: #endif
36275: }
36276: }
36277:
36278: static int ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36279: {
1.1.1.2 misho 36280: USE_OPLINE
1.1 misho 36281:
1.1.1.2 misho 36282: zval **container;
1.1 misho 36283: zval *offset;
1.1.1.2 misho 36284: ulong hval;
1.1 misho 36285:
1.1.1.2 misho 36286: SAVE_OPLINE();
36287: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 36288: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
36289: SEPARATE_ZVAL_IF_NOT_REF(container);
36290: }
1.1.1.2 misho 36291: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 36292:
36293: if (IS_CV != IS_VAR || container) {
36294: switch (Z_TYPE_PP(container)) {
36295: case IS_ARRAY: {
36296: HashTable *ht = Z_ARRVAL_PP(container);
36297:
36298: switch (Z_TYPE_P(offset)) {
36299: case IS_DOUBLE:
1.1.1.2 misho 36300: hval = zend_dval_to_lval(Z_DVAL_P(offset));
1.1.1.3 misho 36301: zend_hash_index_del(ht, hval);
36302: break;
1.1 misho 36303: case IS_RESOURCE:
36304: case IS_BOOL:
36305: case IS_LONG:
1.1.1.2 misho 36306: hval = Z_LVAL_P(offset);
36307: zend_hash_index_del(ht, hval);
1.1 misho 36308: break;
36309: case IS_STRING:
36310: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
36311: Z_ADDREF_P(offset);
36312: }
1.1.1.2 misho 36313: if (IS_CV == IS_CONST) {
36314: hval = Z_HASH_P(offset);
36315: } else {
36316: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
36317: if (IS_INTERNED(Z_STRVAL_P(offset))) {
36318: hval = INTERNED_HASH(Z_STRVAL_P(offset));
36319: } else {
36320: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 36321: }
36322: }
1.1.1.2 misho 36323: if (ht == &EG(symbol_table)) {
36324: zend_delete_global_variable_ex(offset->value.str.val, offset->value.str.len, hval TSRMLS_CC);
36325: } else {
36326: zend_hash_quick_del(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval);
36327: }
36328: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
36329: zval_ptr_dtor(&offset);
36330: }
36331: break;
36332: num_index_dim:
36333: zend_hash_index_del(ht, hval);
1.1 misho 36334: if (IS_CV == IS_CV || IS_CV == IS_VAR) {
36335: zval_ptr_dtor(&offset);
36336: }
36337: break;
36338: case IS_NULL:
36339: zend_hash_del(ht, "", sizeof(""));
36340: break;
36341: default:
36342: zend_error(E_WARNING, "Illegal offset type in unset");
36343: break;
36344: }
36345:
36346: break;
36347: }
36348: case IS_OBJECT:
1.1.1.2 misho 36349: if (UNEXPECTED(Z_OBJ_HT_P(*container)->unset_dimension == NULL)) {
1.1 misho 36350: zend_error_noreturn(E_ERROR, "Cannot use object as array");
36351: }
36352: if (0) {
36353: MAKE_REAL_ZVAL_PTR(offset);
36354: }
36355: Z_OBJ_HT_P(*container)->unset_dimension(*container, offset TSRMLS_CC);
36356: if (0) {
36357: zval_ptr_dtor(&offset);
36358: } else {
36359:
36360: }
36361: break;
36362: case IS_STRING:
36363: zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
36364: ZEND_VM_CONTINUE(); /* bailed out before */
36365: default:
36366:
36367: break;
36368: }
36369: } else {
36370:
36371: }
36372:
1.1.1.2 misho 36373: CHECK_EXCEPTION();
1.1 misho 36374: ZEND_VM_NEXT_OPCODE();
36375: }
36376:
36377: static int ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36378: {
1.1.1.2 misho 36379: USE_OPLINE
36380:
36381: zval **container;
36382: zval *offset;
1.1 misho 36383:
1.1.1.2 misho 36384: SAVE_OPLINE();
36385: container = _get_zval_ptr_ptr_cv_BP_VAR_UNSET(EX_CVs(), opline->op1.var TSRMLS_CC);
36386: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
1.1 misho 36387:
36388: if (IS_CV != IS_VAR || container) {
36389: if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
36390: SEPARATE_ZVAL_IF_NOT_REF(container);
36391: }
36392: if (Z_TYPE_PP(container) == IS_OBJECT) {
36393: if (0) {
36394: MAKE_REAL_ZVAL_PTR(offset);
36395: }
36396: if (Z_OBJ_HT_P(*container)->unset_property) {
1.1.1.2 misho 36397: Z_OBJ_HT_P(*container)->unset_property(*container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
1.1 misho 36398: } else {
36399: zend_error(E_NOTICE, "Trying to unset property of non-object");
36400: }
36401: if (0) {
36402: zval_ptr_dtor(&offset);
36403: } else {
36404:
36405: }
36406: } else {
36407:
36408: }
36409: } else {
36410:
36411: }
36412:
1.1.1.2 misho 36413: CHECK_EXCEPTION();
1.1 misho 36414: ZEND_VM_NEXT_OPCODE();
36415: }
36416:
36417: static int ZEND_FASTCALL zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)
36418: {
1.1.1.2 misho 36419: USE_OPLINE
1.1 misho 36420:
1.1.1.2 misho 36421: zval **container;
1.1 misho 36422: zval **value = NULL;
36423: int result = 0;
1.1.1.2 misho 36424: ulong hval;
36425: zval *offset;
1.1 misho 36426:
1.1.1.2 misho 36427: SAVE_OPLINE();
36428: container = _get_zval_ptr_ptr_cv_BP_VAR_IS(EX_CVs(), opline->op1.var TSRMLS_CC);
1.1 misho 36429:
1.1.1.2 misho 36430: offset = _get_zval_ptr_cv_BP_VAR_R(EX_CVs(), opline->op2.var TSRMLS_CC);
36431:
36432: if (Z_TYPE_PP(container) == IS_ARRAY && !prop_dim) {
36433: HashTable *ht;
36434: int isset = 0;
36435:
36436: ht = Z_ARRVAL_PP(container);
36437:
36438: switch (Z_TYPE_P(offset)) {
36439: case IS_DOUBLE:
36440: hval = zend_dval_to_lval(Z_DVAL_P(offset));
36441: goto num_index_prop;
36442: case IS_RESOURCE:
36443: case IS_BOOL:
36444: case IS_LONG:
36445: hval = Z_LVAL_P(offset);
36446: num_index_prop:
36447: if (zend_hash_index_find(ht, hval, (void **) &value) == SUCCESS) {
36448: isset = 1;
36449: }
36450: break;
36451: case IS_STRING:
36452: if (IS_CV == IS_CONST) {
36453: hval = Z_HASH_P(offset);
36454: } else {
36455: if (!prop_dim) {
36456: ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_prop);
1.1 misho 36457: }
1.1.1.2 misho 36458: if (IS_INTERNED(Z_STRVAL_P(offset))) {
36459: hval = INTERNED_HASH(Z_STRVAL_P(offset));
1.1 misho 36460: } else {
1.1.1.2 misho 36461: hval = zend_hash_func(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1);
1.1 misho 36462: }
36463: }
1.1.1.2 misho 36464: if (zend_hash_quick_find(ht, Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, (void **) &value) == SUCCESS) {
36465: isset = 1;
36466: }
36467: break;
36468: case IS_NULL:
36469: if (zend_hash_find(ht, "", sizeof(""), (void **) &value) == SUCCESS) {
36470: isset = 1;
1.1 misho 36471: }
1.1.1.2 misho 36472: break;
36473: default:
36474: zend_error(E_WARNING, "Illegal offset type in isset or empty");
36475: break;
36476: }
36477:
36478: if (opline->extended_value & ZEND_ISSET) {
36479: if (isset && Z_TYPE_PP(value) == IS_NULL) {
36480: result = 0;
36481: } else {
36482: result = isset;
1.1 misho 36483: }
1.1.1.2 misho 36484: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
36485: if (!isset || !i_zend_is_true(*value)) {
36486: result = 0;
1.1 misho 36487: } else {
1.1.1.2 misho 36488: result = 1;
36489: }
36490: }
1.1 misho 36491:
1.1.1.2 misho 36492: } else if (Z_TYPE_PP(container) == IS_OBJECT) {
36493: if (0) {
36494: MAKE_REAL_ZVAL_PTR(offset);
36495: }
36496: if (prop_dim) {
36497: if (Z_OBJ_HT_P(*container)->has_property) {
36498: result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
36499: } else {
36500: zend_error(E_NOTICE, "Trying to check property of non-object");
36501: result = 0;
1.1 misho 36502: }
1.1.1.2 misho 36503: } else {
36504: if (Z_OBJ_HT_P(*container)->has_dimension) {
36505: result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value & ZEND_ISEMPTY) != 0 TSRMLS_CC);
36506: } else {
36507: zend_error(E_NOTICE, "Trying to check element of non-array");
36508: result = 0;
36509: }
36510: }
36511: if (0) {
36512: zval_ptr_dtor(&offset);
36513: } else {
36514:
36515: }
36516: } else if ((*container)->type == IS_STRING && !prop_dim) { /* string offsets */
36517: zval tmp;
1.1 misho 36518:
1.1.1.2 misho 36519: if (Z_TYPE_P(offset) != IS_LONG) {
36520: if (Z_TYPE_P(offset) <= IS_BOOL /* simple scalar types */
36521: || (Z_TYPE_P(offset) == IS_STRING /* or numeric string */
36522: && IS_LONG == is_numeric_string(Z_STRVAL_P(offset), Z_STRLEN_P(offset), NULL, NULL, 0))) {
36523: ZVAL_COPY_VALUE(&tmp, offset);
1.1 misho 36524: zval_copy_ctor(&tmp);
36525: convert_to_long(&tmp);
36526: offset = &tmp;
1.1.1.2 misho 36527: } else {
36528: /* can not be converted to proper offset, return "not set" */
36529: result = 0;
1.1 misho 36530: }
1.1.1.2 misho 36531: }
36532: if (Z_TYPE_P(offset) == IS_LONG) {
36533: if (opline->extended_value & ZEND_ISSET) {
36534: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container)) {
36535: result = 1;
36536: }
36537: } else /* if (opline->extended_value & ZEND_ISEMPTY) */ {
36538: if (offset->value.lval >= 0 && offset->value.lval < Z_STRLEN_PP(container) && Z_STRVAL_PP(container)[offset->value.lval] != '0') {
36539: result = 1;
1.1 misho 36540: }
36541: }
1.1.1.2 misho 36542: }
1.1 misho 36543:
1.1.1.2 misho 36544: } else {
1.1 misho 36545:
36546: }
36547:
1.1.1.2 misho 36548: Z_TYPE(EX_T(opline->result.var).tmp_var) = IS_BOOL;
36549: if (opline->extended_value & ZEND_ISSET) {
36550: Z_LVAL(EX_T(opline->result.var).tmp_var) = result;
36551: } else {
36552: Z_LVAL(EX_T(opline->result.var).tmp_var) = !result;
1.1 misho 36553: }
36554:
1.1.1.2 misho 36555: CHECK_EXCEPTION();
1.1 misho 36556: ZEND_VM_NEXT_OPCODE();
36557: }
36558:
36559: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36560: {
36561: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(0, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
36562: }
36563:
36564: static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36565: {
36566: return zend_isset_isempty_dim_prop_obj_handler_SPEC_CV_CV(1, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
36567: }
36568:
36569: static int ZEND_FASTCALL ZEND_NULL_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
36570: {
1.1.1.2 misho 36571: zend_error_noreturn(E_ERROR, "Invalid opcode %d/%d/%d.", OPLINE->opcode, OPLINE->op1_type, OPLINE->op2_type);
1.1 misho 36572: }
36573:
36574:
36575: void zend_init_opcodes_handlers(void)
36576: {
36577: static const opcode_handler_t labels[] = {
36578: ZEND_NOP_SPEC_HANDLER,
36579: ZEND_NOP_SPEC_HANDLER,
36580: ZEND_NOP_SPEC_HANDLER,
36581: ZEND_NOP_SPEC_HANDLER,
36582: ZEND_NOP_SPEC_HANDLER,
36583: ZEND_NOP_SPEC_HANDLER,
36584: ZEND_NOP_SPEC_HANDLER,
36585: ZEND_NOP_SPEC_HANDLER,
36586: ZEND_NOP_SPEC_HANDLER,
36587: ZEND_NOP_SPEC_HANDLER,
36588: ZEND_NOP_SPEC_HANDLER,
36589: ZEND_NOP_SPEC_HANDLER,
36590: ZEND_NOP_SPEC_HANDLER,
36591: ZEND_NOP_SPEC_HANDLER,
36592: ZEND_NOP_SPEC_HANDLER,
36593: ZEND_NOP_SPEC_HANDLER,
36594: ZEND_NOP_SPEC_HANDLER,
36595: ZEND_NOP_SPEC_HANDLER,
36596: ZEND_NOP_SPEC_HANDLER,
36597: ZEND_NOP_SPEC_HANDLER,
36598: ZEND_NOP_SPEC_HANDLER,
36599: ZEND_NOP_SPEC_HANDLER,
36600: ZEND_NOP_SPEC_HANDLER,
36601: ZEND_NOP_SPEC_HANDLER,
36602: ZEND_NOP_SPEC_HANDLER,
36603: ZEND_ADD_SPEC_CONST_CONST_HANDLER,
36604: ZEND_ADD_SPEC_CONST_TMP_HANDLER,
36605: ZEND_ADD_SPEC_CONST_VAR_HANDLER,
36606: ZEND_NULL_HANDLER,
36607: ZEND_ADD_SPEC_CONST_CV_HANDLER,
36608: ZEND_ADD_SPEC_TMP_CONST_HANDLER,
36609: ZEND_ADD_SPEC_TMP_TMP_HANDLER,
36610: ZEND_ADD_SPEC_TMP_VAR_HANDLER,
36611: ZEND_NULL_HANDLER,
36612: ZEND_ADD_SPEC_TMP_CV_HANDLER,
36613: ZEND_ADD_SPEC_VAR_CONST_HANDLER,
36614: ZEND_ADD_SPEC_VAR_TMP_HANDLER,
36615: ZEND_ADD_SPEC_VAR_VAR_HANDLER,
36616: ZEND_NULL_HANDLER,
36617: ZEND_ADD_SPEC_VAR_CV_HANDLER,
36618: ZEND_NULL_HANDLER,
36619: ZEND_NULL_HANDLER,
36620: ZEND_NULL_HANDLER,
36621: ZEND_NULL_HANDLER,
36622: ZEND_NULL_HANDLER,
36623: ZEND_ADD_SPEC_CV_CONST_HANDLER,
36624: ZEND_ADD_SPEC_CV_TMP_HANDLER,
36625: ZEND_ADD_SPEC_CV_VAR_HANDLER,
36626: ZEND_NULL_HANDLER,
36627: ZEND_ADD_SPEC_CV_CV_HANDLER,
36628: ZEND_SUB_SPEC_CONST_CONST_HANDLER,
36629: ZEND_SUB_SPEC_CONST_TMP_HANDLER,
36630: ZEND_SUB_SPEC_CONST_VAR_HANDLER,
36631: ZEND_NULL_HANDLER,
36632: ZEND_SUB_SPEC_CONST_CV_HANDLER,
36633: ZEND_SUB_SPEC_TMP_CONST_HANDLER,
36634: ZEND_SUB_SPEC_TMP_TMP_HANDLER,
36635: ZEND_SUB_SPEC_TMP_VAR_HANDLER,
36636: ZEND_NULL_HANDLER,
36637: ZEND_SUB_SPEC_TMP_CV_HANDLER,
36638: ZEND_SUB_SPEC_VAR_CONST_HANDLER,
36639: ZEND_SUB_SPEC_VAR_TMP_HANDLER,
36640: ZEND_SUB_SPEC_VAR_VAR_HANDLER,
36641: ZEND_NULL_HANDLER,
36642: ZEND_SUB_SPEC_VAR_CV_HANDLER,
36643: ZEND_NULL_HANDLER,
36644: ZEND_NULL_HANDLER,
36645: ZEND_NULL_HANDLER,
36646: ZEND_NULL_HANDLER,
36647: ZEND_NULL_HANDLER,
36648: ZEND_SUB_SPEC_CV_CONST_HANDLER,
36649: ZEND_SUB_SPEC_CV_TMP_HANDLER,
36650: ZEND_SUB_SPEC_CV_VAR_HANDLER,
36651: ZEND_NULL_HANDLER,
36652: ZEND_SUB_SPEC_CV_CV_HANDLER,
36653: ZEND_MUL_SPEC_CONST_CONST_HANDLER,
36654: ZEND_MUL_SPEC_CONST_TMP_HANDLER,
36655: ZEND_MUL_SPEC_CONST_VAR_HANDLER,
36656: ZEND_NULL_HANDLER,
36657: ZEND_MUL_SPEC_CONST_CV_HANDLER,
36658: ZEND_MUL_SPEC_TMP_CONST_HANDLER,
36659: ZEND_MUL_SPEC_TMP_TMP_HANDLER,
36660: ZEND_MUL_SPEC_TMP_VAR_HANDLER,
36661: ZEND_NULL_HANDLER,
36662: ZEND_MUL_SPEC_TMP_CV_HANDLER,
36663: ZEND_MUL_SPEC_VAR_CONST_HANDLER,
36664: ZEND_MUL_SPEC_VAR_TMP_HANDLER,
36665: ZEND_MUL_SPEC_VAR_VAR_HANDLER,
36666: ZEND_NULL_HANDLER,
36667: ZEND_MUL_SPEC_VAR_CV_HANDLER,
36668: ZEND_NULL_HANDLER,
36669: ZEND_NULL_HANDLER,
36670: ZEND_NULL_HANDLER,
36671: ZEND_NULL_HANDLER,
36672: ZEND_NULL_HANDLER,
36673: ZEND_MUL_SPEC_CV_CONST_HANDLER,
36674: ZEND_MUL_SPEC_CV_TMP_HANDLER,
36675: ZEND_MUL_SPEC_CV_VAR_HANDLER,
36676: ZEND_NULL_HANDLER,
36677: ZEND_MUL_SPEC_CV_CV_HANDLER,
36678: ZEND_DIV_SPEC_CONST_CONST_HANDLER,
36679: ZEND_DIV_SPEC_CONST_TMP_HANDLER,
36680: ZEND_DIV_SPEC_CONST_VAR_HANDLER,
36681: ZEND_NULL_HANDLER,
36682: ZEND_DIV_SPEC_CONST_CV_HANDLER,
36683: ZEND_DIV_SPEC_TMP_CONST_HANDLER,
36684: ZEND_DIV_SPEC_TMP_TMP_HANDLER,
36685: ZEND_DIV_SPEC_TMP_VAR_HANDLER,
36686: ZEND_NULL_HANDLER,
36687: ZEND_DIV_SPEC_TMP_CV_HANDLER,
36688: ZEND_DIV_SPEC_VAR_CONST_HANDLER,
36689: ZEND_DIV_SPEC_VAR_TMP_HANDLER,
36690: ZEND_DIV_SPEC_VAR_VAR_HANDLER,
36691: ZEND_NULL_HANDLER,
36692: ZEND_DIV_SPEC_VAR_CV_HANDLER,
36693: ZEND_NULL_HANDLER,
36694: ZEND_NULL_HANDLER,
36695: ZEND_NULL_HANDLER,
36696: ZEND_NULL_HANDLER,
36697: ZEND_NULL_HANDLER,
36698: ZEND_DIV_SPEC_CV_CONST_HANDLER,
36699: ZEND_DIV_SPEC_CV_TMP_HANDLER,
36700: ZEND_DIV_SPEC_CV_VAR_HANDLER,
36701: ZEND_NULL_HANDLER,
36702: ZEND_DIV_SPEC_CV_CV_HANDLER,
36703: ZEND_MOD_SPEC_CONST_CONST_HANDLER,
36704: ZEND_MOD_SPEC_CONST_TMP_HANDLER,
36705: ZEND_MOD_SPEC_CONST_VAR_HANDLER,
36706: ZEND_NULL_HANDLER,
36707: ZEND_MOD_SPEC_CONST_CV_HANDLER,
36708: ZEND_MOD_SPEC_TMP_CONST_HANDLER,
36709: ZEND_MOD_SPEC_TMP_TMP_HANDLER,
36710: ZEND_MOD_SPEC_TMP_VAR_HANDLER,
36711: ZEND_NULL_HANDLER,
36712: ZEND_MOD_SPEC_TMP_CV_HANDLER,
36713: ZEND_MOD_SPEC_VAR_CONST_HANDLER,
36714: ZEND_MOD_SPEC_VAR_TMP_HANDLER,
36715: ZEND_MOD_SPEC_VAR_VAR_HANDLER,
36716: ZEND_NULL_HANDLER,
36717: ZEND_MOD_SPEC_VAR_CV_HANDLER,
36718: ZEND_NULL_HANDLER,
36719: ZEND_NULL_HANDLER,
36720: ZEND_NULL_HANDLER,
36721: ZEND_NULL_HANDLER,
36722: ZEND_NULL_HANDLER,
36723: ZEND_MOD_SPEC_CV_CONST_HANDLER,
36724: ZEND_MOD_SPEC_CV_TMP_HANDLER,
36725: ZEND_MOD_SPEC_CV_VAR_HANDLER,
36726: ZEND_NULL_HANDLER,
36727: ZEND_MOD_SPEC_CV_CV_HANDLER,
36728: ZEND_SL_SPEC_CONST_CONST_HANDLER,
36729: ZEND_SL_SPEC_CONST_TMP_HANDLER,
36730: ZEND_SL_SPEC_CONST_VAR_HANDLER,
36731: ZEND_NULL_HANDLER,
36732: ZEND_SL_SPEC_CONST_CV_HANDLER,
36733: ZEND_SL_SPEC_TMP_CONST_HANDLER,
36734: ZEND_SL_SPEC_TMP_TMP_HANDLER,
36735: ZEND_SL_SPEC_TMP_VAR_HANDLER,
36736: ZEND_NULL_HANDLER,
36737: ZEND_SL_SPEC_TMP_CV_HANDLER,
36738: ZEND_SL_SPEC_VAR_CONST_HANDLER,
36739: ZEND_SL_SPEC_VAR_TMP_HANDLER,
36740: ZEND_SL_SPEC_VAR_VAR_HANDLER,
36741: ZEND_NULL_HANDLER,
36742: ZEND_SL_SPEC_VAR_CV_HANDLER,
36743: ZEND_NULL_HANDLER,
36744: ZEND_NULL_HANDLER,
36745: ZEND_NULL_HANDLER,
36746: ZEND_NULL_HANDLER,
36747: ZEND_NULL_HANDLER,
36748: ZEND_SL_SPEC_CV_CONST_HANDLER,
36749: ZEND_SL_SPEC_CV_TMP_HANDLER,
36750: ZEND_SL_SPEC_CV_VAR_HANDLER,
36751: ZEND_NULL_HANDLER,
36752: ZEND_SL_SPEC_CV_CV_HANDLER,
36753: ZEND_SR_SPEC_CONST_CONST_HANDLER,
36754: ZEND_SR_SPEC_CONST_TMP_HANDLER,
36755: ZEND_SR_SPEC_CONST_VAR_HANDLER,
36756: ZEND_NULL_HANDLER,
36757: ZEND_SR_SPEC_CONST_CV_HANDLER,
36758: ZEND_SR_SPEC_TMP_CONST_HANDLER,
36759: ZEND_SR_SPEC_TMP_TMP_HANDLER,
36760: ZEND_SR_SPEC_TMP_VAR_HANDLER,
36761: ZEND_NULL_HANDLER,
36762: ZEND_SR_SPEC_TMP_CV_HANDLER,
36763: ZEND_SR_SPEC_VAR_CONST_HANDLER,
36764: ZEND_SR_SPEC_VAR_TMP_HANDLER,
36765: ZEND_SR_SPEC_VAR_VAR_HANDLER,
36766: ZEND_NULL_HANDLER,
36767: ZEND_SR_SPEC_VAR_CV_HANDLER,
36768: ZEND_NULL_HANDLER,
36769: ZEND_NULL_HANDLER,
36770: ZEND_NULL_HANDLER,
36771: ZEND_NULL_HANDLER,
36772: ZEND_NULL_HANDLER,
36773: ZEND_SR_SPEC_CV_CONST_HANDLER,
36774: ZEND_SR_SPEC_CV_TMP_HANDLER,
36775: ZEND_SR_SPEC_CV_VAR_HANDLER,
36776: ZEND_NULL_HANDLER,
36777: ZEND_SR_SPEC_CV_CV_HANDLER,
36778: ZEND_CONCAT_SPEC_CONST_CONST_HANDLER,
36779: ZEND_CONCAT_SPEC_CONST_TMP_HANDLER,
36780: ZEND_CONCAT_SPEC_CONST_VAR_HANDLER,
36781: ZEND_NULL_HANDLER,
36782: ZEND_CONCAT_SPEC_CONST_CV_HANDLER,
36783: ZEND_CONCAT_SPEC_TMP_CONST_HANDLER,
36784: ZEND_CONCAT_SPEC_TMP_TMP_HANDLER,
36785: ZEND_CONCAT_SPEC_TMP_VAR_HANDLER,
36786: ZEND_NULL_HANDLER,
36787: ZEND_CONCAT_SPEC_TMP_CV_HANDLER,
36788: ZEND_CONCAT_SPEC_VAR_CONST_HANDLER,
36789: ZEND_CONCAT_SPEC_VAR_TMP_HANDLER,
36790: ZEND_CONCAT_SPEC_VAR_VAR_HANDLER,
36791: ZEND_NULL_HANDLER,
36792: ZEND_CONCAT_SPEC_VAR_CV_HANDLER,
36793: ZEND_NULL_HANDLER,
36794: ZEND_NULL_HANDLER,
36795: ZEND_NULL_HANDLER,
36796: ZEND_NULL_HANDLER,
36797: ZEND_NULL_HANDLER,
36798: ZEND_CONCAT_SPEC_CV_CONST_HANDLER,
36799: ZEND_CONCAT_SPEC_CV_TMP_HANDLER,
36800: ZEND_CONCAT_SPEC_CV_VAR_HANDLER,
36801: ZEND_NULL_HANDLER,
36802: ZEND_CONCAT_SPEC_CV_CV_HANDLER,
36803: ZEND_BW_OR_SPEC_CONST_CONST_HANDLER,
36804: ZEND_BW_OR_SPEC_CONST_TMP_HANDLER,
36805: ZEND_BW_OR_SPEC_CONST_VAR_HANDLER,
36806: ZEND_NULL_HANDLER,
36807: ZEND_BW_OR_SPEC_CONST_CV_HANDLER,
36808: ZEND_BW_OR_SPEC_TMP_CONST_HANDLER,
36809: ZEND_BW_OR_SPEC_TMP_TMP_HANDLER,
36810: ZEND_BW_OR_SPEC_TMP_VAR_HANDLER,
36811: ZEND_NULL_HANDLER,
36812: ZEND_BW_OR_SPEC_TMP_CV_HANDLER,
36813: ZEND_BW_OR_SPEC_VAR_CONST_HANDLER,
36814: ZEND_BW_OR_SPEC_VAR_TMP_HANDLER,
36815: ZEND_BW_OR_SPEC_VAR_VAR_HANDLER,
36816: ZEND_NULL_HANDLER,
36817: ZEND_BW_OR_SPEC_VAR_CV_HANDLER,
36818: ZEND_NULL_HANDLER,
36819: ZEND_NULL_HANDLER,
36820: ZEND_NULL_HANDLER,
36821: ZEND_NULL_HANDLER,
36822: ZEND_NULL_HANDLER,
36823: ZEND_BW_OR_SPEC_CV_CONST_HANDLER,
36824: ZEND_BW_OR_SPEC_CV_TMP_HANDLER,
36825: ZEND_BW_OR_SPEC_CV_VAR_HANDLER,
36826: ZEND_NULL_HANDLER,
36827: ZEND_BW_OR_SPEC_CV_CV_HANDLER,
36828: ZEND_BW_AND_SPEC_CONST_CONST_HANDLER,
36829: ZEND_BW_AND_SPEC_CONST_TMP_HANDLER,
36830: ZEND_BW_AND_SPEC_CONST_VAR_HANDLER,
36831: ZEND_NULL_HANDLER,
36832: ZEND_BW_AND_SPEC_CONST_CV_HANDLER,
36833: ZEND_BW_AND_SPEC_TMP_CONST_HANDLER,
36834: ZEND_BW_AND_SPEC_TMP_TMP_HANDLER,
36835: ZEND_BW_AND_SPEC_TMP_VAR_HANDLER,
36836: ZEND_NULL_HANDLER,
36837: ZEND_BW_AND_SPEC_TMP_CV_HANDLER,
36838: ZEND_BW_AND_SPEC_VAR_CONST_HANDLER,
36839: ZEND_BW_AND_SPEC_VAR_TMP_HANDLER,
36840: ZEND_BW_AND_SPEC_VAR_VAR_HANDLER,
36841: ZEND_NULL_HANDLER,
36842: ZEND_BW_AND_SPEC_VAR_CV_HANDLER,
36843: ZEND_NULL_HANDLER,
36844: ZEND_NULL_HANDLER,
36845: ZEND_NULL_HANDLER,
36846: ZEND_NULL_HANDLER,
36847: ZEND_NULL_HANDLER,
36848: ZEND_BW_AND_SPEC_CV_CONST_HANDLER,
36849: ZEND_BW_AND_SPEC_CV_TMP_HANDLER,
36850: ZEND_BW_AND_SPEC_CV_VAR_HANDLER,
36851: ZEND_NULL_HANDLER,
36852: ZEND_BW_AND_SPEC_CV_CV_HANDLER,
36853: ZEND_BW_XOR_SPEC_CONST_CONST_HANDLER,
36854: ZEND_BW_XOR_SPEC_CONST_TMP_HANDLER,
36855: ZEND_BW_XOR_SPEC_CONST_VAR_HANDLER,
36856: ZEND_NULL_HANDLER,
36857: ZEND_BW_XOR_SPEC_CONST_CV_HANDLER,
36858: ZEND_BW_XOR_SPEC_TMP_CONST_HANDLER,
36859: ZEND_BW_XOR_SPEC_TMP_TMP_HANDLER,
36860: ZEND_BW_XOR_SPEC_TMP_VAR_HANDLER,
36861: ZEND_NULL_HANDLER,
36862: ZEND_BW_XOR_SPEC_TMP_CV_HANDLER,
36863: ZEND_BW_XOR_SPEC_VAR_CONST_HANDLER,
36864: ZEND_BW_XOR_SPEC_VAR_TMP_HANDLER,
36865: ZEND_BW_XOR_SPEC_VAR_VAR_HANDLER,
36866: ZEND_NULL_HANDLER,
36867: ZEND_BW_XOR_SPEC_VAR_CV_HANDLER,
36868: ZEND_NULL_HANDLER,
36869: ZEND_NULL_HANDLER,
36870: ZEND_NULL_HANDLER,
36871: ZEND_NULL_HANDLER,
36872: ZEND_NULL_HANDLER,
36873: ZEND_BW_XOR_SPEC_CV_CONST_HANDLER,
36874: ZEND_BW_XOR_SPEC_CV_TMP_HANDLER,
36875: ZEND_BW_XOR_SPEC_CV_VAR_HANDLER,
36876: ZEND_NULL_HANDLER,
36877: ZEND_BW_XOR_SPEC_CV_CV_HANDLER,
36878: ZEND_BW_NOT_SPEC_CONST_HANDLER,
36879: ZEND_BW_NOT_SPEC_CONST_HANDLER,
36880: ZEND_BW_NOT_SPEC_CONST_HANDLER,
36881: ZEND_BW_NOT_SPEC_CONST_HANDLER,
36882: ZEND_BW_NOT_SPEC_CONST_HANDLER,
36883: ZEND_BW_NOT_SPEC_TMP_HANDLER,
36884: ZEND_BW_NOT_SPEC_TMP_HANDLER,
36885: ZEND_BW_NOT_SPEC_TMP_HANDLER,
36886: ZEND_BW_NOT_SPEC_TMP_HANDLER,
36887: ZEND_BW_NOT_SPEC_TMP_HANDLER,
36888: ZEND_BW_NOT_SPEC_VAR_HANDLER,
36889: ZEND_BW_NOT_SPEC_VAR_HANDLER,
36890: ZEND_BW_NOT_SPEC_VAR_HANDLER,
36891: ZEND_BW_NOT_SPEC_VAR_HANDLER,
36892: ZEND_BW_NOT_SPEC_VAR_HANDLER,
36893: ZEND_NULL_HANDLER,
36894: ZEND_NULL_HANDLER,
36895: ZEND_NULL_HANDLER,
36896: ZEND_NULL_HANDLER,
36897: ZEND_NULL_HANDLER,
36898: ZEND_BW_NOT_SPEC_CV_HANDLER,
36899: ZEND_BW_NOT_SPEC_CV_HANDLER,
36900: ZEND_BW_NOT_SPEC_CV_HANDLER,
36901: ZEND_BW_NOT_SPEC_CV_HANDLER,
36902: ZEND_BW_NOT_SPEC_CV_HANDLER,
36903: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
36904: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
36905: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
36906: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
36907: ZEND_BOOL_NOT_SPEC_CONST_HANDLER,
36908: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
36909: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
36910: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
36911: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
36912: ZEND_BOOL_NOT_SPEC_TMP_HANDLER,
36913: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
36914: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
36915: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
36916: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
36917: ZEND_BOOL_NOT_SPEC_VAR_HANDLER,
36918: ZEND_NULL_HANDLER,
36919: ZEND_NULL_HANDLER,
36920: ZEND_NULL_HANDLER,
36921: ZEND_NULL_HANDLER,
36922: ZEND_NULL_HANDLER,
36923: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
36924: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
36925: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
36926: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
36927: ZEND_BOOL_NOT_SPEC_CV_HANDLER,
36928: ZEND_BOOL_XOR_SPEC_CONST_CONST_HANDLER,
36929: ZEND_BOOL_XOR_SPEC_CONST_TMP_HANDLER,
36930: ZEND_BOOL_XOR_SPEC_CONST_VAR_HANDLER,
36931: ZEND_NULL_HANDLER,
36932: ZEND_BOOL_XOR_SPEC_CONST_CV_HANDLER,
36933: ZEND_BOOL_XOR_SPEC_TMP_CONST_HANDLER,
36934: ZEND_BOOL_XOR_SPEC_TMP_TMP_HANDLER,
36935: ZEND_BOOL_XOR_SPEC_TMP_VAR_HANDLER,
36936: ZEND_NULL_HANDLER,
36937: ZEND_BOOL_XOR_SPEC_TMP_CV_HANDLER,
36938: ZEND_BOOL_XOR_SPEC_VAR_CONST_HANDLER,
36939: ZEND_BOOL_XOR_SPEC_VAR_TMP_HANDLER,
36940: ZEND_BOOL_XOR_SPEC_VAR_VAR_HANDLER,
36941: ZEND_NULL_HANDLER,
36942: ZEND_BOOL_XOR_SPEC_VAR_CV_HANDLER,
36943: ZEND_NULL_HANDLER,
36944: ZEND_NULL_HANDLER,
36945: ZEND_NULL_HANDLER,
36946: ZEND_NULL_HANDLER,
36947: ZEND_NULL_HANDLER,
36948: ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER,
36949: ZEND_BOOL_XOR_SPEC_CV_TMP_HANDLER,
36950: ZEND_BOOL_XOR_SPEC_CV_VAR_HANDLER,
36951: ZEND_NULL_HANDLER,
36952: ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER,
36953: ZEND_IS_IDENTICAL_SPEC_CONST_CONST_HANDLER,
36954: ZEND_IS_IDENTICAL_SPEC_CONST_TMP_HANDLER,
36955: ZEND_IS_IDENTICAL_SPEC_CONST_VAR_HANDLER,
36956: ZEND_NULL_HANDLER,
36957: ZEND_IS_IDENTICAL_SPEC_CONST_CV_HANDLER,
36958: ZEND_IS_IDENTICAL_SPEC_TMP_CONST_HANDLER,
36959: ZEND_IS_IDENTICAL_SPEC_TMP_TMP_HANDLER,
36960: ZEND_IS_IDENTICAL_SPEC_TMP_VAR_HANDLER,
36961: ZEND_NULL_HANDLER,
36962: ZEND_IS_IDENTICAL_SPEC_TMP_CV_HANDLER,
36963: ZEND_IS_IDENTICAL_SPEC_VAR_CONST_HANDLER,
36964: ZEND_IS_IDENTICAL_SPEC_VAR_TMP_HANDLER,
36965: ZEND_IS_IDENTICAL_SPEC_VAR_VAR_HANDLER,
36966: ZEND_NULL_HANDLER,
36967: ZEND_IS_IDENTICAL_SPEC_VAR_CV_HANDLER,
36968: ZEND_NULL_HANDLER,
36969: ZEND_NULL_HANDLER,
36970: ZEND_NULL_HANDLER,
36971: ZEND_NULL_HANDLER,
36972: ZEND_NULL_HANDLER,
36973: ZEND_IS_IDENTICAL_SPEC_CV_CONST_HANDLER,
36974: ZEND_IS_IDENTICAL_SPEC_CV_TMP_HANDLER,
36975: ZEND_IS_IDENTICAL_SPEC_CV_VAR_HANDLER,
36976: ZEND_NULL_HANDLER,
36977: ZEND_IS_IDENTICAL_SPEC_CV_CV_HANDLER,
36978: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CONST_HANDLER,
36979: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_TMP_HANDLER,
36980: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_VAR_HANDLER,
36981: ZEND_NULL_HANDLER,
36982: ZEND_IS_NOT_IDENTICAL_SPEC_CONST_CV_HANDLER,
36983: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONST_HANDLER,
36984: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_TMP_HANDLER,
36985: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_VAR_HANDLER,
36986: ZEND_NULL_HANDLER,
36987: ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CV_HANDLER,
36988: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONST_HANDLER,
36989: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_TMP_HANDLER,
36990: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_VAR_HANDLER,
36991: ZEND_NULL_HANDLER,
36992: ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CV_HANDLER,
36993: ZEND_NULL_HANDLER,
36994: ZEND_NULL_HANDLER,
36995: ZEND_NULL_HANDLER,
36996: ZEND_NULL_HANDLER,
36997: ZEND_NULL_HANDLER,
36998: ZEND_IS_NOT_IDENTICAL_SPEC_CV_CONST_HANDLER,
36999: ZEND_IS_NOT_IDENTICAL_SPEC_CV_TMP_HANDLER,
37000: ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER,
37001: ZEND_NULL_HANDLER,
37002: ZEND_IS_NOT_IDENTICAL_SPEC_CV_CV_HANDLER,
37003: ZEND_IS_EQUAL_SPEC_CONST_CONST_HANDLER,
37004: ZEND_IS_EQUAL_SPEC_CONST_TMP_HANDLER,
37005: ZEND_IS_EQUAL_SPEC_CONST_VAR_HANDLER,
37006: ZEND_NULL_HANDLER,
37007: ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER,
37008: ZEND_IS_EQUAL_SPEC_TMP_CONST_HANDLER,
37009: ZEND_IS_EQUAL_SPEC_TMP_TMP_HANDLER,
37010: ZEND_IS_EQUAL_SPEC_TMP_VAR_HANDLER,
37011: ZEND_NULL_HANDLER,
37012: ZEND_IS_EQUAL_SPEC_TMP_CV_HANDLER,
37013: ZEND_IS_EQUAL_SPEC_VAR_CONST_HANDLER,
37014: ZEND_IS_EQUAL_SPEC_VAR_TMP_HANDLER,
37015: ZEND_IS_EQUAL_SPEC_VAR_VAR_HANDLER,
37016: ZEND_NULL_HANDLER,
37017: ZEND_IS_EQUAL_SPEC_VAR_CV_HANDLER,
37018: ZEND_NULL_HANDLER,
37019: ZEND_NULL_HANDLER,
37020: ZEND_NULL_HANDLER,
37021: ZEND_NULL_HANDLER,
37022: ZEND_NULL_HANDLER,
37023: ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER,
37024: ZEND_IS_EQUAL_SPEC_CV_TMP_HANDLER,
37025: ZEND_IS_EQUAL_SPEC_CV_VAR_HANDLER,
37026: ZEND_NULL_HANDLER,
37027: ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER,
37028: ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_HANDLER,
37029: ZEND_IS_NOT_EQUAL_SPEC_CONST_TMP_HANDLER,
37030: ZEND_IS_NOT_EQUAL_SPEC_CONST_VAR_HANDLER,
37031: ZEND_NULL_HANDLER,
37032: ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HANDLER,
37033: ZEND_IS_NOT_EQUAL_SPEC_TMP_CONST_HANDLER,
37034: ZEND_IS_NOT_EQUAL_SPEC_TMP_TMP_HANDLER,
37035: ZEND_IS_NOT_EQUAL_SPEC_TMP_VAR_HANDLER,
37036: ZEND_NULL_HANDLER,
37037: ZEND_IS_NOT_EQUAL_SPEC_TMP_CV_HANDLER,
37038: ZEND_IS_NOT_EQUAL_SPEC_VAR_CONST_HANDLER,
37039: ZEND_IS_NOT_EQUAL_SPEC_VAR_TMP_HANDLER,
37040: ZEND_IS_NOT_EQUAL_SPEC_VAR_VAR_HANDLER,
37041: ZEND_NULL_HANDLER,
37042: ZEND_IS_NOT_EQUAL_SPEC_VAR_CV_HANDLER,
37043: ZEND_NULL_HANDLER,
37044: ZEND_NULL_HANDLER,
37045: ZEND_NULL_HANDLER,
37046: ZEND_NULL_HANDLER,
37047: ZEND_NULL_HANDLER,
37048: ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HANDLER,
37049: ZEND_IS_NOT_EQUAL_SPEC_CV_TMP_HANDLER,
37050: ZEND_IS_NOT_EQUAL_SPEC_CV_VAR_HANDLER,
37051: ZEND_NULL_HANDLER,
37052: ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLER,
37053: ZEND_IS_SMALLER_SPEC_CONST_CONST_HANDLER,
37054: ZEND_IS_SMALLER_SPEC_CONST_TMP_HANDLER,
37055: ZEND_IS_SMALLER_SPEC_CONST_VAR_HANDLER,
37056: ZEND_NULL_HANDLER,
37057: ZEND_IS_SMALLER_SPEC_CONST_CV_HANDLER,
37058: ZEND_IS_SMALLER_SPEC_TMP_CONST_HANDLER,
37059: ZEND_IS_SMALLER_SPEC_TMP_TMP_HANDLER,
37060: ZEND_IS_SMALLER_SPEC_TMP_VAR_HANDLER,
37061: ZEND_NULL_HANDLER,
37062: ZEND_IS_SMALLER_SPEC_TMP_CV_HANDLER,
37063: ZEND_IS_SMALLER_SPEC_VAR_CONST_HANDLER,
37064: ZEND_IS_SMALLER_SPEC_VAR_TMP_HANDLER,
37065: ZEND_IS_SMALLER_SPEC_VAR_VAR_HANDLER,
37066: ZEND_NULL_HANDLER,
37067: ZEND_IS_SMALLER_SPEC_VAR_CV_HANDLER,
37068: ZEND_NULL_HANDLER,
37069: ZEND_NULL_HANDLER,
37070: ZEND_NULL_HANDLER,
37071: ZEND_NULL_HANDLER,
37072: ZEND_NULL_HANDLER,
37073: ZEND_IS_SMALLER_SPEC_CV_CONST_HANDLER,
37074: ZEND_IS_SMALLER_SPEC_CV_TMP_HANDLER,
37075: ZEND_IS_SMALLER_SPEC_CV_VAR_HANDLER,
37076: ZEND_NULL_HANDLER,
37077: ZEND_IS_SMALLER_SPEC_CV_CV_HANDLER,
37078: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CONST_HANDLER,
37079: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_TMP_HANDLER,
37080: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_VAR_HANDLER,
37081: ZEND_NULL_HANDLER,
37082: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CONST_CV_HANDLER,
37083: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CONST_HANDLER,
37084: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_TMP_HANDLER,
37085: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_VAR_HANDLER,
37086: ZEND_NULL_HANDLER,
37087: ZEND_IS_SMALLER_OR_EQUAL_SPEC_TMP_CV_HANDLER,
37088: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CONST_HANDLER,
37089: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_TMP_HANDLER,
37090: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_VAR_HANDLER,
37091: ZEND_NULL_HANDLER,
37092: ZEND_IS_SMALLER_OR_EQUAL_SPEC_VAR_CV_HANDLER,
37093: ZEND_NULL_HANDLER,
37094: ZEND_NULL_HANDLER,
37095: ZEND_NULL_HANDLER,
37096: ZEND_NULL_HANDLER,
37097: ZEND_NULL_HANDLER,
37098: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CONST_HANDLER,
37099: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_TMP_HANDLER,
37100: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_VAR_HANDLER,
37101: ZEND_NULL_HANDLER,
37102: ZEND_IS_SMALLER_OR_EQUAL_SPEC_CV_CV_HANDLER,
37103: ZEND_CAST_SPEC_CONST_HANDLER,
37104: ZEND_CAST_SPEC_CONST_HANDLER,
37105: ZEND_CAST_SPEC_CONST_HANDLER,
37106: ZEND_CAST_SPEC_CONST_HANDLER,
37107: ZEND_CAST_SPEC_CONST_HANDLER,
37108: ZEND_CAST_SPEC_TMP_HANDLER,
37109: ZEND_CAST_SPEC_TMP_HANDLER,
37110: ZEND_CAST_SPEC_TMP_HANDLER,
37111: ZEND_CAST_SPEC_TMP_HANDLER,
37112: ZEND_CAST_SPEC_TMP_HANDLER,
37113: ZEND_CAST_SPEC_VAR_HANDLER,
37114: ZEND_CAST_SPEC_VAR_HANDLER,
37115: ZEND_CAST_SPEC_VAR_HANDLER,
37116: ZEND_CAST_SPEC_VAR_HANDLER,
37117: ZEND_CAST_SPEC_VAR_HANDLER,
37118: ZEND_NULL_HANDLER,
37119: ZEND_NULL_HANDLER,
37120: ZEND_NULL_HANDLER,
37121: ZEND_NULL_HANDLER,
37122: ZEND_NULL_HANDLER,
37123: ZEND_CAST_SPEC_CV_HANDLER,
37124: ZEND_CAST_SPEC_CV_HANDLER,
37125: ZEND_CAST_SPEC_CV_HANDLER,
37126: ZEND_CAST_SPEC_CV_HANDLER,
37127: ZEND_CAST_SPEC_CV_HANDLER,
37128: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
37129: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
37130: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
37131: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
37132: ZEND_QM_ASSIGN_SPEC_CONST_HANDLER,
37133: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
37134: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
37135: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
37136: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
37137: ZEND_QM_ASSIGN_SPEC_TMP_HANDLER,
37138: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
37139: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
37140: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
37141: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
37142: ZEND_QM_ASSIGN_SPEC_VAR_HANDLER,
37143: ZEND_NULL_HANDLER,
37144: ZEND_NULL_HANDLER,
37145: ZEND_NULL_HANDLER,
37146: ZEND_NULL_HANDLER,
37147: ZEND_NULL_HANDLER,
37148: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
37149: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
37150: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
37151: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
37152: ZEND_QM_ASSIGN_SPEC_CV_HANDLER,
37153: ZEND_NULL_HANDLER,
37154: ZEND_NULL_HANDLER,
37155: ZEND_NULL_HANDLER,
37156: ZEND_NULL_HANDLER,
37157: ZEND_NULL_HANDLER,
37158: ZEND_NULL_HANDLER,
37159: ZEND_NULL_HANDLER,
37160: ZEND_NULL_HANDLER,
37161: ZEND_NULL_HANDLER,
37162: ZEND_NULL_HANDLER,
37163: ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER,
37164: ZEND_ASSIGN_ADD_SPEC_VAR_TMP_HANDLER,
37165: ZEND_ASSIGN_ADD_SPEC_VAR_VAR_HANDLER,
37166: ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_HANDLER,
37167: ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER,
37168: ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_HANDLER,
37169: ZEND_ASSIGN_ADD_SPEC_UNUSED_TMP_HANDLER,
37170: ZEND_ASSIGN_ADD_SPEC_UNUSED_VAR_HANDLER,
37171: ZEND_ASSIGN_ADD_SPEC_UNUSED_UNUSED_HANDLER,
37172: ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_HANDLER,
37173: ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER,
37174: ZEND_ASSIGN_ADD_SPEC_CV_TMP_HANDLER,
37175: ZEND_ASSIGN_ADD_SPEC_CV_VAR_HANDLER,
37176: ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_HANDLER,
37177: ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER,
37178: ZEND_NULL_HANDLER,
37179: ZEND_NULL_HANDLER,
37180: ZEND_NULL_HANDLER,
37181: ZEND_NULL_HANDLER,
37182: ZEND_NULL_HANDLER,
37183: ZEND_NULL_HANDLER,
37184: ZEND_NULL_HANDLER,
37185: ZEND_NULL_HANDLER,
37186: ZEND_NULL_HANDLER,
37187: ZEND_NULL_HANDLER,
37188: ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER,
37189: ZEND_ASSIGN_SUB_SPEC_VAR_TMP_HANDLER,
37190: ZEND_ASSIGN_SUB_SPEC_VAR_VAR_HANDLER,
37191: ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_HANDLER,
37192: ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER,
37193: ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_HANDLER,
37194: ZEND_ASSIGN_SUB_SPEC_UNUSED_TMP_HANDLER,
37195: ZEND_ASSIGN_SUB_SPEC_UNUSED_VAR_HANDLER,
37196: ZEND_ASSIGN_SUB_SPEC_UNUSED_UNUSED_HANDLER,
37197: ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_HANDLER,
37198: ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER,
37199: ZEND_ASSIGN_SUB_SPEC_CV_TMP_HANDLER,
37200: ZEND_ASSIGN_SUB_SPEC_CV_VAR_HANDLER,
37201: ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_HANDLER,
37202: ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER,
37203: ZEND_NULL_HANDLER,
37204: ZEND_NULL_HANDLER,
37205: ZEND_NULL_HANDLER,
37206: ZEND_NULL_HANDLER,
37207: ZEND_NULL_HANDLER,
37208: ZEND_NULL_HANDLER,
37209: ZEND_NULL_HANDLER,
37210: ZEND_NULL_HANDLER,
37211: ZEND_NULL_HANDLER,
37212: ZEND_NULL_HANDLER,
37213: ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER,
37214: ZEND_ASSIGN_MUL_SPEC_VAR_TMP_HANDLER,
37215: ZEND_ASSIGN_MUL_SPEC_VAR_VAR_HANDLER,
37216: ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_HANDLER,
37217: ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER,
37218: ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_HANDLER,
37219: ZEND_ASSIGN_MUL_SPEC_UNUSED_TMP_HANDLER,
37220: ZEND_ASSIGN_MUL_SPEC_UNUSED_VAR_HANDLER,
37221: ZEND_ASSIGN_MUL_SPEC_UNUSED_UNUSED_HANDLER,
37222: ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_HANDLER,
37223: ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER,
37224: ZEND_ASSIGN_MUL_SPEC_CV_TMP_HANDLER,
37225: ZEND_ASSIGN_MUL_SPEC_CV_VAR_HANDLER,
37226: ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_HANDLER,
37227: ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER,
37228: ZEND_NULL_HANDLER,
37229: ZEND_NULL_HANDLER,
37230: ZEND_NULL_HANDLER,
37231: ZEND_NULL_HANDLER,
37232: ZEND_NULL_HANDLER,
37233: ZEND_NULL_HANDLER,
37234: ZEND_NULL_HANDLER,
37235: ZEND_NULL_HANDLER,
37236: ZEND_NULL_HANDLER,
37237: ZEND_NULL_HANDLER,
37238: ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER,
37239: ZEND_ASSIGN_DIV_SPEC_VAR_TMP_HANDLER,
37240: ZEND_ASSIGN_DIV_SPEC_VAR_VAR_HANDLER,
37241: ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_HANDLER,
37242: ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER,
37243: ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_HANDLER,
37244: ZEND_ASSIGN_DIV_SPEC_UNUSED_TMP_HANDLER,
37245: ZEND_ASSIGN_DIV_SPEC_UNUSED_VAR_HANDLER,
37246: ZEND_ASSIGN_DIV_SPEC_UNUSED_UNUSED_HANDLER,
37247: ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_HANDLER,
37248: ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER,
37249: ZEND_ASSIGN_DIV_SPEC_CV_TMP_HANDLER,
37250: ZEND_ASSIGN_DIV_SPEC_CV_VAR_HANDLER,
37251: ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_HANDLER,
37252: ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER,
37253: ZEND_NULL_HANDLER,
37254: ZEND_NULL_HANDLER,
37255: ZEND_NULL_HANDLER,
37256: ZEND_NULL_HANDLER,
37257: ZEND_NULL_HANDLER,
37258: ZEND_NULL_HANDLER,
37259: ZEND_NULL_HANDLER,
37260: ZEND_NULL_HANDLER,
37261: ZEND_NULL_HANDLER,
37262: ZEND_NULL_HANDLER,
37263: ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER,
37264: ZEND_ASSIGN_MOD_SPEC_VAR_TMP_HANDLER,
37265: ZEND_ASSIGN_MOD_SPEC_VAR_VAR_HANDLER,
37266: ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_HANDLER,
37267: ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER,
37268: ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_HANDLER,
37269: ZEND_ASSIGN_MOD_SPEC_UNUSED_TMP_HANDLER,
37270: ZEND_ASSIGN_MOD_SPEC_UNUSED_VAR_HANDLER,
37271: ZEND_ASSIGN_MOD_SPEC_UNUSED_UNUSED_HANDLER,
37272: ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_HANDLER,
37273: ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER,
37274: ZEND_ASSIGN_MOD_SPEC_CV_TMP_HANDLER,
37275: ZEND_ASSIGN_MOD_SPEC_CV_VAR_HANDLER,
37276: ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_HANDLER,
37277: ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER,
37278: ZEND_NULL_HANDLER,
37279: ZEND_NULL_HANDLER,
37280: ZEND_NULL_HANDLER,
37281: ZEND_NULL_HANDLER,
37282: ZEND_NULL_HANDLER,
37283: ZEND_NULL_HANDLER,
37284: ZEND_NULL_HANDLER,
37285: ZEND_NULL_HANDLER,
37286: ZEND_NULL_HANDLER,
37287: ZEND_NULL_HANDLER,
37288: ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER,
37289: ZEND_ASSIGN_SL_SPEC_VAR_TMP_HANDLER,
37290: ZEND_ASSIGN_SL_SPEC_VAR_VAR_HANDLER,
37291: ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_HANDLER,
37292: ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER,
37293: ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_HANDLER,
37294: ZEND_ASSIGN_SL_SPEC_UNUSED_TMP_HANDLER,
37295: ZEND_ASSIGN_SL_SPEC_UNUSED_VAR_HANDLER,
37296: ZEND_ASSIGN_SL_SPEC_UNUSED_UNUSED_HANDLER,
37297: ZEND_ASSIGN_SL_SPEC_UNUSED_CV_HANDLER,
37298: ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER,
37299: ZEND_ASSIGN_SL_SPEC_CV_TMP_HANDLER,
37300: ZEND_ASSIGN_SL_SPEC_CV_VAR_HANDLER,
37301: ZEND_ASSIGN_SL_SPEC_CV_UNUSED_HANDLER,
37302: ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER,
37303: ZEND_NULL_HANDLER,
37304: ZEND_NULL_HANDLER,
37305: ZEND_NULL_HANDLER,
37306: ZEND_NULL_HANDLER,
37307: ZEND_NULL_HANDLER,
37308: ZEND_NULL_HANDLER,
37309: ZEND_NULL_HANDLER,
37310: ZEND_NULL_HANDLER,
37311: ZEND_NULL_HANDLER,
37312: ZEND_NULL_HANDLER,
37313: ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER,
37314: ZEND_ASSIGN_SR_SPEC_VAR_TMP_HANDLER,
37315: ZEND_ASSIGN_SR_SPEC_VAR_VAR_HANDLER,
37316: ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_HANDLER,
37317: ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER,
37318: ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_HANDLER,
37319: ZEND_ASSIGN_SR_SPEC_UNUSED_TMP_HANDLER,
37320: ZEND_ASSIGN_SR_SPEC_UNUSED_VAR_HANDLER,
37321: ZEND_ASSIGN_SR_SPEC_UNUSED_UNUSED_HANDLER,
37322: ZEND_ASSIGN_SR_SPEC_UNUSED_CV_HANDLER,
37323: ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER,
37324: ZEND_ASSIGN_SR_SPEC_CV_TMP_HANDLER,
37325: ZEND_ASSIGN_SR_SPEC_CV_VAR_HANDLER,
37326: ZEND_ASSIGN_SR_SPEC_CV_UNUSED_HANDLER,
37327: ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER,
37328: ZEND_NULL_HANDLER,
37329: ZEND_NULL_HANDLER,
37330: ZEND_NULL_HANDLER,
37331: ZEND_NULL_HANDLER,
37332: ZEND_NULL_HANDLER,
37333: ZEND_NULL_HANDLER,
37334: ZEND_NULL_HANDLER,
37335: ZEND_NULL_HANDLER,
37336: ZEND_NULL_HANDLER,
37337: ZEND_NULL_HANDLER,
37338: ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER,
37339: ZEND_ASSIGN_CONCAT_SPEC_VAR_TMP_HANDLER,
37340: ZEND_ASSIGN_CONCAT_SPEC_VAR_VAR_HANDLER,
37341: ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_HANDLER,
37342: ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER,
37343: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_HANDLER,
37344: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMP_HANDLER,
37345: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_VAR_HANDLER,
37346: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_UNUSED_HANDLER,
37347: ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_HANDLER,
37348: ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER,
37349: ZEND_ASSIGN_CONCAT_SPEC_CV_TMP_HANDLER,
37350: ZEND_ASSIGN_CONCAT_SPEC_CV_VAR_HANDLER,
37351: ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_HANDLER,
37352: ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER,
37353: ZEND_NULL_HANDLER,
37354: ZEND_NULL_HANDLER,
37355: ZEND_NULL_HANDLER,
37356: ZEND_NULL_HANDLER,
37357: ZEND_NULL_HANDLER,
37358: ZEND_NULL_HANDLER,
37359: ZEND_NULL_HANDLER,
37360: ZEND_NULL_HANDLER,
37361: ZEND_NULL_HANDLER,
37362: ZEND_NULL_HANDLER,
37363: ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER,
37364: ZEND_ASSIGN_BW_OR_SPEC_VAR_TMP_HANDLER,
37365: ZEND_ASSIGN_BW_OR_SPEC_VAR_VAR_HANDLER,
37366: ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_HANDLER,
37367: ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER,
37368: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_HANDLER,
37369: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMP_HANDLER,
37370: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_VAR_HANDLER,
37371: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_UNUSED_HANDLER,
37372: ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_HANDLER,
37373: ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER,
37374: ZEND_ASSIGN_BW_OR_SPEC_CV_TMP_HANDLER,
37375: ZEND_ASSIGN_BW_OR_SPEC_CV_VAR_HANDLER,
37376: ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_HANDLER,
37377: ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER,
37378: ZEND_NULL_HANDLER,
37379: ZEND_NULL_HANDLER,
37380: ZEND_NULL_HANDLER,
37381: ZEND_NULL_HANDLER,
37382: ZEND_NULL_HANDLER,
37383: ZEND_NULL_HANDLER,
37384: ZEND_NULL_HANDLER,
37385: ZEND_NULL_HANDLER,
37386: ZEND_NULL_HANDLER,
37387: ZEND_NULL_HANDLER,
37388: ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER,
37389: ZEND_ASSIGN_BW_AND_SPEC_VAR_TMP_HANDLER,
37390: ZEND_ASSIGN_BW_AND_SPEC_VAR_VAR_HANDLER,
37391: ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_HANDLER,
37392: ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER,
37393: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_HANDLER,
37394: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMP_HANDLER,
37395: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_VAR_HANDLER,
37396: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_UNUSED_HANDLER,
37397: ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_HANDLER,
37398: ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER,
37399: ZEND_ASSIGN_BW_AND_SPEC_CV_TMP_HANDLER,
37400: ZEND_ASSIGN_BW_AND_SPEC_CV_VAR_HANDLER,
37401: ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_HANDLER,
37402: ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER,
37403: ZEND_NULL_HANDLER,
37404: ZEND_NULL_HANDLER,
37405: ZEND_NULL_HANDLER,
37406: ZEND_NULL_HANDLER,
37407: ZEND_NULL_HANDLER,
37408: ZEND_NULL_HANDLER,
37409: ZEND_NULL_HANDLER,
37410: ZEND_NULL_HANDLER,
37411: ZEND_NULL_HANDLER,
37412: ZEND_NULL_HANDLER,
37413: ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER,
37414: ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMP_HANDLER,
37415: ZEND_ASSIGN_BW_XOR_SPEC_VAR_VAR_HANDLER,
37416: ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_HANDLER,
37417: ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER,
37418: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_HANDLER,
37419: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMP_HANDLER,
37420: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_VAR_HANDLER,
37421: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_UNUSED_HANDLER,
37422: ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_HANDLER,
37423: ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER,
37424: ZEND_ASSIGN_BW_XOR_SPEC_CV_TMP_HANDLER,
37425: ZEND_ASSIGN_BW_XOR_SPEC_CV_VAR_HANDLER,
37426: ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_HANDLER,
37427: ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER,
37428: ZEND_NULL_HANDLER,
37429: ZEND_NULL_HANDLER,
37430: ZEND_NULL_HANDLER,
37431: ZEND_NULL_HANDLER,
37432: ZEND_NULL_HANDLER,
37433: ZEND_NULL_HANDLER,
37434: ZEND_NULL_HANDLER,
37435: ZEND_NULL_HANDLER,
37436: ZEND_NULL_HANDLER,
37437: ZEND_NULL_HANDLER,
37438: ZEND_PRE_INC_SPEC_VAR_HANDLER,
37439: ZEND_PRE_INC_SPEC_VAR_HANDLER,
37440: ZEND_PRE_INC_SPEC_VAR_HANDLER,
37441: ZEND_PRE_INC_SPEC_VAR_HANDLER,
37442: ZEND_PRE_INC_SPEC_VAR_HANDLER,
37443: ZEND_NULL_HANDLER,
37444: ZEND_NULL_HANDLER,
37445: ZEND_NULL_HANDLER,
37446: ZEND_NULL_HANDLER,
37447: ZEND_NULL_HANDLER,
37448: ZEND_PRE_INC_SPEC_CV_HANDLER,
37449: ZEND_PRE_INC_SPEC_CV_HANDLER,
37450: ZEND_PRE_INC_SPEC_CV_HANDLER,
37451: ZEND_PRE_INC_SPEC_CV_HANDLER,
37452: ZEND_PRE_INC_SPEC_CV_HANDLER,
37453: ZEND_NULL_HANDLER,
37454: ZEND_NULL_HANDLER,
37455: ZEND_NULL_HANDLER,
37456: ZEND_NULL_HANDLER,
37457: ZEND_NULL_HANDLER,
37458: ZEND_NULL_HANDLER,
37459: ZEND_NULL_HANDLER,
37460: ZEND_NULL_HANDLER,
37461: ZEND_NULL_HANDLER,
37462: ZEND_NULL_HANDLER,
37463: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
37464: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
37465: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
37466: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
37467: ZEND_PRE_DEC_SPEC_VAR_HANDLER,
37468: ZEND_NULL_HANDLER,
37469: ZEND_NULL_HANDLER,
37470: ZEND_NULL_HANDLER,
37471: ZEND_NULL_HANDLER,
37472: ZEND_NULL_HANDLER,
37473: ZEND_PRE_DEC_SPEC_CV_HANDLER,
37474: ZEND_PRE_DEC_SPEC_CV_HANDLER,
37475: ZEND_PRE_DEC_SPEC_CV_HANDLER,
37476: ZEND_PRE_DEC_SPEC_CV_HANDLER,
37477: ZEND_PRE_DEC_SPEC_CV_HANDLER,
37478: ZEND_NULL_HANDLER,
37479: ZEND_NULL_HANDLER,
37480: ZEND_NULL_HANDLER,
37481: ZEND_NULL_HANDLER,
37482: ZEND_NULL_HANDLER,
37483: ZEND_NULL_HANDLER,
37484: ZEND_NULL_HANDLER,
37485: ZEND_NULL_HANDLER,
37486: ZEND_NULL_HANDLER,
37487: ZEND_NULL_HANDLER,
37488: ZEND_POST_INC_SPEC_VAR_HANDLER,
37489: ZEND_POST_INC_SPEC_VAR_HANDLER,
37490: ZEND_POST_INC_SPEC_VAR_HANDLER,
37491: ZEND_POST_INC_SPEC_VAR_HANDLER,
37492: ZEND_POST_INC_SPEC_VAR_HANDLER,
37493: ZEND_NULL_HANDLER,
37494: ZEND_NULL_HANDLER,
37495: ZEND_NULL_HANDLER,
37496: ZEND_NULL_HANDLER,
37497: ZEND_NULL_HANDLER,
37498: ZEND_POST_INC_SPEC_CV_HANDLER,
37499: ZEND_POST_INC_SPEC_CV_HANDLER,
37500: ZEND_POST_INC_SPEC_CV_HANDLER,
37501: ZEND_POST_INC_SPEC_CV_HANDLER,
37502: ZEND_POST_INC_SPEC_CV_HANDLER,
37503: ZEND_NULL_HANDLER,
37504: ZEND_NULL_HANDLER,
37505: ZEND_NULL_HANDLER,
37506: ZEND_NULL_HANDLER,
37507: ZEND_NULL_HANDLER,
37508: ZEND_NULL_HANDLER,
37509: ZEND_NULL_HANDLER,
37510: ZEND_NULL_HANDLER,
37511: ZEND_NULL_HANDLER,
37512: ZEND_NULL_HANDLER,
37513: ZEND_POST_DEC_SPEC_VAR_HANDLER,
37514: ZEND_POST_DEC_SPEC_VAR_HANDLER,
37515: ZEND_POST_DEC_SPEC_VAR_HANDLER,
37516: ZEND_POST_DEC_SPEC_VAR_HANDLER,
37517: ZEND_POST_DEC_SPEC_VAR_HANDLER,
37518: ZEND_NULL_HANDLER,
37519: ZEND_NULL_HANDLER,
37520: ZEND_NULL_HANDLER,
37521: ZEND_NULL_HANDLER,
37522: ZEND_NULL_HANDLER,
37523: ZEND_POST_DEC_SPEC_CV_HANDLER,
37524: ZEND_POST_DEC_SPEC_CV_HANDLER,
37525: ZEND_POST_DEC_SPEC_CV_HANDLER,
37526: ZEND_POST_DEC_SPEC_CV_HANDLER,
37527: ZEND_POST_DEC_SPEC_CV_HANDLER,
37528: ZEND_NULL_HANDLER,
37529: ZEND_NULL_HANDLER,
37530: ZEND_NULL_HANDLER,
37531: ZEND_NULL_HANDLER,
37532: ZEND_NULL_HANDLER,
37533: ZEND_NULL_HANDLER,
37534: ZEND_NULL_HANDLER,
37535: ZEND_NULL_HANDLER,
37536: ZEND_NULL_HANDLER,
37537: ZEND_NULL_HANDLER,
37538: ZEND_ASSIGN_SPEC_VAR_CONST_HANDLER,
37539: ZEND_ASSIGN_SPEC_VAR_TMP_HANDLER,
37540: ZEND_ASSIGN_SPEC_VAR_VAR_HANDLER,
37541: ZEND_NULL_HANDLER,
37542: ZEND_ASSIGN_SPEC_VAR_CV_HANDLER,
37543: ZEND_NULL_HANDLER,
37544: ZEND_NULL_HANDLER,
37545: ZEND_NULL_HANDLER,
37546: ZEND_NULL_HANDLER,
37547: ZEND_NULL_HANDLER,
37548: ZEND_ASSIGN_SPEC_CV_CONST_HANDLER,
37549: ZEND_ASSIGN_SPEC_CV_TMP_HANDLER,
37550: ZEND_ASSIGN_SPEC_CV_VAR_HANDLER,
37551: ZEND_NULL_HANDLER,
37552: ZEND_ASSIGN_SPEC_CV_CV_HANDLER,
37553: ZEND_NULL_HANDLER,
37554: ZEND_NULL_HANDLER,
37555: ZEND_NULL_HANDLER,
37556: ZEND_NULL_HANDLER,
37557: ZEND_NULL_HANDLER,
37558: ZEND_NULL_HANDLER,
37559: ZEND_NULL_HANDLER,
37560: ZEND_NULL_HANDLER,
37561: ZEND_NULL_HANDLER,
37562: ZEND_NULL_HANDLER,
37563: ZEND_NULL_HANDLER,
37564: ZEND_NULL_HANDLER,
37565: ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER,
37566: ZEND_NULL_HANDLER,
37567: ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER,
37568: ZEND_NULL_HANDLER,
37569: ZEND_NULL_HANDLER,
37570: ZEND_NULL_HANDLER,
37571: ZEND_NULL_HANDLER,
37572: ZEND_NULL_HANDLER,
37573: ZEND_NULL_HANDLER,
37574: ZEND_NULL_HANDLER,
37575: ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER,
37576: ZEND_NULL_HANDLER,
37577: ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER,
37578: ZEND_ECHO_SPEC_CONST_HANDLER,
37579: ZEND_ECHO_SPEC_CONST_HANDLER,
37580: ZEND_ECHO_SPEC_CONST_HANDLER,
37581: ZEND_ECHO_SPEC_CONST_HANDLER,
37582: ZEND_ECHO_SPEC_CONST_HANDLER,
37583: ZEND_ECHO_SPEC_TMP_HANDLER,
37584: ZEND_ECHO_SPEC_TMP_HANDLER,
37585: ZEND_ECHO_SPEC_TMP_HANDLER,
37586: ZEND_ECHO_SPEC_TMP_HANDLER,
37587: ZEND_ECHO_SPEC_TMP_HANDLER,
37588: ZEND_ECHO_SPEC_VAR_HANDLER,
37589: ZEND_ECHO_SPEC_VAR_HANDLER,
37590: ZEND_ECHO_SPEC_VAR_HANDLER,
37591: ZEND_ECHO_SPEC_VAR_HANDLER,
37592: ZEND_ECHO_SPEC_VAR_HANDLER,
37593: ZEND_NULL_HANDLER,
37594: ZEND_NULL_HANDLER,
37595: ZEND_NULL_HANDLER,
37596: ZEND_NULL_HANDLER,
37597: ZEND_NULL_HANDLER,
37598: ZEND_ECHO_SPEC_CV_HANDLER,
37599: ZEND_ECHO_SPEC_CV_HANDLER,
37600: ZEND_ECHO_SPEC_CV_HANDLER,
37601: ZEND_ECHO_SPEC_CV_HANDLER,
37602: ZEND_ECHO_SPEC_CV_HANDLER,
37603: ZEND_PRINT_SPEC_CONST_HANDLER,
37604: ZEND_PRINT_SPEC_CONST_HANDLER,
37605: ZEND_PRINT_SPEC_CONST_HANDLER,
37606: ZEND_PRINT_SPEC_CONST_HANDLER,
37607: ZEND_PRINT_SPEC_CONST_HANDLER,
37608: ZEND_PRINT_SPEC_TMP_HANDLER,
37609: ZEND_PRINT_SPEC_TMP_HANDLER,
37610: ZEND_PRINT_SPEC_TMP_HANDLER,
37611: ZEND_PRINT_SPEC_TMP_HANDLER,
37612: ZEND_PRINT_SPEC_TMP_HANDLER,
37613: ZEND_PRINT_SPEC_VAR_HANDLER,
37614: ZEND_PRINT_SPEC_VAR_HANDLER,
37615: ZEND_PRINT_SPEC_VAR_HANDLER,
37616: ZEND_PRINT_SPEC_VAR_HANDLER,
37617: ZEND_PRINT_SPEC_VAR_HANDLER,
37618: ZEND_NULL_HANDLER,
37619: ZEND_NULL_HANDLER,
37620: ZEND_NULL_HANDLER,
37621: ZEND_NULL_HANDLER,
37622: ZEND_NULL_HANDLER,
37623: ZEND_PRINT_SPEC_CV_HANDLER,
37624: ZEND_PRINT_SPEC_CV_HANDLER,
37625: ZEND_PRINT_SPEC_CV_HANDLER,
37626: ZEND_PRINT_SPEC_CV_HANDLER,
37627: ZEND_PRINT_SPEC_CV_HANDLER,
37628: ZEND_JMP_SPEC_HANDLER,
37629: ZEND_JMP_SPEC_HANDLER,
37630: ZEND_JMP_SPEC_HANDLER,
37631: ZEND_JMP_SPEC_HANDLER,
37632: ZEND_JMP_SPEC_HANDLER,
37633: ZEND_JMP_SPEC_HANDLER,
37634: ZEND_JMP_SPEC_HANDLER,
37635: ZEND_JMP_SPEC_HANDLER,
37636: ZEND_JMP_SPEC_HANDLER,
37637: ZEND_JMP_SPEC_HANDLER,
37638: ZEND_JMP_SPEC_HANDLER,
37639: ZEND_JMP_SPEC_HANDLER,
37640: ZEND_JMP_SPEC_HANDLER,
37641: ZEND_JMP_SPEC_HANDLER,
37642: ZEND_JMP_SPEC_HANDLER,
37643: ZEND_JMP_SPEC_HANDLER,
37644: ZEND_JMP_SPEC_HANDLER,
37645: ZEND_JMP_SPEC_HANDLER,
37646: ZEND_JMP_SPEC_HANDLER,
37647: ZEND_JMP_SPEC_HANDLER,
37648: ZEND_JMP_SPEC_HANDLER,
37649: ZEND_JMP_SPEC_HANDLER,
37650: ZEND_JMP_SPEC_HANDLER,
37651: ZEND_JMP_SPEC_HANDLER,
37652: ZEND_JMP_SPEC_HANDLER,
37653: ZEND_JMPZ_SPEC_CONST_HANDLER,
37654: ZEND_JMPZ_SPEC_CONST_HANDLER,
37655: ZEND_JMPZ_SPEC_CONST_HANDLER,
37656: ZEND_JMPZ_SPEC_CONST_HANDLER,
37657: ZEND_JMPZ_SPEC_CONST_HANDLER,
37658: ZEND_JMPZ_SPEC_TMP_HANDLER,
37659: ZEND_JMPZ_SPEC_TMP_HANDLER,
37660: ZEND_JMPZ_SPEC_TMP_HANDLER,
37661: ZEND_JMPZ_SPEC_TMP_HANDLER,
37662: ZEND_JMPZ_SPEC_TMP_HANDLER,
37663: ZEND_JMPZ_SPEC_VAR_HANDLER,
37664: ZEND_JMPZ_SPEC_VAR_HANDLER,
37665: ZEND_JMPZ_SPEC_VAR_HANDLER,
37666: ZEND_JMPZ_SPEC_VAR_HANDLER,
37667: ZEND_JMPZ_SPEC_VAR_HANDLER,
37668: ZEND_NULL_HANDLER,
37669: ZEND_NULL_HANDLER,
37670: ZEND_NULL_HANDLER,
37671: ZEND_NULL_HANDLER,
37672: ZEND_NULL_HANDLER,
37673: ZEND_JMPZ_SPEC_CV_HANDLER,
37674: ZEND_JMPZ_SPEC_CV_HANDLER,
37675: ZEND_JMPZ_SPEC_CV_HANDLER,
37676: ZEND_JMPZ_SPEC_CV_HANDLER,
37677: ZEND_JMPZ_SPEC_CV_HANDLER,
37678: ZEND_JMPNZ_SPEC_CONST_HANDLER,
37679: ZEND_JMPNZ_SPEC_CONST_HANDLER,
37680: ZEND_JMPNZ_SPEC_CONST_HANDLER,
37681: ZEND_JMPNZ_SPEC_CONST_HANDLER,
37682: ZEND_JMPNZ_SPEC_CONST_HANDLER,
37683: ZEND_JMPNZ_SPEC_TMP_HANDLER,
37684: ZEND_JMPNZ_SPEC_TMP_HANDLER,
37685: ZEND_JMPNZ_SPEC_TMP_HANDLER,
37686: ZEND_JMPNZ_SPEC_TMP_HANDLER,
37687: ZEND_JMPNZ_SPEC_TMP_HANDLER,
37688: ZEND_JMPNZ_SPEC_VAR_HANDLER,
37689: ZEND_JMPNZ_SPEC_VAR_HANDLER,
37690: ZEND_JMPNZ_SPEC_VAR_HANDLER,
37691: ZEND_JMPNZ_SPEC_VAR_HANDLER,
37692: ZEND_JMPNZ_SPEC_VAR_HANDLER,
37693: ZEND_NULL_HANDLER,
37694: ZEND_NULL_HANDLER,
37695: ZEND_NULL_HANDLER,
37696: ZEND_NULL_HANDLER,
37697: ZEND_NULL_HANDLER,
37698: ZEND_JMPNZ_SPEC_CV_HANDLER,
37699: ZEND_JMPNZ_SPEC_CV_HANDLER,
37700: ZEND_JMPNZ_SPEC_CV_HANDLER,
37701: ZEND_JMPNZ_SPEC_CV_HANDLER,
37702: ZEND_JMPNZ_SPEC_CV_HANDLER,
37703: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
37704: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
37705: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
37706: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
37707: ZEND_JMPZNZ_SPEC_CONST_HANDLER,
37708: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
37709: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
37710: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
37711: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
37712: ZEND_JMPZNZ_SPEC_TMP_HANDLER,
37713: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
37714: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
37715: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
37716: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
37717: ZEND_JMPZNZ_SPEC_VAR_HANDLER,
37718: ZEND_NULL_HANDLER,
37719: ZEND_NULL_HANDLER,
37720: ZEND_NULL_HANDLER,
37721: ZEND_NULL_HANDLER,
37722: ZEND_NULL_HANDLER,
37723: ZEND_JMPZNZ_SPEC_CV_HANDLER,
37724: ZEND_JMPZNZ_SPEC_CV_HANDLER,
37725: ZEND_JMPZNZ_SPEC_CV_HANDLER,
37726: ZEND_JMPZNZ_SPEC_CV_HANDLER,
37727: ZEND_JMPZNZ_SPEC_CV_HANDLER,
37728: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
37729: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
37730: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
37731: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
37732: ZEND_JMPZ_EX_SPEC_CONST_HANDLER,
37733: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
37734: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
37735: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
37736: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
37737: ZEND_JMPZ_EX_SPEC_TMP_HANDLER,
37738: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
37739: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
37740: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
37741: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
37742: ZEND_JMPZ_EX_SPEC_VAR_HANDLER,
37743: ZEND_NULL_HANDLER,
37744: ZEND_NULL_HANDLER,
37745: ZEND_NULL_HANDLER,
37746: ZEND_NULL_HANDLER,
37747: ZEND_NULL_HANDLER,
37748: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
37749: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
37750: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
37751: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
37752: ZEND_JMPZ_EX_SPEC_CV_HANDLER,
37753: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
37754: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
37755: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
37756: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
37757: ZEND_JMPNZ_EX_SPEC_CONST_HANDLER,
37758: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
37759: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
37760: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
37761: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
37762: ZEND_JMPNZ_EX_SPEC_TMP_HANDLER,
37763: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
37764: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
37765: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
37766: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
37767: ZEND_JMPNZ_EX_SPEC_VAR_HANDLER,
37768: ZEND_NULL_HANDLER,
37769: ZEND_NULL_HANDLER,
37770: ZEND_NULL_HANDLER,
37771: ZEND_NULL_HANDLER,
37772: ZEND_NULL_HANDLER,
37773: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
37774: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
37775: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
37776: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
37777: ZEND_JMPNZ_EX_SPEC_CV_HANDLER,
37778: ZEND_CASE_SPEC_CONST_CONST_HANDLER,
37779: ZEND_CASE_SPEC_CONST_TMP_HANDLER,
37780: ZEND_CASE_SPEC_CONST_VAR_HANDLER,
37781: ZEND_NULL_HANDLER,
37782: ZEND_CASE_SPEC_CONST_CV_HANDLER,
37783: ZEND_CASE_SPEC_TMP_CONST_HANDLER,
37784: ZEND_CASE_SPEC_TMP_TMP_HANDLER,
37785: ZEND_CASE_SPEC_TMP_VAR_HANDLER,
37786: ZEND_NULL_HANDLER,
37787: ZEND_CASE_SPEC_TMP_CV_HANDLER,
37788: ZEND_CASE_SPEC_VAR_CONST_HANDLER,
37789: ZEND_CASE_SPEC_VAR_TMP_HANDLER,
37790: ZEND_CASE_SPEC_VAR_VAR_HANDLER,
37791: ZEND_NULL_HANDLER,
37792: ZEND_CASE_SPEC_VAR_CV_HANDLER,
37793: ZEND_NULL_HANDLER,
37794: ZEND_NULL_HANDLER,
37795: ZEND_NULL_HANDLER,
37796: ZEND_NULL_HANDLER,
37797: ZEND_NULL_HANDLER,
37798: ZEND_CASE_SPEC_CV_CONST_HANDLER,
37799: ZEND_CASE_SPEC_CV_TMP_HANDLER,
37800: ZEND_CASE_SPEC_CV_VAR_HANDLER,
37801: ZEND_NULL_HANDLER,
37802: ZEND_CASE_SPEC_CV_CV_HANDLER,
37803: ZEND_NULL_HANDLER,
37804: ZEND_NULL_HANDLER,
37805: ZEND_NULL_HANDLER,
37806: ZEND_NULL_HANDLER,
37807: ZEND_NULL_HANDLER,
37808: ZEND_NULL_HANDLER,
37809: ZEND_NULL_HANDLER,
37810: ZEND_NULL_HANDLER,
37811: ZEND_NULL_HANDLER,
37812: ZEND_NULL_HANDLER,
37813: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
37814: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
37815: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
37816: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
37817: ZEND_SWITCH_FREE_SPEC_VAR_HANDLER,
37818: ZEND_NULL_HANDLER,
37819: ZEND_NULL_HANDLER,
37820: ZEND_NULL_HANDLER,
37821: ZEND_NULL_HANDLER,
37822: ZEND_NULL_HANDLER,
37823: ZEND_NULL_HANDLER,
37824: ZEND_NULL_HANDLER,
37825: ZEND_NULL_HANDLER,
37826: ZEND_NULL_HANDLER,
37827: ZEND_NULL_HANDLER,
37828: ZEND_BRK_SPEC_CONST_HANDLER,
37829: ZEND_NULL_HANDLER,
1.1.1.2 misho 37830: ZEND_NULL_HANDLER,
37831: ZEND_NULL_HANDLER,
37832: ZEND_NULL_HANDLER,
1.1 misho 37833: ZEND_BRK_SPEC_CONST_HANDLER,
37834: ZEND_NULL_HANDLER,
1.1.1.2 misho 37835: ZEND_NULL_HANDLER,
37836: ZEND_NULL_HANDLER,
37837: ZEND_NULL_HANDLER,
1.1 misho 37838: ZEND_BRK_SPEC_CONST_HANDLER,
37839: ZEND_NULL_HANDLER,
1.1.1.2 misho 37840: ZEND_NULL_HANDLER,
37841: ZEND_NULL_HANDLER,
37842: ZEND_NULL_HANDLER,
1.1 misho 37843: ZEND_BRK_SPEC_CONST_HANDLER,
37844: ZEND_NULL_HANDLER,
1.1.1.2 misho 37845: ZEND_NULL_HANDLER,
37846: ZEND_NULL_HANDLER,
37847: ZEND_NULL_HANDLER,
1.1 misho 37848: ZEND_BRK_SPEC_CONST_HANDLER,
37849: ZEND_NULL_HANDLER,
1.1.1.2 misho 37850: ZEND_NULL_HANDLER,
37851: ZEND_NULL_HANDLER,
37852: ZEND_NULL_HANDLER,
1.1 misho 37853: ZEND_CONT_SPEC_CONST_HANDLER,
37854: ZEND_NULL_HANDLER,
1.1.1.2 misho 37855: ZEND_NULL_HANDLER,
37856: ZEND_NULL_HANDLER,
37857: ZEND_NULL_HANDLER,
1.1 misho 37858: ZEND_CONT_SPEC_CONST_HANDLER,
37859: ZEND_NULL_HANDLER,
1.1.1.2 misho 37860: ZEND_NULL_HANDLER,
37861: ZEND_NULL_HANDLER,
37862: ZEND_NULL_HANDLER,
1.1 misho 37863: ZEND_CONT_SPEC_CONST_HANDLER,
37864: ZEND_NULL_HANDLER,
1.1.1.2 misho 37865: ZEND_NULL_HANDLER,
37866: ZEND_NULL_HANDLER,
37867: ZEND_NULL_HANDLER,
1.1 misho 37868: ZEND_CONT_SPEC_CONST_HANDLER,
37869: ZEND_NULL_HANDLER,
1.1.1.2 misho 37870: ZEND_NULL_HANDLER,
37871: ZEND_NULL_HANDLER,
37872: ZEND_NULL_HANDLER,
1.1 misho 37873: ZEND_CONT_SPEC_CONST_HANDLER,
37874: ZEND_NULL_HANDLER,
1.1.1.2 misho 37875: ZEND_NULL_HANDLER,
37876: ZEND_NULL_HANDLER,
37877: ZEND_NULL_HANDLER,
1.1 misho 37878: ZEND_BOOL_SPEC_CONST_HANDLER,
37879: ZEND_BOOL_SPEC_CONST_HANDLER,
37880: ZEND_BOOL_SPEC_CONST_HANDLER,
37881: ZEND_BOOL_SPEC_CONST_HANDLER,
37882: ZEND_BOOL_SPEC_CONST_HANDLER,
37883: ZEND_BOOL_SPEC_TMP_HANDLER,
37884: ZEND_BOOL_SPEC_TMP_HANDLER,
37885: ZEND_BOOL_SPEC_TMP_HANDLER,
37886: ZEND_BOOL_SPEC_TMP_HANDLER,
37887: ZEND_BOOL_SPEC_TMP_HANDLER,
37888: ZEND_BOOL_SPEC_VAR_HANDLER,
37889: ZEND_BOOL_SPEC_VAR_HANDLER,
37890: ZEND_BOOL_SPEC_VAR_HANDLER,
37891: ZEND_BOOL_SPEC_VAR_HANDLER,
37892: ZEND_BOOL_SPEC_VAR_HANDLER,
37893: ZEND_NULL_HANDLER,
37894: ZEND_NULL_HANDLER,
37895: ZEND_NULL_HANDLER,
37896: ZEND_NULL_HANDLER,
37897: ZEND_NULL_HANDLER,
37898: ZEND_BOOL_SPEC_CV_HANDLER,
37899: ZEND_BOOL_SPEC_CV_HANDLER,
37900: ZEND_BOOL_SPEC_CV_HANDLER,
37901: ZEND_BOOL_SPEC_CV_HANDLER,
37902: ZEND_BOOL_SPEC_CV_HANDLER,
37903: ZEND_INIT_STRING_SPEC_HANDLER,
37904: ZEND_INIT_STRING_SPEC_HANDLER,
37905: ZEND_INIT_STRING_SPEC_HANDLER,
37906: ZEND_INIT_STRING_SPEC_HANDLER,
37907: ZEND_INIT_STRING_SPEC_HANDLER,
37908: ZEND_INIT_STRING_SPEC_HANDLER,
37909: ZEND_INIT_STRING_SPEC_HANDLER,
37910: ZEND_INIT_STRING_SPEC_HANDLER,
37911: ZEND_INIT_STRING_SPEC_HANDLER,
37912: ZEND_INIT_STRING_SPEC_HANDLER,
37913: ZEND_INIT_STRING_SPEC_HANDLER,
37914: ZEND_INIT_STRING_SPEC_HANDLER,
37915: ZEND_INIT_STRING_SPEC_HANDLER,
37916: ZEND_INIT_STRING_SPEC_HANDLER,
37917: ZEND_INIT_STRING_SPEC_HANDLER,
37918: ZEND_INIT_STRING_SPEC_HANDLER,
37919: ZEND_INIT_STRING_SPEC_HANDLER,
37920: ZEND_INIT_STRING_SPEC_HANDLER,
37921: ZEND_INIT_STRING_SPEC_HANDLER,
37922: ZEND_INIT_STRING_SPEC_HANDLER,
37923: ZEND_INIT_STRING_SPEC_HANDLER,
37924: ZEND_INIT_STRING_SPEC_HANDLER,
37925: ZEND_INIT_STRING_SPEC_HANDLER,
37926: ZEND_INIT_STRING_SPEC_HANDLER,
37927: ZEND_INIT_STRING_SPEC_HANDLER,
37928: ZEND_NULL_HANDLER,
37929: ZEND_NULL_HANDLER,
37930: ZEND_NULL_HANDLER,
37931: ZEND_NULL_HANDLER,
37932: ZEND_NULL_HANDLER,
37933: ZEND_ADD_CHAR_SPEC_TMP_CONST_HANDLER,
37934: ZEND_NULL_HANDLER,
37935: ZEND_NULL_HANDLER,
37936: ZEND_NULL_HANDLER,
37937: ZEND_NULL_HANDLER,
37938: ZEND_NULL_HANDLER,
37939: ZEND_NULL_HANDLER,
37940: ZEND_NULL_HANDLER,
37941: ZEND_NULL_HANDLER,
37942: ZEND_NULL_HANDLER,
37943: ZEND_ADD_CHAR_SPEC_UNUSED_CONST_HANDLER,
37944: ZEND_NULL_HANDLER,
37945: ZEND_NULL_HANDLER,
37946: ZEND_NULL_HANDLER,
37947: ZEND_NULL_HANDLER,
37948: ZEND_NULL_HANDLER,
37949: ZEND_NULL_HANDLER,
37950: ZEND_NULL_HANDLER,
37951: ZEND_NULL_HANDLER,
37952: ZEND_NULL_HANDLER,
37953: ZEND_NULL_HANDLER,
37954: ZEND_NULL_HANDLER,
37955: ZEND_NULL_HANDLER,
37956: ZEND_NULL_HANDLER,
37957: ZEND_NULL_HANDLER,
37958: ZEND_ADD_STRING_SPEC_TMP_CONST_HANDLER,
37959: ZEND_NULL_HANDLER,
37960: ZEND_NULL_HANDLER,
37961: ZEND_NULL_HANDLER,
37962: ZEND_NULL_HANDLER,
37963: ZEND_NULL_HANDLER,
37964: ZEND_NULL_HANDLER,
37965: ZEND_NULL_HANDLER,
37966: ZEND_NULL_HANDLER,
37967: ZEND_NULL_HANDLER,
37968: ZEND_ADD_STRING_SPEC_UNUSED_CONST_HANDLER,
37969: ZEND_NULL_HANDLER,
37970: ZEND_NULL_HANDLER,
37971: ZEND_NULL_HANDLER,
37972: ZEND_NULL_HANDLER,
37973: ZEND_NULL_HANDLER,
37974: ZEND_NULL_HANDLER,
37975: ZEND_NULL_HANDLER,
37976: ZEND_NULL_HANDLER,
37977: ZEND_NULL_HANDLER,
37978: ZEND_NULL_HANDLER,
37979: ZEND_NULL_HANDLER,
37980: ZEND_NULL_HANDLER,
37981: ZEND_NULL_HANDLER,
37982: ZEND_NULL_HANDLER,
37983: ZEND_NULL_HANDLER,
37984: ZEND_ADD_VAR_SPEC_TMP_TMP_HANDLER,
37985: ZEND_ADD_VAR_SPEC_TMP_VAR_HANDLER,
37986: ZEND_NULL_HANDLER,
37987: ZEND_ADD_VAR_SPEC_TMP_CV_HANDLER,
37988: ZEND_NULL_HANDLER,
37989: ZEND_NULL_HANDLER,
37990: ZEND_NULL_HANDLER,
37991: ZEND_NULL_HANDLER,
37992: ZEND_NULL_HANDLER,
37993: ZEND_NULL_HANDLER,
37994: ZEND_ADD_VAR_SPEC_UNUSED_TMP_HANDLER,
37995: ZEND_ADD_VAR_SPEC_UNUSED_VAR_HANDLER,
37996: ZEND_NULL_HANDLER,
37997: ZEND_ADD_VAR_SPEC_UNUSED_CV_HANDLER,
37998: ZEND_NULL_HANDLER,
37999: ZEND_NULL_HANDLER,
38000: ZEND_NULL_HANDLER,
38001: ZEND_NULL_HANDLER,
38002: ZEND_NULL_HANDLER,
38003: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38004: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38005: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38006: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38007: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38008: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38009: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38010: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38011: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38012: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38013: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38014: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38015: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38016: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38017: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38018: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38019: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38020: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38021: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38022: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38023: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38024: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38025: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38026: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38027: ZEND_BEGIN_SILENCE_SPEC_HANDLER,
38028: ZEND_NULL_HANDLER,
38029: ZEND_NULL_HANDLER,
38030: ZEND_NULL_HANDLER,
38031: ZEND_NULL_HANDLER,
38032: ZEND_NULL_HANDLER,
38033: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
38034: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
38035: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
38036: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
38037: ZEND_END_SILENCE_SPEC_TMP_HANDLER,
38038: ZEND_NULL_HANDLER,
38039: ZEND_NULL_HANDLER,
38040: ZEND_NULL_HANDLER,
38041: ZEND_NULL_HANDLER,
38042: ZEND_NULL_HANDLER,
38043: ZEND_NULL_HANDLER,
38044: ZEND_NULL_HANDLER,
38045: ZEND_NULL_HANDLER,
38046: ZEND_NULL_HANDLER,
38047: ZEND_NULL_HANDLER,
38048: ZEND_NULL_HANDLER,
38049: ZEND_NULL_HANDLER,
38050: ZEND_NULL_HANDLER,
38051: ZEND_NULL_HANDLER,
38052: ZEND_NULL_HANDLER,
38053: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38054: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
38055: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
38056: ZEND_NULL_HANDLER,
38057: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
38058: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38059: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
38060: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
38061: ZEND_NULL_HANDLER,
38062: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
38063: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38064: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
38065: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
38066: ZEND_NULL_HANDLER,
38067: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
38068: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38069: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
38070: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
38071: ZEND_NULL_HANDLER,
38072: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
38073: ZEND_INIT_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38074: ZEND_INIT_FCALL_BY_NAME_SPEC_TMP_HANDLER,
38075: ZEND_INIT_FCALL_BY_NAME_SPEC_VAR_HANDLER,
38076: ZEND_NULL_HANDLER,
38077: ZEND_INIT_FCALL_BY_NAME_SPEC_CV_HANDLER,
38078: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
38079: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
38080: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
38081: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
38082: ZEND_DO_FCALL_SPEC_CONST_HANDLER,
38083: ZEND_NULL_HANDLER,
38084: ZEND_NULL_HANDLER,
38085: ZEND_NULL_HANDLER,
38086: ZEND_NULL_HANDLER,
38087: ZEND_NULL_HANDLER,
38088: ZEND_NULL_HANDLER,
38089: ZEND_NULL_HANDLER,
38090: ZEND_NULL_HANDLER,
38091: ZEND_NULL_HANDLER,
38092: ZEND_NULL_HANDLER,
38093: ZEND_NULL_HANDLER,
38094: ZEND_NULL_HANDLER,
38095: ZEND_NULL_HANDLER,
38096: ZEND_NULL_HANDLER,
38097: ZEND_NULL_HANDLER,
38098: ZEND_NULL_HANDLER,
38099: ZEND_NULL_HANDLER,
38100: ZEND_NULL_HANDLER,
38101: ZEND_NULL_HANDLER,
38102: ZEND_NULL_HANDLER,
38103: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38104: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38105: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38106: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38107: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38108: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38109: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38110: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38111: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38112: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38113: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38114: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38115: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38116: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38117: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38118: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38119: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38120: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38121: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38122: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38123: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38124: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38125: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38126: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38127: ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER,
38128: ZEND_RETURN_SPEC_CONST_HANDLER,
38129: ZEND_RETURN_SPEC_CONST_HANDLER,
38130: ZEND_RETURN_SPEC_CONST_HANDLER,
38131: ZEND_RETURN_SPEC_CONST_HANDLER,
38132: ZEND_RETURN_SPEC_CONST_HANDLER,
38133: ZEND_RETURN_SPEC_TMP_HANDLER,
38134: ZEND_RETURN_SPEC_TMP_HANDLER,
38135: ZEND_RETURN_SPEC_TMP_HANDLER,
38136: ZEND_RETURN_SPEC_TMP_HANDLER,
38137: ZEND_RETURN_SPEC_TMP_HANDLER,
38138: ZEND_RETURN_SPEC_VAR_HANDLER,
38139: ZEND_RETURN_SPEC_VAR_HANDLER,
38140: ZEND_RETURN_SPEC_VAR_HANDLER,
38141: ZEND_RETURN_SPEC_VAR_HANDLER,
38142: ZEND_RETURN_SPEC_VAR_HANDLER,
38143: ZEND_NULL_HANDLER,
38144: ZEND_NULL_HANDLER,
38145: ZEND_NULL_HANDLER,
38146: ZEND_NULL_HANDLER,
38147: ZEND_NULL_HANDLER,
38148: ZEND_RETURN_SPEC_CV_HANDLER,
38149: ZEND_RETURN_SPEC_CV_HANDLER,
38150: ZEND_RETURN_SPEC_CV_HANDLER,
38151: ZEND_RETURN_SPEC_CV_HANDLER,
38152: ZEND_RETURN_SPEC_CV_HANDLER,
38153: ZEND_RECV_SPEC_HANDLER,
38154: ZEND_RECV_SPEC_HANDLER,
38155: ZEND_RECV_SPEC_HANDLER,
38156: ZEND_RECV_SPEC_HANDLER,
38157: ZEND_RECV_SPEC_HANDLER,
38158: ZEND_RECV_SPEC_HANDLER,
38159: ZEND_RECV_SPEC_HANDLER,
38160: ZEND_RECV_SPEC_HANDLER,
38161: ZEND_RECV_SPEC_HANDLER,
38162: ZEND_RECV_SPEC_HANDLER,
38163: ZEND_RECV_SPEC_HANDLER,
38164: ZEND_RECV_SPEC_HANDLER,
38165: ZEND_RECV_SPEC_HANDLER,
38166: ZEND_RECV_SPEC_HANDLER,
38167: ZEND_RECV_SPEC_HANDLER,
38168: ZEND_RECV_SPEC_HANDLER,
38169: ZEND_RECV_SPEC_HANDLER,
38170: ZEND_RECV_SPEC_HANDLER,
38171: ZEND_RECV_SPEC_HANDLER,
38172: ZEND_RECV_SPEC_HANDLER,
38173: ZEND_RECV_SPEC_HANDLER,
38174: ZEND_RECV_SPEC_HANDLER,
38175: ZEND_RECV_SPEC_HANDLER,
38176: ZEND_RECV_SPEC_HANDLER,
38177: ZEND_RECV_SPEC_HANDLER,
38178: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
38179: ZEND_NULL_HANDLER,
38180: ZEND_NULL_HANDLER,
38181: ZEND_NULL_HANDLER,
38182: ZEND_NULL_HANDLER,
38183: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
38184: ZEND_NULL_HANDLER,
38185: ZEND_NULL_HANDLER,
38186: ZEND_NULL_HANDLER,
38187: ZEND_NULL_HANDLER,
38188: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
38189: ZEND_NULL_HANDLER,
38190: ZEND_NULL_HANDLER,
38191: ZEND_NULL_HANDLER,
38192: ZEND_NULL_HANDLER,
38193: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
38194: ZEND_NULL_HANDLER,
38195: ZEND_NULL_HANDLER,
38196: ZEND_NULL_HANDLER,
38197: ZEND_NULL_HANDLER,
38198: ZEND_RECV_INIT_SPEC_CONST_HANDLER,
38199: ZEND_NULL_HANDLER,
38200: ZEND_NULL_HANDLER,
38201: ZEND_NULL_HANDLER,
38202: ZEND_NULL_HANDLER,
38203: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
38204: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
38205: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
38206: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
38207: ZEND_SEND_VAL_SPEC_CONST_HANDLER,
38208: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
38209: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
38210: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
38211: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
38212: ZEND_SEND_VAL_SPEC_TMP_HANDLER,
38213: ZEND_NULL_HANDLER,
38214: ZEND_NULL_HANDLER,
38215: ZEND_NULL_HANDLER,
38216: ZEND_NULL_HANDLER,
38217: ZEND_NULL_HANDLER,
1.1.1.2 misho 38218: ZEND_NULL_HANDLER,
38219: ZEND_NULL_HANDLER,
38220: ZEND_NULL_HANDLER,
38221: ZEND_NULL_HANDLER,
38222: ZEND_NULL_HANDLER,
38223: ZEND_NULL_HANDLER,
38224: ZEND_NULL_HANDLER,
38225: ZEND_NULL_HANDLER,
38226: ZEND_NULL_HANDLER,
38227: ZEND_NULL_HANDLER,
1.1 misho 38228: ZEND_NULL_HANDLER,
38229: ZEND_NULL_HANDLER,
38230: ZEND_NULL_HANDLER,
38231: ZEND_NULL_HANDLER,
38232: ZEND_NULL_HANDLER,
38233: ZEND_NULL_HANDLER,
38234: ZEND_NULL_HANDLER,
38235: ZEND_NULL_HANDLER,
38236: ZEND_NULL_HANDLER,
38237: ZEND_NULL_HANDLER,
38238: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
38239: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
38240: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
38241: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
38242: ZEND_SEND_VAR_SPEC_VAR_HANDLER,
38243: ZEND_NULL_HANDLER,
38244: ZEND_NULL_HANDLER,
38245: ZEND_NULL_HANDLER,
38246: ZEND_NULL_HANDLER,
38247: ZEND_NULL_HANDLER,
38248: ZEND_SEND_VAR_SPEC_CV_HANDLER,
38249: ZEND_SEND_VAR_SPEC_CV_HANDLER,
38250: ZEND_SEND_VAR_SPEC_CV_HANDLER,
38251: ZEND_SEND_VAR_SPEC_CV_HANDLER,
38252: ZEND_SEND_VAR_SPEC_CV_HANDLER,
38253: ZEND_NULL_HANDLER,
38254: ZEND_NULL_HANDLER,
38255: ZEND_NULL_HANDLER,
38256: ZEND_NULL_HANDLER,
38257: ZEND_NULL_HANDLER,
38258: ZEND_NULL_HANDLER,
38259: ZEND_NULL_HANDLER,
38260: ZEND_NULL_HANDLER,
38261: ZEND_NULL_HANDLER,
38262: ZEND_NULL_HANDLER,
38263: ZEND_SEND_REF_SPEC_VAR_HANDLER,
38264: ZEND_SEND_REF_SPEC_VAR_HANDLER,
38265: ZEND_SEND_REF_SPEC_VAR_HANDLER,
38266: ZEND_SEND_REF_SPEC_VAR_HANDLER,
38267: ZEND_SEND_REF_SPEC_VAR_HANDLER,
38268: ZEND_NULL_HANDLER,
38269: ZEND_NULL_HANDLER,
38270: ZEND_NULL_HANDLER,
38271: ZEND_NULL_HANDLER,
38272: ZEND_NULL_HANDLER,
38273: ZEND_SEND_REF_SPEC_CV_HANDLER,
38274: ZEND_SEND_REF_SPEC_CV_HANDLER,
38275: ZEND_SEND_REF_SPEC_CV_HANDLER,
38276: ZEND_SEND_REF_SPEC_CV_HANDLER,
38277: ZEND_SEND_REF_SPEC_CV_HANDLER,
38278: ZEND_NEW_SPEC_HANDLER,
38279: ZEND_NEW_SPEC_HANDLER,
38280: ZEND_NEW_SPEC_HANDLER,
38281: ZEND_NEW_SPEC_HANDLER,
38282: ZEND_NEW_SPEC_HANDLER,
38283: ZEND_NEW_SPEC_HANDLER,
38284: ZEND_NEW_SPEC_HANDLER,
38285: ZEND_NEW_SPEC_HANDLER,
38286: ZEND_NEW_SPEC_HANDLER,
38287: ZEND_NEW_SPEC_HANDLER,
38288: ZEND_NEW_SPEC_HANDLER,
38289: ZEND_NEW_SPEC_HANDLER,
38290: ZEND_NEW_SPEC_HANDLER,
38291: ZEND_NEW_SPEC_HANDLER,
38292: ZEND_NEW_SPEC_HANDLER,
38293: ZEND_NEW_SPEC_HANDLER,
38294: ZEND_NEW_SPEC_HANDLER,
38295: ZEND_NEW_SPEC_HANDLER,
38296: ZEND_NEW_SPEC_HANDLER,
38297: ZEND_NEW_SPEC_HANDLER,
38298: ZEND_NEW_SPEC_HANDLER,
38299: ZEND_NEW_SPEC_HANDLER,
38300: ZEND_NEW_SPEC_HANDLER,
38301: ZEND_NEW_SPEC_HANDLER,
38302: ZEND_NEW_SPEC_HANDLER,
38303: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38304: ZEND_NULL_HANDLER,
38305: ZEND_NULL_HANDLER,
38306: ZEND_NULL_HANDLER,
38307: ZEND_NULL_HANDLER,
38308: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38309: ZEND_NULL_HANDLER,
38310: ZEND_NULL_HANDLER,
38311: ZEND_NULL_HANDLER,
38312: ZEND_NULL_HANDLER,
38313: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38314: ZEND_NULL_HANDLER,
38315: ZEND_NULL_HANDLER,
38316: ZEND_NULL_HANDLER,
38317: ZEND_NULL_HANDLER,
38318: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38319: ZEND_NULL_HANDLER,
38320: ZEND_NULL_HANDLER,
38321: ZEND_NULL_HANDLER,
38322: ZEND_NULL_HANDLER,
38323: ZEND_INIT_NS_FCALL_BY_NAME_SPEC_CONST_HANDLER,
38324: ZEND_NULL_HANDLER,
38325: ZEND_NULL_HANDLER,
38326: ZEND_NULL_HANDLER,
38327: ZEND_NULL_HANDLER,
38328: ZEND_NULL_HANDLER,
38329: ZEND_NULL_HANDLER,
38330: ZEND_NULL_HANDLER,
38331: ZEND_NULL_HANDLER,
38332: ZEND_NULL_HANDLER,
38333: ZEND_FREE_SPEC_TMP_HANDLER,
38334: ZEND_FREE_SPEC_TMP_HANDLER,
38335: ZEND_FREE_SPEC_TMP_HANDLER,
38336: ZEND_FREE_SPEC_TMP_HANDLER,
38337: ZEND_FREE_SPEC_TMP_HANDLER,
1.1.1.2 misho 38338: ZEND_FREE_SPEC_VAR_HANDLER,
38339: ZEND_FREE_SPEC_VAR_HANDLER,
38340: ZEND_FREE_SPEC_VAR_HANDLER,
38341: ZEND_FREE_SPEC_VAR_HANDLER,
38342: ZEND_FREE_SPEC_VAR_HANDLER,
1.1 misho 38343: ZEND_NULL_HANDLER,
38344: ZEND_NULL_HANDLER,
38345: ZEND_NULL_HANDLER,
38346: ZEND_NULL_HANDLER,
38347: ZEND_NULL_HANDLER,
38348: ZEND_NULL_HANDLER,
38349: ZEND_NULL_HANDLER,
38350: ZEND_NULL_HANDLER,
38351: ZEND_NULL_HANDLER,
38352: ZEND_NULL_HANDLER,
38353: ZEND_INIT_ARRAY_SPEC_CONST_CONST_HANDLER,
38354: ZEND_INIT_ARRAY_SPEC_CONST_TMP_HANDLER,
38355: ZEND_INIT_ARRAY_SPEC_CONST_VAR_HANDLER,
38356: ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_HANDLER,
38357: ZEND_INIT_ARRAY_SPEC_CONST_CV_HANDLER,
38358: ZEND_INIT_ARRAY_SPEC_TMP_CONST_HANDLER,
38359: ZEND_INIT_ARRAY_SPEC_TMP_TMP_HANDLER,
38360: ZEND_INIT_ARRAY_SPEC_TMP_VAR_HANDLER,
38361: ZEND_INIT_ARRAY_SPEC_TMP_UNUSED_HANDLER,
38362: ZEND_INIT_ARRAY_SPEC_TMP_CV_HANDLER,
38363: ZEND_INIT_ARRAY_SPEC_VAR_CONST_HANDLER,
38364: ZEND_INIT_ARRAY_SPEC_VAR_TMP_HANDLER,
38365: ZEND_INIT_ARRAY_SPEC_VAR_VAR_HANDLER,
38366: ZEND_INIT_ARRAY_SPEC_VAR_UNUSED_HANDLER,
38367: ZEND_INIT_ARRAY_SPEC_VAR_CV_HANDLER,
38368: ZEND_INIT_ARRAY_SPEC_UNUSED_CONST_HANDLER,
38369: ZEND_INIT_ARRAY_SPEC_UNUSED_TMP_HANDLER,
38370: ZEND_INIT_ARRAY_SPEC_UNUSED_VAR_HANDLER,
38371: ZEND_INIT_ARRAY_SPEC_UNUSED_UNUSED_HANDLER,
38372: ZEND_INIT_ARRAY_SPEC_UNUSED_CV_HANDLER,
38373: ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER,
38374: ZEND_INIT_ARRAY_SPEC_CV_TMP_HANDLER,
38375: ZEND_INIT_ARRAY_SPEC_CV_VAR_HANDLER,
38376: ZEND_INIT_ARRAY_SPEC_CV_UNUSED_HANDLER,
38377: ZEND_INIT_ARRAY_SPEC_CV_CV_HANDLER,
38378: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER,
38379: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER,
38380: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER,
38381: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER,
38382: ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER,
38383: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER,
38384: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER,
38385: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER,
38386: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER,
38387: ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER,
38388: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER,
38389: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER,
38390: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER,
38391: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER,
38392: ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER,
38393: ZEND_NULL_HANDLER,
38394: ZEND_NULL_HANDLER,
38395: ZEND_NULL_HANDLER,
38396: ZEND_NULL_HANDLER,
38397: ZEND_NULL_HANDLER,
38398: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER,
38399: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER,
38400: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER,
38401: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER,
38402: ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER,
38403: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
38404: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
38405: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
38406: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
38407: ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER,
38408: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
38409: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
38410: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
38411: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
38412: ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER,
38413: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
38414: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
38415: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
38416: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
38417: ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER,
38418: ZEND_NULL_HANDLER,
38419: ZEND_NULL_HANDLER,
38420: ZEND_NULL_HANDLER,
38421: ZEND_NULL_HANDLER,
38422: ZEND_NULL_HANDLER,
38423: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
38424: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
38425: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
38426: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
38427: ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER,
1.1.1.2 misho 38428: ZEND_UNSET_VAR_SPEC_CONST_CONST_HANDLER,
38429: ZEND_NULL_HANDLER,
38430: ZEND_UNSET_VAR_SPEC_CONST_VAR_HANDLER,
38431: ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER,
38432: ZEND_NULL_HANDLER,
38433: ZEND_UNSET_VAR_SPEC_TMP_CONST_HANDLER,
38434: ZEND_NULL_HANDLER,
38435: ZEND_UNSET_VAR_SPEC_TMP_VAR_HANDLER,
38436: ZEND_UNSET_VAR_SPEC_TMP_UNUSED_HANDLER,
38437: ZEND_NULL_HANDLER,
38438: ZEND_UNSET_VAR_SPEC_VAR_CONST_HANDLER,
38439: ZEND_NULL_HANDLER,
38440: ZEND_UNSET_VAR_SPEC_VAR_VAR_HANDLER,
38441: ZEND_UNSET_VAR_SPEC_VAR_UNUSED_HANDLER,
38442: ZEND_NULL_HANDLER,
1.1 misho 38443: ZEND_NULL_HANDLER,
38444: ZEND_NULL_HANDLER,
38445: ZEND_NULL_HANDLER,
38446: ZEND_NULL_HANDLER,
38447: ZEND_NULL_HANDLER,
1.1.1.2 misho 38448: ZEND_UNSET_VAR_SPEC_CV_CONST_HANDLER,
38449: ZEND_NULL_HANDLER,
38450: ZEND_UNSET_VAR_SPEC_CV_VAR_HANDLER,
38451: ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER,
38452: ZEND_NULL_HANDLER,
1.1 misho 38453: ZEND_NULL_HANDLER,
38454: ZEND_NULL_HANDLER,
38455: ZEND_NULL_HANDLER,
38456: ZEND_NULL_HANDLER,
38457: ZEND_NULL_HANDLER,
38458: ZEND_NULL_HANDLER,
38459: ZEND_NULL_HANDLER,
38460: ZEND_NULL_HANDLER,
38461: ZEND_NULL_HANDLER,
38462: ZEND_NULL_HANDLER,
38463: ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDLER,
38464: ZEND_UNSET_DIM_SPEC_VAR_TMP_HANDLER,
38465: ZEND_UNSET_DIM_SPEC_VAR_VAR_HANDLER,
38466: ZEND_NULL_HANDLER,
38467: ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER,
38468: ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HANDLER,
38469: ZEND_UNSET_DIM_SPEC_UNUSED_TMP_HANDLER,
38470: ZEND_UNSET_DIM_SPEC_UNUSED_VAR_HANDLER,
38471: ZEND_NULL_HANDLER,
38472: ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDLER,
38473: ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLER,
38474: ZEND_UNSET_DIM_SPEC_CV_TMP_HANDLER,
38475: ZEND_UNSET_DIM_SPEC_CV_VAR_HANDLER,
38476: ZEND_NULL_HANDLER,
38477: ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER,
38478: ZEND_NULL_HANDLER,
38479: ZEND_NULL_HANDLER,
38480: ZEND_NULL_HANDLER,
38481: ZEND_NULL_HANDLER,
38482: ZEND_NULL_HANDLER,
38483: ZEND_NULL_HANDLER,
38484: ZEND_NULL_HANDLER,
38485: ZEND_NULL_HANDLER,
38486: ZEND_NULL_HANDLER,
38487: ZEND_NULL_HANDLER,
38488: ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDLER,
38489: ZEND_UNSET_OBJ_SPEC_VAR_TMP_HANDLER,
38490: ZEND_UNSET_OBJ_SPEC_VAR_VAR_HANDLER,
38491: ZEND_NULL_HANDLER,
38492: ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER,
38493: ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HANDLER,
38494: ZEND_UNSET_OBJ_SPEC_UNUSED_TMP_HANDLER,
38495: ZEND_UNSET_OBJ_SPEC_UNUSED_VAR_HANDLER,
38496: ZEND_NULL_HANDLER,
38497: ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDLER,
38498: ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLER,
38499: ZEND_UNSET_OBJ_SPEC_CV_TMP_HANDLER,
38500: ZEND_UNSET_OBJ_SPEC_CV_VAR_HANDLER,
38501: ZEND_NULL_HANDLER,
38502: ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER,
38503: ZEND_FE_RESET_SPEC_CONST_HANDLER,
38504: ZEND_FE_RESET_SPEC_CONST_HANDLER,
38505: ZEND_FE_RESET_SPEC_CONST_HANDLER,
38506: ZEND_FE_RESET_SPEC_CONST_HANDLER,
38507: ZEND_FE_RESET_SPEC_CONST_HANDLER,
38508: ZEND_FE_RESET_SPEC_TMP_HANDLER,
38509: ZEND_FE_RESET_SPEC_TMP_HANDLER,
38510: ZEND_FE_RESET_SPEC_TMP_HANDLER,
38511: ZEND_FE_RESET_SPEC_TMP_HANDLER,
38512: ZEND_FE_RESET_SPEC_TMP_HANDLER,
38513: ZEND_FE_RESET_SPEC_VAR_HANDLER,
38514: ZEND_FE_RESET_SPEC_VAR_HANDLER,
38515: ZEND_FE_RESET_SPEC_VAR_HANDLER,
38516: ZEND_FE_RESET_SPEC_VAR_HANDLER,
38517: ZEND_FE_RESET_SPEC_VAR_HANDLER,
38518: ZEND_NULL_HANDLER,
38519: ZEND_NULL_HANDLER,
38520: ZEND_NULL_HANDLER,
38521: ZEND_NULL_HANDLER,
38522: ZEND_NULL_HANDLER,
38523: ZEND_FE_RESET_SPEC_CV_HANDLER,
38524: ZEND_FE_RESET_SPEC_CV_HANDLER,
38525: ZEND_FE_RESET_SPEC_CV_HANDLER,
38526: ZEND_FE_RESET_SPEC_CV_HANDLER,
38527: ZEND_FE_RESET_SPEC_CV_HANDLER,
38528: ZEND_NULL_HANDLER,
38529: ZEND_NULL_HANDLER,
38530: ZEND_NULL_HANDLER,
38531: ZEND_NULL_HANDLER,
38532: ZEND_NULL_HANDLER,
38533: ZEND_NULL_HANDLER,
38534: ZEND_NULL_HANDLER,
38535: ZEND_NULL_HANDLER,
38536: ZEND_NULL_HANDLER,
38537: ZEND_NULL_HANDLER,
38538: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
38539: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
38540: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
38541: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
38542: ZEND_FE_FETCH_SPEC_VAR_HANDLER,
38543: ZEND_NULL_HANDLER,
38544: ZEND_NULL_HANDLER,
38545: ZEND_NULL_HANDLER,
38546: ZEND_NULL_HANDLER,
38547: ZEND_NULL_HANDLER,
38548: ZEND_NULL_HANDLER,
38549: ZEND_NULL_HANDLER,
38550: ZEND_NULL_HANDLER,
38551: ZEND_NULL_HANDLER,
38552: ZEND_NULL_HANDLER,
38553: ZEND_EXIT_SPEC_CONST_HANDLER,
38554: ZEND_EXIT_SPEC_CONST_HANDLER,
38555: ZEND_EXIT_SPEC_CONST_HANDLER,
38556: ZEND_EXIT_SPEC_CONST_HANDLER,
38557: ZEND_EXIT_SPEC_CONST_HANDLER,
38558: ZEND_EXIT_SPEC_TMP_HANDLER,
38559: ZEND_EXIT_SPEC_TMP_HANDLER,
38560: ZEND_EXIT_SPEC_TMP_HANDLER,
38561: ZEND_EXIT_SPEC_TMP_HANDLER,
38562: ZEND_EXIT_SPEC_TMP_HANDLER,
38563: ZEND_EXIT_SPEC_VAR_HANDLER,
38564: ZEND_EXIT_SPEC_VAR_HANDLER,
38565: ZEND_EXIT_SPEC_VAR_HANDLER,
38566: ZEND_EXIT_SPEC_VAR_HANDLER,
38567: ZEND_EXIT_SPEC_VAR_HANDLER,
38568: ZEND_EXIT_SPEC_UNUSED_HANDLER,
38569: ZEND_EXIT_SPEC_UNUSED_HANDLER,
38570: ZEND_EXIT_SPEC_UNUSED_HANDLER,
38571: ZEND_EXIT_SPEC_UNUSED_HANDLER,
38572: ZEND_EXIT_SPEC_UNUSED_HANDLER,
38573: ZEND_EXIT_SPEC_CV_HANDLER,
38574: ZEND_EXIT_SPEC_CV_HANDLER,
38575: ZEND_EXIT_SPEC_CV_HANDLER,
38576: ZEND_EXIT_SPEC_CV_HANDLER,
38577: ZEND_EXIT_SPEC_CV_HANDLER,
1.1.1.2 misho 38578: ZEND_FETCH_R_SPEC_CONST_CONST_HANDLER,
38579: ZEND_NULL_HANDLER,
38580: ZEND_FETCH_R_SPEC_CONST_VAR_HANDLER,
38581: ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER,
38582: ZEND_NULL_HANDLER,
38583: ZEND_FETCH_R_SPEC_TMP_CONST_HANDLER,
38584: ZEND_NULL_HANDLER,
38585: ZEND_FETCH_R_SPEC_TMP_VAR_HANDLER,
38586: ZEND_FETCH_R_SPEC_TMP_UNUSED_HANDLER,
38587: ZEND_NULL_HANDLER,
38588: ZEND_FETCH_R_SPEC_VAR_CONST_HANDLER,
38589: ZEND_NULL_HANDLER,
38590: ZEND_FETCH_R_SPEC_VAR_VAR_HANDLER,
38591: ZEND_FETCH_R_SPEC_VAR_UNUSED_HANDLER,
38592: ZEND_NULL_HANDLER,
1.1 misho 38593: ZEND_NULL_HANDLER,
38594: ZEND_NULL_HANDLER,
38595: ZEND_NULL_HANDLER,
38596: ZEND_NULL_HANDLER,
38597: ZEND_NULL_HANDLER,
1.1.1.2 misho 38598: ZEND_FETCH_R_SPEC_CV_CONST_HANDLER,
38599: ZEND_NULL_HANDLER,
38600: ZEND_FETCH_R_SPEC_CV_VAR_HANDLER,
38601: ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER,
38602: ZEND_NULL_HANDLER,
1.1 misho 38603: ZEND_NULL_HANDLER,
38604: ZEND_NULL_HANDLER,
38605: ZEND_NULL_HANDLER,
38606: ZEND_NULL_HANDLER,
38607: ZEND_NULL_HANDLER,
38608: ZEND_NULL_HANDLER,
38609: ZEND_NULL_HANDLER,
38610: ZEND_NULL_HANDLER,
38611: ZEND_NULL_HANDLER,
38612: ZEND_NULL_HANDLER,
38613: ZEND_FETCH_DIM_R_SPEC_VAR_CONST_HANDLER,
38614: ZEND_FETCH_DIM_R_SPEC_VAR_TMP_HANDLER,
38615: ZEND_FETCH_DIM_R_SPEC_VAR_VAR_HANDLER,
38616: ZEND_NULL_HANDLER,
38617: ZEND_FETCH_DIM_R_SPEC_VAR_CV_HANDLER,
38618: ZEND_NULL_HANDLER,
38619: ZEND_NULL_HANDLER,
38620: ZEND_NULL_HANDLER,
38621: ZEND_NULL_HANDLER,
38622: ZEND_NULL_HANDLER,
38623: ZEND_FETCH_DIM_R_SPEC_CV_CONST_HANDLER,
38624: ZEND_FETCH_DIM_R_SPEC_CV_TMP_HANDLER,
38625: ZEND_FETCH_DIM_R_SPEC_CV_VAR_HANDLER,
38626: ZEND_NULL_HANDLER,
38627: ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER,
38628: ZEND_NULL_HANDLER,
38629: ZEND_NULL_HANDLER,
38630: ZEND_NULL_HANDLER,
38631: ZEND_NULL_HANDLER,
38632: ZEND_NULL_HANDLER,
38633: ZEND_NULL_HANDLER,
38634: ZEND_NULL_HANDLER,
38635: ZEND_NULL_HANDLER,
38636: ZEND_NULL_HANDLER,
38637: ZEND_NULL_HANDLER,
38638: ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HANDLER,
38639: ZEND_FETCH_OBJ_R_SPEC_VAR_TMP_HANDLER,
38640: ZEND_FETCH_OBJ_R_SPEC_VAR_VAR_HANDLER,
38641: ZEND_NULL_HANDLER,
38642: ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLER,
38643: ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER,
38644: ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMP_HANDLER,
38645: ZEND_FETCH_OBJ_R_SPEC_UNUSED_VAR_HANDLER,
38646: ZEND_NULL_HANDLER,
38647: ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER,
38648: ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HANDLER,
38649: ZEND_FETCH_OBJ_R_SPEC_CV_TMP_HANDLER,
38650: ZEND_FETCH_OBJ_R_SPEC_CV_VAR_HANDLER,
38651: ZEND_NULL_HANDLER,
38652: ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER,
1.1.1.2 misho 38653: ZEND_FETCH_W_SPEC_CONST_CONST_HANDLER,
38654: ZEND_NULL_HANDLER,
38655: ZEND_FETCH_W_SPEC_CONST_VAR_HANDLER,
38656: ZEND_FETCH_W_SPEC_CONST_UNUSED_HANDLER,
38657: ZEND_NULL_HANDLER,
38658: ZEND_FETCH_W_SPEC_TMP_CONST_HANDLER,
38659: ZEND_NULL_HANDLER,
38660: ZEND_FETCH_W_SPEC_TMP_VAR_HANDLER,
38661: ZEND_FETCH_W_SPEC_TMP_UNUSED_HANDLER,
38662: ZEND_NULL_HANDLER,
38663: ZEND_FETCH_W_SPEC_VAR_CONST_HANDLER,
38664: ZEND_NULL_HANDLER,
38665: ZEND_FETCH_W_SPEC_VAR_VAR_HANDLER,
38666: ZEND_FETCH_W_SPEC_VAR_UNUSED_HANDLER,
38667: ZEND_NULL_HANDLER,
1.1 misho 38668: ZEND_NULL_HANDLER,
38669: ZEND_NULL_HANDLER,
38670: ZEND_NULL_HANDLER,
38671: ZEND_NULL_HANDLER,
38672: ZEND_NULL_HANDLER,
1.1.1.2 misho 38673: ZEND_FETCH_W_SPEC_CV_CONST_HANDLER,
38674: ZEND_NULL_HANDLER,
38675: ZEND_FETCH_W_SPEC_CV_VAR_HANDLER,
38676: ZEND_FETCH_W_SPEC_CV_UNUSED_HANDLER,
38677: ZEND_NULL_HANDLER,
1.1 misho 38678: ZEND_NULL_HANDLER,
38679: ZEND_NULL_HANDLER,
38680: ZEND_NULL_HANDLER,
38681: ZEND_NULL_HANDLER,
38682: ZEND_NULL_HANDLER,
38683: ZEND_NULL_HANDLER,
38684: ZEND_NULL_HANDLER,
38685: ZEND_NULL_HANDLER,
38686: ZEND_NULL_HANDLER,
38687: ZEND_NULL_HANDLER,
38688: ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER,
38689: ZEND_FETCH_DIM_W_SPEC_VAR_TMP_HANDLER,
38690: ZEND_FETCH_DIM_W_SPEC_VAR_VAR_HANDLER,
38691: ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER,
38692: ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER,
38693: ZEND_NULL_HANDLER,
38694: ZEND_NULL_HANDLER,
38695: ZEND_NULL_HANDLER,
38696: ZEND_NULL_HANDLER,
38697: ZEND_NULL_HANDLER,
38698: ZEND_FETCH_DIM_W_SPEC_CV_CONST_HANDLER,
38699: ZEND_FETCH_DIM_W_SPEC_CV_TMP_HANDLER,
38700: ZEND_FETCH_DIM_W_SPEC_CV_VAR_HANDLER,
38701: ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HANDLER,
38702: ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER,
38703: ZEND_NULL_HANDLER,
38704: ZEND_NULL_HANDLER,
38705: ZEND_NULL_HANDLER,
38706: ZEND_NULL_HANDLER,
38707: ZEND_NULL_HANDLER,
38708: ZEND_NULL_HANDLER,
38709: ZEND_NULL_HANDLER,
38710: ZEND_NULL_HANDLER,
38711: ZEND_NULL_HANDLER,
38712: ZEND_NULL_HANDLER,
38713: ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HANDLER,
38714: ZEND_FETCH_OBJ_W_SPEC_VAR_TMP_HANDLER,
38715: ZEND_FETCH_OBJ_W_SPEC_VAR_VAR_HANDLER,
38716: ZEND_NULL_HANDLER,
38717: ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLER,
38718: ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER,
38719: ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMP_HANDLER,
38720: ZEND_FETCH_OBJ_W_SPEC_UNUSED_VAR_HANDLER,
38721: ZEND_NULL_HANDLER,
38722: ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER,
38723: ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER,
38724: ZEND_FETCH_OBJ_W_SPEC_CV_TMP_HANDLER,
38725: ZEND_FETCH_OBJ_W_SPEC_CV_VAR_HANDLER,
38726: ZEND_NULL_HANDLER,
38727: ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER,
1.1.1.2 misho 38728: ZEND_FETCH_RW_SPEC_CONST_CONST_HANDLER,
38729: ZEND_NULL_HANDLER,
38730: ZEND_FETCH_RW_SPEC_CONST_VAR_HANDLER,
38731: ZEND_FETCH_RW_SPEC_CONST_UNUSED_HANDLER,
38732: ZEND_NULL_HANDLER,
38733: ZEND_FETCH_RW_SPEC_TMP_CONST_HANDLER,
38734: ZEND_NULL_HANDLER,
38735: ZEND_FETCH_RW_SPEC_TMP_VAR_HANDLER,
38736: ZEND_FETCH_RW_SPEC_TMP_UNUSED_HANDLER,
38737: ZEND_NULL_HANDLER,
38738: ZEND_FETCH_RW_SPEC_VAR_CONST_HANDLER,
38739: ZEND_NULL_HANDLER,
38740: ZEND_FETCH_RW_SPEC_VAR_VAR_HANDLER,
38741: ZEND_FETCH_RW_SPEC_VAR_UNUSED_HANDLER,
38742: ZEND_NULL_HANDLER,
1.1 misho 38743: ZEND_NULL_HANDLER,
38744: ZEND_NULL_HANDLER,
38745: ZEND_NULL_HANDLER,
38746: ZEND_NULL_HANDLER,
38747: ZEND_NULL_HANDLER,
1.1.1.2 misho 38748: ZEND_FETCH_RW_SPEC_CV_CONST_HANDLER,
38749: ZEND_NULL_HANDLER,
38750: ZEND_FETCH_RW_SPEC_CV_VAR_HANDLER,
38751: ZEND_FETCH_RW_SPEC_CV_UNUSED_HANDLER,
38752: ZEND_NULL_HANDLER,
1.1 misho 38753: ZEND_NULL_HANDLER,
38754: ZEND_NULL_HANDLER,
38755: ZEND_NULL_HANDLER,
38756: ZEND_NULL_HANDLER,
38757: ZEND_NULL_HANDLER,
38758: ZEND_NULL_HANDLER,
38759: ZEND_NULL_HANDLER,
38760: ZEND_NULL_HANDLER,
38761: ZEND_NULL_HANDLER,
38762: ZEND_NULL_HANDLER,
38763: ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HANDLER,
38764: ZEND_FETCH_DIM_RW_SPEC_VAR_TMP_HANDLER,
38765: ZEND_FETCH_DIM_RW_SPEC_VAR_VAR_HANDLER,
38766: ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_HANDLER,
38767: ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDLER,
38768: ZEND_NULL_HANDLER,
38769: ZEND_NULL_HANDLER,
38770: ZEND_NULL_HANDLER,
38771: ZEND_NULL_HANDLER,
38772: ZEND_NULL_HANDLER,
38773: ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HANDLER,
38774: ZEND_FETCH_DIM_RW_SPEC_CV_TMP_HANDLER,
38775: ZEND_FETCH_DIM_RW_SPEC_CV_VAR_HANDLER,
38776: ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HANDLER,
38777: ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLER,
38778: ZEND_NULL_HANDLER,
38779: ZEND_NULL_HANDLER,
38780: ZEND_NULL_HANDLER,
38781: ZEND_NULL_HANDLER,
38782: ZEND_NULL_HANDLER,
38783: ZEND_NULL_HANDLER,
38784: ZEND_NULL_HANDLER,
38785: ZEND_NULL_HANDLER,
38786: ZEND_NULL_HANDLER,
38787: ZEND_NULL_HANDLER,
38788: ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HANDLER,
38789: ZEND_FETCH_OBJ_RW_SPEC_VAR_TMP_HANDLER,
38790: ZEND_FETCH_OBJ_RW_SPEC_VAR_VAR_HANDLER,
38791: ZEND_NULL_HANDLER,
38792: ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDLER,
38793: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST_HANDLER,
38794: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMP_HANDLER,
38795: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_VAR_HANDLER,
38796: ZEND_NULL_HANDLER,
38797: ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HANDLER,
38798: ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HANDLER,
38799: ZEND_FETCH_OBJ_RW_SPEC_CV_TMP_HANDLER,
38800: ZEND_FETCH_OBJ_RW_SPEC_CV_VAR_HANDLER,
38801: ZEND_NULL_HANDLER,
38802: ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLER,
1.1.1.2 misho 38803: ZEND_FETCH_IS_SPEC_CONST_CONST_HANDLER,
38804: ZEND_NULL_HANDLER,
38805: ZEND_FETCH_IS_SPEC_CONST_VAR_HANDLER,
38806: ZEND_FETCH_IS_SPEC_CONST_UNUSED_HANDLER,
38807: ZEND_NULL_HANDLER,
38808: ZEND_FETCH_IS_SPEC_TMP_CONST_HANDLER,
38809: ZEND_NULL_HANDLER,
38810: ZEND_FETCH_IS_SPEC_TMP_VAR_HANDLER,
38811: ZEND_FETCH_IS_SPEC_TMP_UNUSED_HANDLER,
38812: ZEND_NULL_HANDLER,
38813: ZEND_FETCH_IS_SPEC_VAR_CONST_HANDLER,
38814: ZEND_NULL_HANDLER,
38815: ZEND_FETCH_IS_SPEC_VAR_VAR_HANDLER,
38816: ZEND_FETCH_IS_SPEC_VAR_UNUSED_HANDLER,
38817: ZEND_NULL_HANDLER,
1.1 misho 38818: ZEND_NULL_HANDLER,
38819: ZEND_NULL_HANDLER,
38820: ZEND_NULL_HANDLER,
38821: ZEND_NULL_HANDLER,
38822: ZEND_NULL_HANDLER,
1.1.1.2 misho 38823: ZEND_FETCH_IS_SPEC_CV_CONST_HANDLER,
38824: ZEND_NULL_HANDLER,
38825: ZEND_FETCH_IS_SPEC_CV_VAR_HANDLER,
38826: ZEND_FETCH_IS_SPEC_CV_UNUSED_HANDLER,
38827: ZEND_NULL_HANDLER,
1.1 misho 38828: ZEND_NULL_HANDLER,
38829: ZEND_NULL_HANDLER,
38830: ZEND_NULL_HANDLER,
38831: ZEND_NULL_HANDLER,
38832: ZEND_NULL_HANDLER,
38833: ZEND_NULL_HANDLER,
38834: ZEND_NULL_HANDLER,
38835: ZEND_NULL_HANDLER,
38836: ZEND_NULL_HANDLER,
38837: ZEND_NULL_HANDLER,
38838: ZEND_FETCH_DIM_IS_SPEC_VAR_CONST_HANDLER,
38839: ZEND_FETCH_DIM_IS_SPEC_VAR_TMP_HANDLER,
38840: ZEND_FETCH_DIM_IS_SPEC_VAR_VAR_HANDLER,
38841: ZEND_NULL_HANDLER,
38842: ZEND_FETCH_DIM_IS_SPEC_VAR_CV_HANDLER,
38843: ZEND_NULL_HANDLER,
38844: ZEND_NULL_HANDLER,
38845: ZEND_NULL_HANDLER,
38846: ZEND_NULL_HANDLER,
38847: ZEND_NULL_HANDLER,
38848: ZEND_FETCH_DIM_IS_SPEC_CV_CONST_HANDLER,
38849: ZEND_FETCH_DIM_IS_SPEC_CV_TMP_HANDLER,
38850: ZEND_FETCH_DIM_IS_SPEC_CV_VAR_HANDLER,
38851: ZEND_NULL_HANDLER,
38852: ZEND_FETCH_DIM_IS_SPEC_CV_CV_HANDLER,
38853: ZEND_NULL_HANDLER,
38854: ZEND_NULL_HANDLER,
38855: ZEND_NULL_HANDLER,
38856: ZEND_NULL_HANDLER,
38857: ZEND_NULL_HANDLER,
38858: ZEND_NULL_HANDLER,
38859: ZEND_NULL_HANDLER,
38860: ZEND_NULL_HANDLER,
38861: ZEND_NULL_HANDLER,
38862: ZEND_NULL_HANDLER,
38863: ZEND_FETCH_OBJ_IS_SPEC_VAR_CONST_HANDLER,
38864: ZEND_FETCH_OBJ_IS_SPEC_VAR_TMP_HANDLER,
38865: ZEND_FETCH_OBJ_IS_SPEC_VAR_VAR_HANDLER,
38866: ZEND_NULL_HANDLER,
38867: ZEND_FETCH_OBJ_IS_SPEC_VAR_CV_HANDLER,
38868: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST_HANDLER,
38869: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMP_HANDLER,
38870: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_VAR_HANDLER,
38871: ZEND_NULL_HANDLER,
38872: ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HANDLER,
38873: ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HANDLER,
38874: ZEND_FETCH_OBJ_IS_SPEC_CV_TMP_HANDLER,
38875: ZEND_FETCH_OBJ_IS_SPEC_CV_VAR_HANDLER,
38876: ZEND_NULL_HANDLER,
38877: ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLER,
1.1.1.2 misho 38878: ZEND_FETCH_FUNC_ARG_SPEC_CONST_CONST_HANDLER,
38879: ZEND_NULL_HANDLER,
38880: ZEND_FETCH_FUNC_ARG_SPEC_CONST_VAR_HANDLER,
38881: ZEND_FETCH_FUNC_ARG_SPEC_CONST_UNUSED_HANDLER,
38882: ZEND_NULL_HANDLER,
38883: ZEND_FETCH_FUNC_ARG_SPEC_TMP_CONST_HANDLER,
38884: ZEND_NULL_HANDLER,
38885: ZEND_FETCH_FUNC_ARG_SPEC_TMP_VAR_HANDLER,
38886: ZEND_FETCH_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER,
38887: ZEND_NULL_HANDLER,
38888: ZEND_FETCH_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
38889: ZEND_NULL_HANDLER,
38890: ZEND_FETCH_FUNC_ARG_SPEC_VAR_VAR_HANDLER,
38891: ZEND_FETCH_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER,
38892: ZEND_NULL_HANDLER,
1.1 misho 38893: ZEND_NULL_HANDLER,
38894: ZEND_NULL_HANDLER,
38895: ZEND_NULL_HANDLER,
38896: ZEND_NULL_HANDLER,
38897: ZEND_NULL_HANDLER,
1.1.1.2 misho 38898: ZEND_FETCH_FUNC_ARG_SPEC_CV_CONST_HANDLER,
38899: ZEND_NULL_HANDLER,
38900: ZEND_FETCH_FUNC_ARG_SPEC_CV_VAR_HANDLER,
38901: ZEND_FETCH_FUNC_ARG_SPEC_CV_UNUSED_HANDLER,
38902: ZEND_NULL_HANDLER,
1.1 misho 38903: ZEND_NULL_HANDLER,
38904: ZEND_NULL_HANDLER,
38905: ZEND_NULL_HANDLER,
38906: ZEND_NULL_HANDLER,
38907: ZEND_NULL_HANDLER,
38908: ZEND_NULL_HANDLER,
38909: ZEND_NULL_HANDLER,
38910: ZEND_NULL_HANDLER,
38911: ZEND_NULL_HANDLER,
38912: ZEND_NULL_HANDLER,
38913: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
38914: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TMP_HANDLER,
38915: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_VAR_HANDLER,
38916: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UNUSED_HANDLER,
38917: ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV_HANDLER,
38918: ZEND_NULL_HANDLER,
38919: ZEND_NULL_HANDLER,
38920: ZEND_NULL_HANDLER,
38921: ZEND_NULL_HANDLER,
38922: ZEND_NULL_HANDLER,
38923: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CONST_HANDLER,
38924: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP_HANDLER,
38925: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_VAR_HANDLER,
38926: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNUSED_HANDLER,
38927: ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_HANDLER,
38928: ZEND_NULL_HANDLER,
38929: ZEND_NULL_HANDLER,
38930: ZEND_NULL_HANDLER,
38931: ZEND_NULL_HANDLER,
38932: ZEND_NULL_HANDLER,
38933: ZEND_NULL_HANDLER,
38934: ZEND_NULL_HANDLER,
38935: ZEND_NULL_HANDLER,
38936: ZEND_NULL_HANDLER,
38937: ZEND_NULL_HANDLER,
38938: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CONST_HANDLER,
38939: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TMP_HANDLER,
38940: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_VAR_HANDLER,
38941: ZEND_NULL_HANDLER,
38942: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV_HANDLER,
38943: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER,
38944: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMP_HANDLER,
38945: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_VAR_HANDLER,
38946: ZEND_NULL_HANDLER,
38947: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER,
38948: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER,
38949: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP_HANDLER,
38950: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_VAR_HANDLER,
38951: ZEND_NULL_HANDLER,
38952: ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER,
1.1.1.2 misho 38953: ZEND_FETCH_UNSET_SPEC_CONST_CONST_HANDLER,
38954: ZEND_NULL_HANDLER,
38955: ZEND_FETCH_UNSET_SPEC_CONST_VAR_HANDLER,
38956: ZEND_FETCH_UNSET_SPEC_CONST_UNUSED_HANDLER,
38957: ZEND_NULL_HANDLER,
38958: ZEND_FETCH_UNSET_SPEC_TMP_CONST_HANDLER,
38959: ZEND_NULL_HANDLER,
38960: ZEND_FETCH_UNSET_SPEC_TMP_VAR_HANDLER,
38961: ZEND_FETCH_UNSET_SPEC_TMP_UNUSED_HANDLER,
38962: ZEND_NULL_HANDLER,
38963: ZEND_FETCH_UNSET_SPEC_VAR_CONST_HANDLER,
38964: ZEND_NULL_HANDLER,
38965: ZEND_FETCH_UNSET_SPEC_VAR_VAR_HANDLER,
38966: ZEND_FETCH_UNSET_SPEC_VAR_UNUSED_HANDLER,
38967: ZEND_NULL_HANDLER,
1.1 misho 38968: ZEND_NULL_HANDLER,
38969: ZEND_NULL_HANDLER,
38970: ZEND_NULL_HANDLER,
38971: ZEND_NULL_HANDLER,
38972: ZEND_NULL_HANDLER,
1.1.1.2 misho 38973: ZEND_FETCH_UNSET_SPEC_CV_CONST_HANDLER,
38974: ZEND_NULL_HANDLER,
38975: ZEND_FETCH_UNSET_SPEC_CV_VAR_HANDLER,
38976: ZEND_FETCH_UNSET_SPEC_CV_UNUSED_HANDLER,
38977: ZEND_NULL_HANDLER,
1.1 misho 38978: ZEND_NULL_HANDLER,
38979: ZEND_NULL_HANDLER,
38980: ZEND_NULL_HANDLER,
38981: ZEND_NULL_HANDLER,
38982: ZEND_NULL_HANDLER,
38983: ZEND_NULL_HANDLER,
38984: ZEND_NULL_HANDLER,
38985: ZEND_NULL_HANDLER,
38986: ZEND_NULL_HANDLER,
38987: ZEND_NULL_HANDLER,
38988: ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST_HANDLER,
38989: ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMP_HANDLER,
38990: ZEND_FETCH_DIM_UNSET_SPEC_VAR_VAR_HANDLER,
38991: ZEND_NULL_HANDLER,
38992: ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HANDLER,
38993: ZEND_NULL_HANDLER,
38994: ZEND_NULL_HANDLER,
38995: ZEND_NULL_HANDLER,
38996: ZEND_NULL_HANDLER,
38997: ZEND_NULL_HANDLER,
38998: ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_HANDLER,
38999: ZEND_FETCH_DIM_UNSET_SPEC_CV_TMP_HANDLER,
39000: ZEND_FETCH_DIM_UNSET_SPEC_CV_VAR_HANDLER,
39001: ZEND_NULL_HANDLER,
39002: ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HANDLER,
39003: ZEND_NULL_HANDLER,
39004: ZEND_NULL_HANDLER,
39005: ZEND_NULL_HANDLER,
39006: ZEND_NULL_HANDLER,
39007: ZEND_NULL_HANDLER,
39008: ZEND_NULL_HANDLER,
39009: ZEND_NULL_HANDLER,
39010: ZEND_NULL_HANDLER,
39011: ZEND_NULL_HANDLER,
39012: ZEND_NULL_HANDLER,
39013: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER,
39014: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER,
39015: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER,
39016: ZEND_NULL_HANDLER,
39017: ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER,
39018: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER,
39019: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER,
39020: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER,
39021: ZEND_NULL_HANDLER,
39022: ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER,
39023: ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER,
39024: ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMP_HANDLER,
39025: ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER,
39026: ZEND_NULL_HANDLER,
39027: ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER,
39028: ZEND_FETCH_DIM_TMP_VAR_SPEC_CONST_CONST_HANDLER,
39029: ZEND_NULL_HANDLER,
39030: ZEND_NULL_HANDLER,
39031: ZEND_NULL_HANDLER,
39032: ZEND_NULL_HANDLER,
39033: ZEND_FETCH_DIM_TMP_VAR_SPEC_TMP_CONST_HANDLER,
39034: ZEND_NULL_HANDLER,
39035: ZEND_NULL_HANDLER,
39036: ZEND_NULL_HANDLER,
39037: ZEND_NULL_HANDLER,
39038: ZEND_NULL_HANDLER,
39039: ZEND_NULL_HANDLER,
39040: ZEND_NULL_HANDLER,
39041: ZEND_NULL_HANDLER,
39042: ZEND_NULL_HANDLER,
39043: ZEND_NULL_HANDLER,
39044: ZEND_NULL_HANDLER,
39045: ZEND_NULL_HANDLER,
39046: ZEND_NULL_HANDLER,
39047: ZEND_NULL_HANDLER,
39048: ZEND_NULL_HANDLER,
39049: ZEND_NULL_HANDLER,
39050: ZEND_NULL_HANDLER,
39051: ZEND_NULL_HANDLER,
39052: ZEND_NULL_HANDLER,
39053: ZEND_FETCH_CONSTANT_SPEC_CONST_CONST_HANDLER,
39054: ZEND_NULL_HANDLER,
39055: ZEND_NULL_HANDLER,
39056: ZEND_NULL_HANDLER,
39057: ZEND_NULL_HANDLER,
39058: ZEND_NULL_HANDLER,
39059: ZEND_NULL_HANDLER,
39060: ZEND_NULL_HANDLER,
39061: ZEND_NULL_HANDLER,
39062: ZEND_NULL_HANDLER,
39063: ZEND_FETCH_CONSTANT_SPEC_VAR_CONST_HANDLER,
39064: ZEND_NULL_HANDLER,
39065: ZEND_NULL_HANDLER,
39066: ZEND_NULL_HANDLER,
39067: ZEND_NULL_HANDLER,
39068: ZEND_FETCH_CONSTANT_SPEC_UNUSED_CONST_HANDLER,
39069: ZEND_NULL_HANDLER,
39070: ZEND_NULL_HANDLER,
39071: ZEND_NULL_HANDLER,
39072: ZEND_NULL_HANDLER,
39073: ZEND_NULL_HANDLER,
39074: ZEND_NULL_HANDLER,
39075: ZEND_NULL_HANDLER,
39076: ZEND_NULL_HANDLER,
39077: ZEND_NULL_HANDLER,
39078: ZEND_GOTO_SPEC_CONST_HANDLER,
39079: ZEND_NULL_HANDLER,
39080: ZEND_NULL_HANDLER,
39081: ZEND_NULL_HANDLER,
39082: ZEND_NULL_HANDLER,
39083: ZEND_GOTO_SPEC_CONST_HANDLER,
39084: ZEND_NULL_HANDLER,
39085: ZEND_NULL_HANDLER,
39086: ZEND_NULL_HANDLER,
39087: ZEND_NULL_HANDLER,
39088: ZEND_GOTO_SPEC_CONST_HANDLER,
39089: ZEND_NULL_HANDLER,
39090: ZEND_NULL_HANDLER,
39091: ZEND_NULL_HANDLER,
39092: ZEND_NULL_HANDLER,
39093: ZEND_GOTO_SPEC_CONST_HANDLER,
39094: ZEND_NULL_HANDLER,
39095: ZEND_NULL_HANDLER,
39096: ZEND_NULL_HANDLER,
39097: ZEND_NULL_HANDLER,
39098: ZEND_GOTO_SPEC_CONST_HANDLER,
39099: ZEND_NULL_HANDLER,
39100: ZEND_NULL_HANDLER,
39101: ZEND_NULL_HANDLER,
39102: ZEND_NULL_HANDLER,
39103: ZEND_EXT_STMT_SPEC_HANDLER,
39104: ZEND_EXT_STMT_SPEC_HANDLER,
39105: ZEND_EXT_STMT_SPEC_HANDLER,
39106: ZEND_EXT_STMT_SPEC_HANDLER,
39107: ZEND_EXT_STMT_SPEC_HANDLER,
39108: ZEND_EXT_STMT_SPEC_HANDLER,
39109: ZEND_EXT_STMT_SPEC_HANDLER,
39110: ZEND_EXT_STMT_SPEC_HANDLER,
39111: ZEND_EXT_STMT_SPEC_HANDLER,
39112: ZEND_EXT_STMT_SPEC_HANDLER,
39113: ZEND_EXT_STMT_SPEC_HANDLER,
39114: ZEND_EXT_STMT_SPEC_HANDLER,
39115: ZEND_EXT_STMT_SPEC_HANDLER,
39116: ZEND_EXT_STMT_SPEC_HANDLER,
39117: ZEND_EXT_STMT_SPEC_HANDLER,
39118: ZEND_EXT_STMT_SPEC_HANDLER,
39119: ZEND_EXT_STMT_SPEC_HANDLER,
39120: ZEND_EXT_STMT_SPEC_HANDLER,
39121: ZEND_EXT_STMT_SPEC_HANDLER,
39122: ZEND_EXT_STMT_SPEC_HANDLER,
39123: ZEND_EXT_STMT_SPEC_HANDLER,
39124: ZEND_EXT_STMT_SPEC_HANDLER,
39125: ZEND_EXT_STMT_SPEC_HANDLER,
39126: ZEND_EXT_STMT_SPEC_HANDLER,
39127: ZEND_EXT_STMT_SPEC_HANDLER,
39128: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39129: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39130: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39131: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39132: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39133: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39134: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39135: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39136: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39137: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39138: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39139: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39140: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39141: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39142: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39143: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39144: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39145: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39146: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39147: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39148: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39149: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39150: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39151: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39152: ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER,
39153: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39154: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39155: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39156: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39157: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39158: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39159: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39160: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39161: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39162: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39163: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39164: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39165: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39166: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39167: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39168: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39169: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39170: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39171: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39172: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39173: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39174: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39175: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39176: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39177: ZEND_EXT_FCALL_END_SPEC_HANDLER,
39178: ZEND_EXT_NOP_SPEC_HANDLER,
39179: ZEND_EXT_NOP_SPEC_HANDLER,
39180: ZEND_EXT_NOP_SPEC_HANDLER,
39181: ZEND_EXT_NOP_SPEC_HANDLER,
39182: ZEND_EXT_NOP_SPEC_HANDLER,
39183: ZEND_EXT_NOP_SPEC_HANDLER,
39184: ZEND_EXT_NOP_SPEC_HANDLER,
39185: ZEND_EXT_NOP_SPEC_HANDLER,
39186: ZEND_EXT_NOP_SPEC_HANDLER,
39187: ZEND_EXT_NOP_SPEC_HANDLER,
39188: ZEND_EXT_NOP_SPEC_HANDLER,
39189: ZEND_EXT_NOP_SPEC_HANDLER,
39190: ZEND_EXT_NOP_SPEC_HANDLER,
39191: ZEND_EXT_NOP_SPEC_HANDLER,
39192: ZEND_EXT_NOP_SPEC_HANDLER,
39193: ZEND_EXT_NOP_SPEC_HANDLER,
39194: ZEND_EXT_NOP_SPEC_HANDLER,
39195: ZEND_EXT_NOP_SPEC_HANDLER,
39196: ZEND_EXT_NOP_SPEC_HANDLER,
39197: ZEND_EXT_NOP_SPEC_HANDLER,
39198: ZEND_EXT_NOP_SPEC_HANDLER,
39199: ZEND_EXT_NOP_SPEC_HANDLER,
39200: ZEND_EXT_NOP_SPEC_HANDLER,
39201: ZEND_EXT_NOP_SPEC_HANDLER,
39202: ZEND_EXT_NOP_SPEC_HANDLER,
1.1.1.2 misho 39203: ZEND_TICKS_SPEC_HANDLER,
39204: ZEND_TICKS_SPEC_HANDLER,
39205: ZEND_TICKS_SPEC_HANDLER,
39206: ZEND_TICKS_SPEC_HANDLER,
39207: ZEND_TICKS_SPEC_HANDLER,
39208: ZEND_TICKS_SPEC_HANDLER,
39209: ZEND_TICKS_SPEC_HANDLER,
39210: ZEND_TICKS_SPEC_HANDLER,
39211: ZEND_TICKS_SPEC_HANDLER,
39212: ZEND_TICKS_SPEC_HANDLER,
39213: ZEND_TICKS_SPEC_HANDLER,
39214: ZEND_TICKS_SPEC_HANDLER,
39215: ZEND_TICKS_SPEC_HANDLER,
39216: ZEND_TICKS_SPEC_HANDLER,
39217: ZEND_TICKS_SPEC_HANDLER,
39218: ZEND_TICKS_SPEC_HANDLER,
39219: ZEND_TICKS_SPEC_HANDLER,
39220: ZEND_TICKS_SPEC_HANDLER,
39221: ZEND_TICKS_SPEC_HANDLER,
39222: ZEND_TICKS_SPEC_HANDLER,
39223: ZEND_TICKS_SPEC_HANDLER,
39224: ZEND_TICKS_SPEC_HANDLER,
39225: ZEND_TICKS_SPEC_HANDLER,
39226: ZEND_TICKS_SPEC_HANDLER,
39227: ZEND_TICKS_SPEC_HANDLER,
1.1 misho 39228: ZEND_NULL_HANDLER,
39229: ZEND_NULL_HANDLER,
39230: ZEND_NULL_HANDLER,
39231: ZEND_NULL_HANDLER,
39232: ZEND_NULL_HANDLER,
39233: ZEND_NULL_HANDLER,
39234: ZEND_NULL_HANDLER,
39235: ZEND_NULL_HANDLER,
39236: ZEND_NULL_HANDLER,
39237: ZEND_NULL_HANDLER,
39238: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
39239: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
39240: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
39241: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
39242: ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER,
39243: ZEND_NULL_HANDLER,
39244: ZEND_NULL_HANDLER,
39245: ZEND_NULL_HANDLER,
39246: ZEND_NULL_HANDLER,
39247: ZEND_NULL_HANDLER,
39248: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
39249: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
39250: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
39251: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
39252: ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
39253: ZEND_NULL_HANDLER,
39254: ZEND_NULL_HANDLER,
39255: ZEND_NULL_HANDLER,
39256: ZEND_NULL_HANDLER,
1.1.1.2 misho 39257: ZEND_CATCH_SPEC_CONST_CV_HANDLER,
39258: ZEND_NULL_HANDLER,
39259: ZEND_NULL_HANDLER,
39260: ZEND_NULL_HANDLER,
39261: ZEND_NULL_HANDLER,
1.1 misho 39262: ZEND_NULL_HANDLER,
39263: ZEND_NULL_HANDLER,
39264: ZEND_NULL_HANDLER,
39265: ZEND_NULL_HANDLER,
39266: ZEND_NULL_HANDLER,
39267: ZEND_NULL_HANDLER,
39268: ZEND_NULL_HANDLER,
39269: ZEND_NULL_HANDLER,
39270: ZEND_NULL_HANDLER,
39271: ZEND_NULL_HANDLER,
39272: ZEND_NULL_HANDLER,
39273: ZEND_NULL_HANDLER,
39274: ZEND_NULL_HANDLER,
39275: ZEND_NULL_HANDLER,
39276: ZEND_NULL_HANDLER,
39277: ZEND_NULL_HANDLER,
39278: ZEND_THROW_SPEC_CONST_HANDLER,
39279: ZEND_THROW_SPEC_CONST_HANDLER,
39280: ZEND_THROW_SPEC_CONST_HANDLER,
39281: ZEND_THROW_SPEC_CONST_HANDLER,
39282: ZEND_THROW_SPEC_CONST_HANDLER,
39283: ZEND_THROW_SPEC_TMP_HANDLER,
39284: ZEND_THROW_SPEC_TMP_HANDLER,
39285: ZEND_THROW_SPEC_TMP_HANDLER,
39286: ZEND_THROW_SPEC_TMP_HANDLER,
39287: ZEND_THROW_SPEC_TMP_HANDLER,
39288: ZEND_THROW_SPEC_VAR_HANDLER,
39289: ZEND_THROW_SPEC_VAR_HANDLER,
39290: ZEND_THROW_SPEC_VAR_HANDLER,
39291: ZEND_THROW_SPEC_VAR_HANDLER,
39292: ZEND_THROW_SPEC_VAR_HANDLER,
39293: ZEND_NULL_HANDLER,
39294: ZEND_NULL_HANDLER,
39295: ZEND_NULL_HANDLER,
39296: ZEND_NULL_HANDLER,
39297: ZEND_NULL_HANDLER,
39298: ZEND_THROW_SPEC_CV_HANDLER,
39299: ZEND_THROW_SPEC_CV_HANDLER,
39300: ZEND_THROW_SPEC_CV_HANDLER,
39301: ZEND_THROW_SPEC_CV_HANDLER,
39302: ZEND_THROW_SPEC_CV_HANDLER,
39303: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
39304: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
39305: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
39306: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
39307: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
39308: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
39309: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
39310: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
39311: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
39312: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
39313: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
39314: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
39315: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
39316: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
39317: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
39318: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
39319: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
39320: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
39321: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
39322: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
39323: ZEND_FETCH_CLASS_SPEC_CONST_HANDLER,
39324: ZEND_FETCH_CLASS_SPEC_TMP_HANDLER,
39325: ZEND_FETCH_CLASS_SPEC_VAR_HANDLER,
39326: ZEND_FETCH_CLASS_SPEC_UNUSED_HANDLER,
39327: ZEND_FETCH_CLASS_SPEC_CV_HANDLER,
39328: ZEND_CLONE_SPEC_CONST_HANDLER,
39329: ZEND_CLONE_SPEC_CONST_HANDLER,
39330: ZEND_CLONE_SPEC_CONST_HANDLER,
39331: ZEND_CLONE_SPEC_CONST_HANDLER,
39332: ZEND_CLONE_SPEC_CONST_HANDLER,
39333: ZEND_CLONE_SPEC_TMP_HANDLER,
39334: ZEND_CLONE_SPEC_TMP_HANDLER,
39335: ZEND_CLONE_SPEC_TMP_HANDLER,
39336: ZEND_CLONE_SPEC_TMP_HANDLER,
39337: ZEND_CLONE_SPEC_TMP_HANDLER,
39338: ZEND_CLONE_SPEC_VAR_HANDLER,
39339: ZEND_CLONE_SPEC_VAR_HANDLER,
39340: ZEND_CLONE_SPEC_VAR_HANDLER,
39341: ZEND_CLONE_SPEC_VAR_HANDLER,
39342: ZEND_CLONE_SPEC_VAR_HANDLER,
39343: ZEND_CLONE_SPEC_UNUSED_HANDLER,
39344: ZEND_CLONE_SPEC_UNUSED_HANDLER,
39345: ZEND_CLONE_SPEC_UNUSED_HANDLER,
39346: ZEND_CLONE_SPEC_UNUSED_HANDLER,
39347: ZEND_CLONE_SPEC_UNUSED_HANDLER,
39348: ZEND_CLONE_SPEC_CV_HANDLER,
39349: ZEND_CLONE_SPEC_CV_HANDLER,
39350: ZEND_CLONE_SPEC_CV_HANDLER,
39351: ZEND_CLONE_SPEC_CV_HANDLER,
39352: ZEND_CLONE_SPEC_CV_HANDLER,
1.1.1.2 misho 39353: ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
39354: ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
39355: ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
39356: ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
39357: ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER,
39358: ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
39359: ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
39360: ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
39361: ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
39362: ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER,
39363: ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
39364: ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
39365: ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
39366: ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
39367: ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER,
1.1 misho 39368: ZEND_NULL_HANDLER,
39369: ZEND_NULL_HANDLER,
39370: ZEND_NULL_HANDLER,
39371: ZEND_NULL_HANDLER,
39372: ZEND_NULL_HANDLER,
1.1.1.2 misho 39373: ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
39374: ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
39375: ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
39376: ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
39377: ZEND_RETURN_BY_REF_SPEC_CV_HANDLER,
1.1 misho 39378: ZEND_NULL_HANDLER,
39379: ZEND_NULL_HANDLER,
39380: ZEND_NULL_HANDLER,
39381: ZEND_NULL_HANDLER,
39382: ZEND_NULL_HANDLER,
39383: ZEND_INIT_METHOD_CALL_SPEC_TMP_CONST_HANDLER,
39384: ZEND_INIT_METHOD_CALL_SPEC_TMP_TMP_HANDLER,
39385: ZEND_INIT_METHOD_CALL_SPEC_TMP_VAR_HANDLER,
39386: ZEND_NULL_HANDLER,
39387: ZEND_INIT_METHOD_CALL_SPEC_TMP_CV_HANDLER,
39388: ZEND_INIT_METHOD_CALL_SPEC_VAR_CONST_HANDLER,
39389: ZEND_INIT_METHOD_CALL_SPEC_VAR_TMP_HANDLER,
39390: ZEND_INIT_METHOD_CALL_SPEC_VAR_VAR_HANDLER,
39391: ZEND_NULL_HANDLER,
39392: ZEND_INIT_METHOD_CALL_SPEC_VAR_CV_HANDLER,
39393: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CONST_HANDLER,
39394: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_TMP_HANDLER,
39395: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_VAR_HANDLER,
39396: ZEND_NULL_HANDLER,
39397: ZEND_INIT_METHOD_CALL_SPEC_UNUSED_CV_HANDLER,
39398: ZEND_INIT_METHOD_CALL_SPEC_CV_CONST_HANDLER,
39399: ZEND_INIT_METHOD_CALL_SPEC_CV_TMP_HANDLER,
39400: ZEND_INIT_METHOD_CALL_SPEC_CV_VAR_HANDLER,
39401: ZEND_NULL_HANDLER,
39402: ZEND_INIT_METHOD_CALL_SPEC_CV_CV_HANDLER,
39403: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER,
39404: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER,
39405: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER,
39406: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER,
39407: ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER,
39408: ZEND_NULL_HANDLER,
39409: ZEND_NULL_HANDLER,
39410: ZEND_NULL_HANDLER,
39411: ZEND_NULL_HANDLER,
39412: ZEND_NULL_HANDLER,
39413: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER,
39414: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER,
39415: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER,
39416: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER,
39417: ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER,
39418: ZEND_NULL_HANDLER,
39419: ZEND_NULL_HANDLER,
39420: ZEND_NULL_HANDLER,
39421: ZEND_NULL_HANDLER,
39422: ZEND_NULL_HANDLER,
39423: ZEND_NULL_HANDLER,
39424: ZEND_NULL_HANDLER,
39425: ZEND_NULL_HANDLER,
39426: ZEND_NULL_HANDLER,
39427: ZEND_NULL_HANDLER,
1.1.1.2 misho 39428: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER,
39429: ZEND_NULL_HANDLER,
39430: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER,
39431: ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER,
39432: ZEND_NULL_HANDLER,
39433: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER,
1.1 misho 39434: ZEND_NULL_HANDLER,
1.1.1.2 misho 39435: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER,
39436: ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER,
1.1 misho 39437: ZEND_NULL_HANDLER,
1.1.1.2 misho 39438: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER,
1.1 misho 39439: ZEND_NULL_HANDLER,
1.1.1.2 misho 39440: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER,
39441: ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER,
1.1 misho 39442: ZEND_NULL_HANDLER,
39443: ZEND_NULL_HANDLER,
1.1.1.2 misho 39444: ZEND_NULL_HANDLER,
39445: ZEND_NULL_HANDLER,
39446: ZEND_NULL_HANDLER,
39447: ZEND_NULL_HANDLER,
39448: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER,
39449: ZEND_NULL_HANDLER,
39450: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER,
39451: ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER,
39452: ZEND_NULL_HANDLER,
1.1 misho 39453: ZEND_NULL_HANDLER,
39454: ZEND_NULL_HANDLER,
39455: ZEND_NULL_HANDLER,
39456: ZEND_NULL_HANDLER,
39457: ZEND_NULL_HANDLER,
39458: ZEND_NULL_HANDLER,
39459: ZEND_NULL_HANDLER,
39460: ZEND_NULL_HANDLER,
39461: ZEND_NULL_HANDLER,
39462: ZEND_NULL_HANDLER,
39463: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CONST_HANDLER,
39464: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_TMP_HANDLER,
39465: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_VAR_HANDLER,
39466: ZEND_NULL_HANDLER,
39467: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_VAR_CV_HANDLER,
39468: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CONST_HANDLER,
39469: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_TMP_HANDLER,
39470: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_VAR_HANDLER,
39471: ZEND_NULL_HANDLER,
39472: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_UNUSED_CV_HANDLER,
39473: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CONST_HANDLER,
39474: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_TMP_HANDLER,
39475: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_VAR_HANDLER,
39476: ZEND_NULL_HANDLER,
39477: ZEND_ISSET_ISEMPTY_DIM_OBJ_SPEC_CV_CV_HANDLER,
39478: ZEND_NULL_HANDLER,
39479: ZEND_NULL_HANDLER,
39480: ZEND_NULL_HANDLER,
39481: ZEND_NULL_HANDLER,
39482: ZEND_NULL_HANDLER,
39483: ZEND_NULL_HANDLER,
39484: ZEND_NULL_HANDLER,
39485: ZEND_NULL_HANDLER,
39486: ZEND_NULL_HANDLER,
39487: ZEND_NULL_HANDLER,
39488: ZEND_NULL_HANDLER,
39489: ZEND_NULL_HANDLER,
39490: ZEND_NULL_HANDLER,
39491: ZEND_NULL_HANDLER,
39492: ZEND_NULL_HANDLER,
39493: ZEND_NULL_HANDLER,
39494: ZEND_NULL_HANDLER,
39495: ZEND_NULL_HANDLER,
39496: ZEND_NULL_HANDLER,
39497: ZEND_NULL_HANDLER,
39498: ZEND_NULL_HANDLER,
39499: ZEND_NULL_HANDLER,
39500: ZEND_NULL_HANDLER,
39501: ZEND_NULL_HANDLER,
39502: ZEND_NULL_HANDLER,
39503: ZEND_NULL_HANDLER,
39504: ZEND_NULL_HANDLER,
39505: ZEND_NULL_HANDLER,
39506: ZEND_NULL_HANDLER,
39507: ZEND_NULL_HANDLER,
39508: ZEND_NULL_HANDLER,
39509: ZEND_NULL_HANDLER,
39510: ZEND_NULL_HANDLER,
39511: ZEND_NULL_HANDLER,
39512: ZEND_NULL_HANDLER,
39513: ZEND_NULL_HANDLER,
39514: ZEND_NULL_HANDLER,
39515: ZEND_NULL_HANDLER,
39516: ZEND_NULL_HANDLER,
39517: ZEND_NULL_HANDLER,
39518: ZEND_NULL_HANDLER,
39519: ZEND_NULL_HANDLER,
39520: ZEND_NULL_HANDLER,
39521: ZEND_NULL_HANDLER,
39522: ZEND_NULL_HANDLER,
39523: ZEND_NULL_HANDLER,
39524: ZEND_NULL_HANDLER,
39525: ZEND_NULL_HANDLER,
39526: ZEND_NULL_HANDLER,
39527: ZEND_NULL_HANDLER,
39528: ZEND_NULL_HANDLER,
39529: ZEND_NULL_HANDLER,
39530: ZEND_NULL_HANDLER,
39531: ZEND_NULL_HANDLER,
39532: ZEND_NULL_HANDLER,
39533: ZEND_NULL_HANDLER,
39534: ZEND_NULL_HANDLER,
39535: ZEND_NULL_HANDLER,
39536: ZEND_NULL_HANDLER,
39537: ZEND_NULL_HANDLER,
39538: ZEND_NULL_HANDLER,
39539: ZEND_NULL_HANDLER,
39540: ZEND_NULL_HANDLER,
39541: ZEND_NULL_HANDLER,
39542: ZEND_NULL_HANDLER,
39543: ZEND_NULL_HANDLER,
39544: ZEND_NULL_HANDLER,
39545: ZEND_NULL_HANDLER,
39546: ZEND_NULL_HANDLER,
39547: ZEND_NULL_HANDLER,
39548: ZEND_NULL_HANDLER,
39549: ZEND_NULL_HANDLER,
39550: ZEND_NULL_HANDLER,
39551: ZEND_NULL_HANDLER,
39552: ZEND_NULL_HANDLER,
39553: ZEND_NULL_HANDLER,
39554: ZEND_NULL_HANDLER,
39555: ZEND_NULL_HANDLER,
39556: ZEND_NULL_HANDLER,
39557: ZEND_NULL_HANDLER,
39558: ZEND_NULL_HANDLER,
39559: ZEND_NULL_HANDLER,
39560: ZEND_NULL_HANDLER,
39561: ZEND_NULL_HANDLER,
39562: ZEND_NULL_HANDLER,
39563: ZEND_NULL_HANDLER,
39564: ZEND_NULL_HANDLER,
39565: ZEND_NULL_HANDLER,
39566: ZEND_NULL_HANDLER,
39567: ZEND_NULL_HANDLER,
39568: ZEND_NULL_HANDLER,
39569: ZEND_NULL_HANDLER,
39570: ZEND_NULL_HANDLER,
39571: ZEND_NULL_HANDLER,
39572: ZEND_NULL_HANDLER,
39573: ZEND_NULL_HANDLER,
39574: ZEND_NULL_HANDLER,
39575: ZEND_NULL_HANDLER,
39576: ZEND_NULL_HANDLER,
39577: ZEND_NULL_HANDLER,
39578: ZEND_NULL_HANDLER,
39579: ZEND_NULL_HANDLER,
39580: ZEND_NULL_HANDLER,
39581: ZEND_NULL_HANDLER,
39582: ZEND_NULL_HANDLER,
39583: ZEND_NULL_HANDLER,
39584: ZEND_NULL_HANDLER,
39585: ZEND_NULL_HANDLER,
39586: ZEND_NULL_HANDLER,
39587: ZEND_NULL_HANDLER,
39588: ZEND_NULL_HANDLER,
39589: ZEND_NULL_HANDLER,
39590: ZEND_NULL_HANDLER,
39591: ZEND_NULL_HANDLER,
39592: ZEND_NULL_HANDLER,
39593: ZEND_NULL_HANDLER,
39594: ZEND_NULL_HANDLER,
39595: ZEND_NULL_HANDLER,
39596: ZEND_NULL_HANDLER,
39597: ZEND_NULL_HANDLER,
39598: ZEND_NULL_HANDLER,
39599: ZEND_NULL_HANDLER,
39600: ZEND_NULL_HANDLER,
39601: ZEND_NULL_HANDLER,
39602: ZEND_NULL_HANDLER,
39603: ZEND_NULL_HANDLER,
39604: ZEND_NULL_HANDLER,
39605: ZEND_NULL_HANDLER,
39606: ZEND_NULL_HANDLER,
39607: ZEND_NULL_HANDLER,
39608: ZEND_NULL_HANDLER,
39609: ZEND_NULL_HANDLER,
39610: ZEND_NULL_HANDLER,
39611: ZEND_NULL_HANDLER,
39612: ZEND_NULL_HANDLER,
39613: ZEND_NULL_HANDLER,
39614: ZEND_NULL_HANDLER,
39615: ZEND_NULL_HANDLER,
39616: ZEND_NULL_HANDLER,
39617: ZEND_NULL_HANDLER,
39618: ZEND_NULL_HANDLER,
39619: ZEND_NULL_HANDLER,
39620: ZEND_NULL_HANDLER,
39621: ZEND_NULL_HANDLER,
39622: ZEND_NULL_HANDLER,
39623: ZEND_NULL_HANDLER,
39624: ZEND_NULL_HANDLER,
39625: ZEND_NULL_HANDLER,
39626: ZEND_NULL_HANDLER,
39627: ZEND_NULL_HANDLER,
39628: ZEND_NULL_HANDLER,
39629: ZEND_NULL_HANDLER,
39630: ZEND_NULL_HANDLER,
39631: ZEND_NULL_HANDLER,
39632: ZEND_NULL_HANDLER,
39633: ZEND_NULL_HANDLER,
39634: ZEND_NULL_HANDLER,
39635: ZEND_NULL_HANDLER,
39636: ZEND_NULL_HANDLER,
39637: ZEND_NULL_HANDLER,
39638: ZEND_NULL_HANDLER,
39639: ZEND_NULL_HANDLER,
39640: ZEND_NULL_HANDLER,
39641: ZEND_NULL_HANDLER,
39642: ZEND_NULL_HANDLER,
39643: ZEND_NULL_HANDLER,
39644: ZEND_NULL_HANDLER,
39645: ZEND_NULL_HANDLER,
39646: ZEND_NULL_HANDLER,
39647: ZEND_NULL_HANDLER,
39648: ZEND_NULL_HANDLER,
39649: ZEND_NULL_HANDLER,
39650: ZEND_NULL_HANDLER,
39651: ZEND_NULL_HANDLER,
39652: ZEND_NULL_HANDLER,
39653: ZEND_NULL_HANDLER,
39654: ZEND_NULL_HANDLER,
39655: ZEND_NULL_HANDLER,
39656: ZEND_NULL_HANDLER,
39657: ZEND_NULL_HANDLER,
39658: ZEND_NULL_HANDLER,
39659: ZEND_NULL_HANDLER,
39660: ZEND_NULL_HANDLER,
39661: ZEND_NULL_HANDLER,
39662: ZEND_NULL_HANDLER,
39663: ZEND_NULL_HANDLER,
39664: ZEND_NULL_HANDLER,
39665: ZEND_NULL_HANDLER,
39666: ZEND_NULL_HANDLER,
39667: ZEND_NULL_HANDLER,
39668: ZEND_NULL_HANDLER,
39669: ZEND_NULL_HANDLER,
39670: ZEND_NULL_HANDLER,
39671: ZEND_NULL_HANDLER,
39672: ZEND_NULL_HANDLER,
39673: ZEND_NULL_HANDLER,
39674: ZEND_NULL_HANDLER,
39675: ZEND_NULL_HANDLER,
39676: ZEND_NULL_HANDLER,
39677: ZEND_NULL_HANDLER,
39678: ZEND_NULL_HANDLER,
39679: ZEND_NULL_HANDLER,
39680: ZEND_NULL_HANDLER,
39681: ZEND_NULL_HANDLER,
39682: ZEND_NULL_HANDLER,
39683: ZEND_NULL_HANDLER,
39684: ZEND_NULL_HANDLER,
39685: ZEND_NULL_HANDLER,
39686: ZEND_NULL_HANDLER,
39687: ZEND_NULL_HANDLER,
39688: ZEND_NULL_HANDLER,
39689: ZEND_NULL_HANDLER,
39690: ZEND_NULL_HANDLER,
39691: ZEND_NULL_HANDLER,
39692: ZEND_NULL_HANDLER,
39693: ZEND_NULL_HANDLER,
39694: ZEND_NULL_HANDLER,
39695: ZEND_NULL_HANDLER,
39696: ZEND_NULL_HANDLER,
39697: ZEND_NULL_HANDLER,
39698: ZEND_NULL_HANDLER,
39699: ZEND_NULL_HANDLER,
39700: ZEND_NULL_HANDLER,
39701: ZEND_NULL_HANDLER,
39702: ZEND_NULL_HANDLER,
39703: ZEND_NULL_HANDLER,
39704: ZEND_NULL_HANDLER,
39705: ZEND_NULL_HANDLER,
39706: ZEND_NULL_HANDLER,
39707: ZEND_NULL_HANDLER,
39708: ZEND_NULL_HANDLER,
39709: ZEND_NULL_HANDLER,
39710: ZEND_NULL_HANDLER,
39711: ZEND_NULL_HANDLER,
39712: ZEND_NULL_HANDLER,
39713: ZEND_NULL_HANDLER,
39714: ZEND_NULL_HANDLER,
39715: ZEND_NULL_HANDLER,
39716: ZEND_NULL_HANDLER,
39717: ZEND_NULL_HANDLER,
39718: ZEND_NULL_HANDLER,
39719: ZEND_NULL_HANDLER,
39720: ZEND_NULL_HANDLER,
39721: ZEND_NULL_HANDLER,
39722: ZEND_NULL_HANDLER,
39723: ZEND_NULL_HANDLER,
39724: ZEND_NULL_HANDLER,
39725: ZEND_NULL_HANDLER,
39726: ZEND_NULL_HANDLER,
39727: ZEND_NULL_HANDLER,
39728: ZEND_NULL_HANDLER,
39729: ZEND_NULL_HANDLER,
39730: ZEND_NULL_HANDLER,
39731: ZEND_NULL_HANDLER,
39732: ZEND_NULL_HANDLER,
39733: ZEND_NULL_HANDLER,
39734: ZEND_NULL_HANDLER,
39735: ZEND_NULL_HANDLER,
39736: ZEND_NULL_HANDLER,
39737: ZEND_NULL_HANDLER,
39738: ZEND_NULL_HANDLER,
39739: ZEND_NULL_HANDLER,
39740: ZEND_NULL_HANDLER,
39741: ZEND_NULL_HANDLER,
39742: ZEND_NULL_HANDLER,
39743: ZEND_NULL_HANDLER,
39744: ZEND_NULL_HANDLER,
39745: ZEND_NULL_HANDLER,
39746: ZEND_NULL_HANDLER,
39747: ZEND_NULL_HANDLER,
39748: ZEND_NULL_HANDLER,
39749: ZEND_NULL_HANDLER,
39750: ZEND_NULL_HANDLER,
39751: ZEND_NULL_HANDLER,
39752: ZEND_NULL_HANDLER,
39753: ZEND_NULL_HANDLER,
39754: ZEND_NULL_HANDLER,
39755: ZEND_NULL_HANDLER,
39756: ZEND_NULL_HANDLER,
39757: ZEND_NULL_HANDLER,
39758: ZEND_NULL_HANDLER,
39759: ZEND_NULL_HANDLER,
39760: ZEND_NULL_HANDLER,
39761: ZEND_NULL_HANDLER,
39762: ZEND_NULL_HANDLER,
39763: ZEND_NULL_HANDLER,
39764: ZEND_NULL_HANDLER,
39765: ZEND_NULL_HANDLER,
39766: ZEND_NULL_HANDLER,
39767: ZEND_NULL_HANDLER,
39768: ZEND_NULL_HANDLER,
39769: ZEND_NULL_HANDLER,
39770: ZEND_NULL_HANDLER,
39771: ZEND_NULL_HANDLER,
39772: ZEND_NULL_HANDLER,
39773: ZEND_NULL_HANDLER,
39774: ZEND_NULL_HANDLER,
39775: ZEND_NULL_HANDLER,
39776: ZEND_NULL_HANDLER,
39777: ZEND_NULL_HANDLER,
39778: ZEND_NULL_HANDLER,
39779: ZEND_NULL_HANDLER,
39780: ZEND_NULL_HANDLER,
39781: ZEND_NULL_HANDLER,
39782: ZEND_NULL_HANDLER,
39783: ZEND_NULL_HANDLER,
39784: ZEND_NULL_HANDLER,
39785: ZEND_NULL_HANDLER,
39786: ZEND_NULL_HANDLER,
39787: ZEND_NULL_HANDLER,
39788: ZEND_NULL_HANDLER,
39789: ZEND_NULL_HANDLER,
39790: ZEND_NULL_HANDLER,
39791: ZEND_NULL_HANDLER,
39792: ZEND_NULL_HANDLER,
39793: ZEND_NULL_HANDLER,
39794: ZEND_NULL_HANDLER,
39795: ZEND_NULL_HANDLER,
39796: ZEND_NULL_HANDLER,
39797: ZEND_NULL_HANDLER,
39798: ZEND_NULL_HANDLER,
39799: ZEND_NULL_HANDLER,
39800: ZEND_NULL_HANDLER,
39801: ZEND_NULL_HANDLER,
39802: ZEND_NULL_HANDLER,
39803: ZEND_NULL_HANDLER,
39804: ZEND_NULL_HANDLER,
39805: ZEND_NULL_HANDLER,
39806: ZEND_NULL_HANDLER,
39807: ZEND_NULL_HANDLER,
39808: ZEND_NULL_HANDLER,
39809: ZEND_NULL_HANDLER,
39810: ZEND_NULL_HANDLER,
39811: ZEND_NULL_HANDLER,
39812: ZEND_NULL_HANDLER,
39813: ZEND_NULL_HANDLER,
39814: ZEND_NULL_HANDLER,
39815: ZEND_NULL_HANDLER,
39816: ZEND_NULL_HANDLER,
39817: ZEND_NULL_HANDLER,
39818: ZEND_NULL_HANDLER,
39819: ZEND_NULL_HANDLER,
39820: ZEND_NULL_HANDLER,
39821: ZEND_NULL_HANDLER,
39822: ZEND_NULL_HANDLER,
39823: ZEND_NULL_HANDLER,
39824: ZEND_NULL_HANDLER,
39825: ZEND_NULL_HANDLER,
39826: ZEND_NULL_HANDLER,
39827: ZEND_NULL_HANDLER,
39828: ZEND_NULL_HANDLER,
39829: ZEND_NULL_HANDLER,
39830: ZEND_NULL_HANDLER,
39831: ZEND_NULL_HANDLER,
39832: ZEND_NULL_HANDLER,
39833: ZEND_NULL_HANDLER,
39834: ZEND_NULL_HANDLER,
39835: ZEND_NULL_HANDLER,
39836: ZEND_NULL_HANDLER,
39837: ZEND_NULL_HANDLER,
39838: ZEND_NULL_HANDLER,
39839: ZEND_NULL_HANDLER,
39840: ZEND_NULL_HANDLER,
39841: ZEND_NULL_HANDLER,
39842: ZEND_NULL_HANDLER,
39843: ZEND_NULL_HANDLER,
39844: ZEND_NULL_HANDLER,
39845: ZEND_NULL_HANDLER,
39846: ZEND_NULL_HANDLER,
39847: ZEND_NULL_HANDLER,
39848: ZEND_NULL_HANDLER,
39849: ZEND_NULL_HANDLER,
39850: ZEND_NULL_HANDLER,
39851: ZEND_NULL_HANDLER,
39852: ZEND_NULL_HANDLER,
39853: ZEND_NULL_HANDLER,
39854: ZEND_NULL_HANDLER,
39855: ZEND_NULL_HANDLER,
39856: ZEND_NULL_HANDLER,
39857: ZEND_NULL_HANDLER,
39858: ZEND_NULL_HANDLER,
39859: ZEND_NULL_HANDLER,
39860: ZEND_NULL_HANDLER,
39861: ZEND_NULL_HANDLER,
39862: ZEND_NULL_HANDLER,
39863: ZEND_NULL_HANDLER,
39864: ZEND_NULL_HANDLER,
39865: ZEND_NULL_HANDLER,
39866: ZEND_NULL_HANDLER,
39867: ZEND_NULL_HANDLER,
39868: ZEND_NULL_HANDLER,
39869: ZEND_NULL_HANDLER,
39870: ZEND_NULL_HANDLER,
39871: ZEND_NULL_HANDLER,
39872: ZEND_NULL_HANDLER,
39873: ZEND_NULL_HANDLER,
39874: ZEND_NULL_HANDLER,
39875: ZEND_NULL_HANDLER,
39876: ZEND_NULL_HANDLER,
39877: ZEND_NULL_HANDLER,
39878: ZEND_NULL_HANDLER,
39879: ZEND_NULL_HANDLER,
39880: ZEND_NULL_HANDLER,
39881: ZEND_NULL_HANDLER,
39882: ZEND_NULL_HANDLER,
39883: ZEND_NULL_HANDLER,
39884: ZEND_NULL_HANDLER,
39885: ZEND_NULL_HANDLER,
39886: ZEND_NULL_HANDLER,
39887: ZEND_NULL_HANDLER,
39888: ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER,
39889: ZEND_PRE_INC_OBJ_SPEC_VAR_TMP_HANDLER,
39890: ZEND_PRE_INC_OBJ_SPEC_VAR_VAR_HANDLER,
39891: ZEND_NULL_HANDLER,
39892: ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER,
39893: ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER,
39894: ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMP_HANDLER,
39895: ZEND_PRE_INC_OBJ_SPEC_UNUSED_VAR_HANDLER,
39896: ZEND_NULL_HANDLER,
39897: ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER,
39898: ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER,
39899: ZEND_PRE_INC_OBJ_SPEC_CV_TMP_HANDLER,
39900: ZEND_PRE_INC_OBJ_SPEC_CV_VAR_HANDLER,
39901: ZEND_NULL_HANDLER,
39902: ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER,
39903: ZEND_NULL_HANDLER,
39904: ZEND_NULL_HANDLER,
39905: ZEND_NULL_HANDLER,
39906: ZEND_NULL_HANDLER,
39907: ZEND_NULL_HANDLER,
39908: ZEND_NULL_HANDLER,
39909: ZEND_NULL_HANDLER,
39910: ZEND_NULL_HANDLER,
39911: ZEND_NULL_HANDLER,
39912: ZEND_NULL_HANDLER,
39913: ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
39914: ZEND_PRE_DEC_OBJ_SPEC_VAR_TMP_HANDLER,
39915: ZEND_PRE_DEC_OBJ_SPEC_VAR_VAR_HANDLER,
39916: ZEND_NULL_HANDLER,
39917: ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER,
39918: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
39919: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER,
39920: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER,
39921: ZEND_NULL_HANDLER,
39922: ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
39923: ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER,
39924: ZEND_PRE_DEC_OBJ_SPEC_CV_TMP_HANDLER,
39925: ZEND_PRE_DEC_OBJ_SPEC_CV_VAR_HANDLER,
39926: ZEND_NULL_HANDLER,
39927: ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER,
39928: ZEND_NULL_HANDLER,
39929: ZEND_NULL_HANDLER,
39930: ZEND_NULL_HANDLER,
39931: ZEND_NULL_HANDLER,
39932: ZEND_NULL_HANDLER,
39933: ZEND_NULL_HANDLER,
39934: ZEND_NULL_HANDLER,
39935: ZEND_NULL_HANDLER,
39936: ZEND_NULL_HANDLER,
39937: ZEND_NULL_HANDLER,
39938: ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER,
39939: ZEND_POST_INC_OBJ_SPEC_VAR_TMP_HANDLER,
39940: ZEND_POST_INC_OBJ_SPEC_VAR_VAR_HANDLER,
39941: ZEND_NULL_HANDLER,
39942: ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER,
39943: ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER,
39944: ZEND_POST_INC_OBJ_SPEC_UNUSED_TMP_HANDLER,
39945: ZEND_POST_INC_OBJ_SPEC_UNUSED_VAR_HANDLER,
39946: ZEND_NULL_HANDLER,
39947: ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER,
39948: ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER,
39949: ZEND_POST_INC_OBJ_SPEC_CV_TMP_HANDLER,
39950: ZEND_POST_INC_OBJ_SPEC_CV_VAR_HANDLER,
39951: ZEND_NULL_HANDLER,
39952: ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER,
39953: ZEND_NULL_HANDLER,
39954: ZEND_NULL_HANDLER,
39955: ZEND_NULL_HANDLER,
39956: ZEND_NULL_HANDLER,
39957: ZEND_NULL_HANDLER,
39958: ZEND_NULL_HANDLER,
39959: ZEND_NULL_HANDLER,
39960: ZEND_NULL_HANDLER,
39961: ZEND_NULL_HANDLER,
39962: ZEND_NULL_HANDLER,
39963: ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER,
39964: ZEND_POST_DEC_OBJ_SPEC_VAR_TMP_HANDLER,
39965: ZEND_POST_DEC_OBJ_SPEC_VAR_VAR_HANDLER,
39966: ZEND_NULL_HANDLER,
39967: ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER,
39968: ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER,
39969: ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMP_HANDLER,
39970: ZEND_POST_DEC_OBJ_SPEC_UNUSED_VAR_HANDLER,
39971: ZEND_NULL_HANDLER,
39972: ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER,
39973: ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER,
39974: ZEND_POST_DEC_OBJ_SPEC_CV_TMP_HANDLER,
39975: ZEND_POST_DEC_OBJ_SPEC_CV_VAR_HANDLER,
39976: ZEND_NULL_HANDLER,
39977: ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER,
39978: ZEND_NULL_HANDLER,
39979: ZEND_NULL_HANDLER,
39980: ZEND_NULL_HANDLER,
39981: ZEND_NULL_HANDLER,
39982: ZEND_NULL_HANDLER,
39983: ZEND_NULL_HANDLER,
39984: ZEND_NULL_HANDLER,
39985: ZEND_NULL_HANDLER,
39986: ZEND_NULL_HANDLER,
39987: ZEND_NULL_HANDLER,
39988: ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HANDLER,
39989: ZEND_ASSIGN_OBJ_SPEC_VAR_TMP_HANDLER,
39990: ZEND_ASSIGN_OBJ_SPEC_VAR_VAR_HANDLER,
39991: ZEND_NULL_HANDLER,
39992: ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER,
39993: ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_HANDLER,
39994: ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMP_HANDLER,
39995: ZEND_ASSIGN_OBJ_SPEC_UNUSED_VAR_HANDLER,
39996: ZEND_NULL_HANDLER,
39997: ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HANDLER,
39998: ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDLER,
39999: ZEND_ASSIGN_OBJ_SPEC_CV_TMP_HANDLER,
40000: ZEND_ASSIGN_OBJ_SPEC_CV_VAR_HANDLER,
40001: ZEND_NULL_HANDLER,
40002: ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER,
40003: ZEND_NULL_HANDLER,
40004: ZEND_NULL_HANDLER,
40005: ZEND_NULL_HANDLER,
40006: ZEND_NULL_HANDLER,
40007: ZEND_NULL_HANDLER,
40008: ZEND_NULL_HANDLER,
40009: ZEND_NULL_HANDLER,
40010: ZEND_NULL_HANDLER,
40011: ZEND_NULL_HANDLER,
40012: ZEND_NULL_HANDLER,
40013: ZEND_NULL_HANDLER,
40014: ZEND_NULL_HANDLER,
40015: ZEND_NULL_HANDLER,
40016: ZEND_NULL_HANDLER,
40017: ZEND_NULL_HANDLER,
40018: ZEND_NULL_HANDLER,
40019: ZEND_NULL_HANDLER,
40020: ZEND_NULL_HANDLER,
40021: ZEND_NULL_HANDLER,
40022: ZEND_NULL_HANDLER,
40023: ZEND_NULL_HANDLER,
40024: ZEND_NULL_HANDLER,
40025: ZEND_NULL_HANDLER,
40026: ZEND_NULL_HANDLER,
40027: ZEND_NULL_HANDLER,
40028: ZEND_NULL_HANDLER,
40029: ZEND_NULL_HANDLER,
40030: ZEND_NULL_HANDLER,
40031: ZEND_NULL_HANDLER,
40032: ZEND_NULL_HANDLER,
40033: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
40034: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
40035: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
40036: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
40037: ZEND_INSTANCEOF_SPEC_TMP_HANDLER,
40038: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
40039: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
40040: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
40041: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
40042: ZEND_INSTANCEOF_SPEC_VAR_HANDLER,
40043: ZEND_NULL_HANDLER,
40044: ZEND_NULL_HANDLER,
40045: ZEND_NULL_HANDLER,
40046: ZEND_NULL_HANDLER,
40047: ZEND_NULL_HANDLER,
40048: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
40049: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
40050: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
40051: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
40052: ZEND_INSTANCEOF_SPEC_CV_HANDLER,
40053: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40054: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40055: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40056: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40057: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40058: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40059: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40060: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40061: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40062: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40063: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40064: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40065: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40066: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40067: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40068: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40069: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40070: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40071: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40072: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40073: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40074: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40075: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40076: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40077: ZEND_DECLARE_CLASS_SPEC_HANDLER,
40078: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40079: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40080: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40081: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40082: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40083: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40084: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40085: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40086: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40087: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40088: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40089: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40090: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40091: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40092: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40093: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40094: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40095: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40096: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40097: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40098: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40099: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40100: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40101: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40102: ZEND_DECLARE_INHERITED_CLASS_SPEC_HANDLER,
40103: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40104: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40105: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40106: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40107: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40108: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40109: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40110: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40111: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40112: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40113: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40114: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40115: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40116: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40117: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40118: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40119: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40120: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40121: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40122: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40123: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40124: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40125: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40126: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40127: ZEND_DECLARE_FUNCTION_SPEC_HANDLER,
40128: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40129: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40130: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40131: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40132: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40133: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40134: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40135: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40136: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40137: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40138: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40139: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40140: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40141: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40142: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40143: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40144: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40145: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40146: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40147: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40148: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40149: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40150: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40151: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40152: ZEND_RAISE_ABSTRACT_ERROR_SPEC_HANDLER,
40153: ZEND_DECLARE_CONST_SPEC_CONST_CONST_HANDLER,
40154: ZEND_NULL_HANDLER,
40155: ZEND_NULL_HANDLER,
40156: ZEND_NULL_HANDLER,
40157: ZEND_NULL_HANDLER,
40158: ZEND_NULL_HANDLER,
40159: ZEND_NULL_HANDLER,
40160: ZEND_NULL_HANDLER,
40161: ZEND_NULL_HANDLER,
40162: ZEND_NULL_HANDLER,
40163: ZEND_NULL_HANDLER,
40164: ZEND_NULL_HANDLER,
40165: ZEND_NULL_HANDLER,
40166: ZEND_NULL_HANDLER,
40167: ZEND_NULL_HANDLER,
40168: ZEND_NULL_HANDLER,
40169: ZEND_NULL_HANDLER,
40170: ZEND_NULL_HANDLER,
40171: ZEND_NULL_HANDLER,
40172: ZEND_NULL_HANDLER,
40173: ZEND_NULL_HANDLER,
40174: ZEND_NULL_HANDLER,
40175: ZEND_NULL_HANDLER,
40176: ZEND_NULL_HANDLER,
40177: ZEND_NULL_HANDLER,
40178: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
40179: ZEND_NULL_HANDLER,
40180: ZEND_NULL_HANDLER,
40181: ZEND_NULL_HANDLER,
40182: ZEND_NULL_HANDLER,
40183: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
40184: ZEND_NULL_HANDLER,
40185: ZEND_NULL_HANDLER,
40186: ZEND_NULL_HANDLER,
40187: ZEND_NULL_HANDLER,
40188: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
40189: ZEND_NULL_HANDLER,
40190: ZEND_NULL_HANDLER,
40191: ZEND_NULL_HANDLER,
40192: ZEND_NULL_HANDLER,
40193: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
40194: ZEND_NULL_HANDLER,
40195: ZEND_NULL_HANDLER,
40196: ZEND_NULL_HANDLER,
40197: ZEND_NULL_HANDLER,
40198: ZEND_ADD_INTERFACE_SPEC_CONST_HANDLER,
40199: ZEND_NULL_HANDLER,
40200: ZEND_NULL_HANDLER,
40201: ZEND_NULL_HANDLER,
40202: ZEND_NULL_HANDLER,
40203: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40204: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40205: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40206: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40207: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40208: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40209: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40210: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40211: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40212: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40213: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40214: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40215: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40216: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40217: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40218: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40219: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40220: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40221: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40222: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40223: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40224: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40225: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40226: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40227: ZEND_DECLARE_INHERITED_CLASS_DELAYED_SPEC_HANDLER,
40228: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40229: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40230: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40231: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40232: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40233: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40234: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40235: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40236: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40237: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40238: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40239: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40240: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40241: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40242: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40243: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40244: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40245: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40246: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40247: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40248: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40249: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40250: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40251: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40252: ZEND_VERIFY_ABSTRACT_CLASS_SPEC_HANDLER,
40253: ZEND_NULL_HANDLER,
40254: ZEND_NULL_HANDLER,
40255: ZEND_NULL_HANDLER,
40256: ZEND_NULL_HANDLER,
40257: ZEND_NULL_HANDLER,
40258: ZEND_NULL_HANDLER,
40259: ZEND_NULL_HANDLER,
40260: ZEND_NULL_HANDLER,
40261: ZEND_NULL_HANDLER,
40262: ZEND_NULL_HANDLER,
40263: ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER,
40264: ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER,
40265: ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER,
40266: ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER,
40267: ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER,
40268: ZEND_NULL_HANDLER,
40269: ZEND_NULL_HANDLER,
40270: ZEND_NULL_HANDLER,
40271: ZEND_NULL_HANDLER,
40272: ZEND_NULL_HANDLER,
40273: ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER,
40274: ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER,
40275: ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER,
40276: ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER,
40277: ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER,
40278: ZEND_NULL_HANDLER,
40279: ZEND_NULL_HANDLER,
40280: ZEND_NULL_HANDLER,
40281: ZEND_NULL_HANDLER,
40282: ZEND_NULL_HANDLER,
40283: ZEND_NULL_HANDLER,
40284: ZEND_NULL_HANDLER,
40285: ZEND_NULL_HANDLER,
40286: ZEND_NULL_HANDLER,
40287: ZEND_NULL_HANDLER,
40288: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CONST_HANDLER,
40289: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_TMP_HANDLER,
40290: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_VAR_HANDLER,
40291: ZEND_NULL_HANDLER,
40292: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_VAR_CV_HANDLER,
40293: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CONST_HANDLER,
40294: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_TMP_HANDLER,
40295: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_VAR_HANDLER,
40296: ZEND_NULL_HANDLER,
40297: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UNUSED_CV_HANDLER,
40298: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CONST_HANDLER,
40299: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_TMP_HANDLER,
40300: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_VAR_HANDLER,
40301: ZEND_NULL_HANDLER,
40302: ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV_CV_HANDLER,
40303: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40304: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40305: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40306: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40307: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40308: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40309: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40310: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40311: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40312: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40313: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40314: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40315: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40316: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40317: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40318: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40319: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40320: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40321: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40322: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40323: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40324: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40325: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40326: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40327: ZEND_HANDLE_EXCEPTION_SPEC_HANDLER,
40328: ZEND_USER_OPCODE_SPEC_HANDLER,
40329: ZEND_USER_OPCODE_SPEC_HANDLER,
40330: ZEND_USER_OPCODE_SPEC_HANDLER,
40331: ZEND_USER_OPCODE_SPEC_HANDLER,
40332: ZEND_USER_OPCODE_SPEC_HANDLER,
40333: ZEND_USER_OPCODE_SPEC_HANDLER,
40334: ZEND_USER_OPCODE_SPEC_HANDLER,
40335: ZEND_USER_OPCODE_SPEC_HANDLER,
40336: ZEND_USER_OPCODE_SPEC_HANDLER,
40337: ZEND_USER_OPCODE_SPEC_HANDLER,
40338: ZEND_USER_OPCODE_SPEC_HANDLER,
40339: ZEND_USER_OPCODE_SPEC_HANDLER,
40340: ZEND_USER_OPCODE_SPEC_HANDLER,
40341: ZEND_USER_OPCODE_SPEC_HANDLER,
40342: ZEND_USER_OPCODE_SPEC_HANDLER,
40343: ZEND_USER_OPCODE_SPEC_HANDLER,
40344: ZEND_USER_OPCODE_SPEC_HANDLER,
40345: ZEND_USER_OPCODE_SPEC_HANDLER,
40346: ZEND_USER_OPCODE_SPEC_HANDLER,
40347: ZEND_USER_OPCODE_SPEC_HANDLER,
40348: ZEND_USER_OPCODE_SPEC_HANDLER,
40349: ZEND_USER_OPCODE_SPEC_HANDLER,
40350: ZEND_USER_OPCODE_SPEC_HANDLER,
40351: ZEND_USER_OPCODE_SPEC_HANDLER,
40352: ZEND_USER_OPCODE_SPEC_HANDLER,
40353: ZEND_NULL_HANDLER,
40354: ZEND_NULL_HANDLER,
40355: ZEND_NULL_HANDLER,
40356: ZEND_NULL_HANDLER,
40357: ZEND_NULL_HANDLER,
40358: ZEND_NULL_HANDLER,
40359: ZEND_NULL_HANDLER,
40360: ZEND_NULL_HANDLER,
40361: ZEND_NULL_HANDLER,
40362: ZEND_NULL_HANDLER,
40363: ZEND_NULL_HANDLER,
40364: ZEND_NULL_HANDLER,
40365: ZEND_NULL_HANDLER,
40366: ZEND_NULL_HANDLER,
40367: ZEND_NULL_HANDLER,
40368: ZEND_NULL_HANDLER,
40369: ZEND_NULL_HANDLER,
40370: ZEND_NULL_HANDLER,
40371: ZEND_NULL_HANDLER,
40372: ZEND_NULL_HANDLER,
40373: ZEND_NULL_HANDLER,
40374: ZEND_NULL_HANDLER,
40375: ZEND_NULL_HANDLER,
40376: ZEND_NULL_HANDLER,
40377: ZEND_NULL_HANDLER,
40378: ZEND_JMP_SET_SPEC_CONST_HANDLER,
40379: ZEND_JMP_SET_SPEC_CONST_HANDLER,
40380: ZEND_JMP_SET_SPEC_CONST_HANDLER,
40381: ZEND_JMP_SET_SPEC_CONST_HANDLER,
40382: ZEND_JMP_SET_SPEC_CONST_HANDLER,
40383: ZEND_JMP_SET_SPEC_TMP_HANDLER,
40384: ZEND_JMP_SET_SPEC_TMP_HANDLER,
40385: ZEND_JMP_SET_SPEC_TMP_HANDLER,
40386: ZEND_JMP_SET_SPEC_TMP_HANDLER,
40387: ZEND_JMP_SET_SPEC_TMP_HANDLER,
40388: ZEND_JMP_SET_SPEC_VAR_HANDLER,
40389: ZEND_JMP_SET_SPEC_VAR_HANDLER,
40390: ZEND_JMP_SET_SPEC_VAR_HANDLER,
40391: ZEND_JMP_SET_SPEC_VAR_HANDLER,
40392: ZEND_JMP_SET_SPEC_VAR_HANDLER,
40393: ZEND_NULL_HANDLER,
40394: ZEND_NULL_HANDLER,
40395: ZEND_NULL_HANDLER,
40396: ZEND_NULL_HANDLER,
40397: ZEND_NULL_HANDLER,
40398: ZEND_JMP_SET_SPEC_CV_HANDLER,
40399: ZEND_JMP_SET_SPEC_CV_HANDLER,
40400: ZEND_JMP_SET_SPEC_CV_HANDLER,
40401: ZEND_JMP_SET_SPEC_CV_HANDLER,
40402: ZEND_JMP_SET_SPEC_CV_HANDLER,
40403: ZEND_NULL_HANDLER,
40404: ZEND_NULL_HANDLER,
40405: ZEND_NULL_HANDLER,
1.1.1.2 misho 40406: ZEND_DECLARE_LAMBDA_FUNCTION_SPEC_CONST_UNUSED_HANDLER,
40407: ZEND_NULL_HANDLER,
40408: ZEND_NULL_HANDLER,
40409: ZEND_NULL_HANDLER,
40410: ZEND_NULL_HANDLER,
40411: ZEND_NULL_HANDLER,
40412: ZEND_NULL_HANDLER,
40413: ZEND_NULL_HANDLER,
40414: ZEND_NULL_HANDLER,
40415: ZEND_NULL_HANDLER,
40416: ZEND_NULL_HANDLER,
40417: ZEND_NULL_HANDLER,
40418: ZEND_NULL_HANDLER,
40419: ZEND_NULL_HANDLER,
40420: ZEND_NULL_HANDLER,
40421: ZEND_NULL_HANDLER,
40422: ZEND_NULL_HANDLER,
40423: ZEND_NULL_HANDLER,
40424: ZEND_NULL_HANDLER,
40425: ZEND_NULL_HANDLER,
40426: ZEND_NULL_HANDLER,
40427: ZEND_NULL_HANDLER,
40428: ZEND_ADD_TRAIT_SPEC_HANDLER,
40429: ZEND_ADD_TRAIT_SPEC_HANDLER,
40430: ZEND_ADD_TRAIT_SPEC_HANDLER,
40431: ZEND_ADD_TRAIT_SPEC_HANDLER,
40432: ZEND_ADD_TRAIT_SPEC_HANDLER,
40433: ZEND_ADD_TRAIT_SPEC_HANDLER,
40434: ZEND_ADD_TRAIT_SPEC_HANDLER,
40435: ZEND_ADD_TRAIT_SPEC_HANDLER,
40436: ZEND_ADD_TRAIT_SPEC_HANDLER,
40437: ZEND_ADD_TRAIT_SPEC_HANDLER,
40438: ZEND_ADD_TRAIT_SPEC_HANDLER,
40439: ZEND_ADD_TRAIT_SPEC_HANDLER,
40440: ZEND_ADD_TRAIT_SPEC_HANDLER,
40441: ZEND_ADD_TRAIT_SPEC_HANDLER,
40442: ZEND_ADD_TRAIT_SPEC_HANDLER,
40443: ZEND_ADD_TRAIT_SPEC_HANDLER,
40444: ZEND_ADD_TRAIT_SPEC_HANDLER,
40445: ZEND_ADD_TRAIT_SPEC_HANDLER,
40446: ZEND_ADD_TRAIT_SPEC_HANDLER,
40447: ZEND_ADD_TRAIT_SPEC_HANDLER,
40448: ZEND_ADD_TRAIT_SPEC_HANDLER,
40449: ZEND_ADD_TRAIT_SPEC_HANDLER,
40450: ZEND_ADD_TRAIT_SPEC_HANDLER,
40451: ZEND_ADD_TRAIT_SPEC_HANDLER,
40452: ZEND_ADD_TRAIT_SPEC_HANDLER,
40453: ZEND_BIND_TRAITS_SPEC_HANDLER,
40454: ZEND_BIND_TRAITS_SPEC_HANDLER,
40455: ZEND_BIND_TRAITS_SPEC_HANDLER,
40456: ZEND_BIND_TRAITS_SPEC_HANDLER,
40457: ZEND_BIND_TRAITS_SPEC_HANDLER,
40458: ZEND_BIND_TRAITS_SPEC_HANDLER,
40459: ZEND_BIND_TRAITS_SPEC_HANDLER,
40460: ZEND_BIND_TRAITS_SPEC_HANDLER,
40461: ZEND_BIND_TRAITS_SPEC_HANDLER,
40462: ZEND_BIND_TRAITS_SPEC_HANDLER,
40463: ZEND_BIND_TRAITS_SPEC_HANDLER,
40464: ZEND_BIND_TRAITS_SPEC_HANDLER,
40465: ZEND_BIND_TRAITS_SPEC_HANDLER,
40466: ZEND_BIND_TRAITS_SPEC_HANDLER,
40467: ZEND_BIND_TRAITS_SPEC_HANDLER,
40468: ZEND_BIND_TRAITS_SPEC_HANDLER,
40469: ZEND_BIND_TRAITS_SPEC_HANDLER,
40470: ZEND_BIND_TRAITS_SPEC_HANDLER,
40471: ZEND_BIND_TRAITS_SPEC_HANDLER,
40472: ZEND_BIND_TRAITS_SPEC_HANDLER,
40473: ZEND_BIND_TRAITS_SPEC_HANDLER,
40474: ZEND_BIND_TRAITS_SPEC_HANDLER,
40475: ZEND_BIND_TRAITS_SPEC_HANDLER,
40476: ZEND_BIND_TRAITS_SPEC_HANDLER,
40477: ZEND_BIND_TRAITS_SPEC_HANDLER,
40478: ZEND_NULL_HANDLER,
40479: ZEND_NULL_HANDLER,
40480: ZEND_NULL_HANDLER,
40481: ZEND_NULL_HANDLER,
40482: ZEND_NULL_HANDLER,
40483: ZEND_NULL_HANDLER,
40484: ZEND_NULL_HANDLER,
40485: ZEND_NULL_HANDLER,
40486: ZEND_NULL_HANDLER,
40487: ZEND_NULL_HANDLER,
40488: ZEND_NULL_HANDLER,
40489: ZEND_NULL_HANDLER,
40490: ZEND_NULL_HANDLER,
40491: ZEND_SEPARATE_SPEC_VAR_UNUSED_HANDLER,
1.1 misho 40492: ZEND_NULL_HANDLER,
40493: ZEND_NULL_HANDLER,
40494: ZEND_NULL_HANDLER,
40495: ZEND_NULL_HANDLER,
40496: ZEND_NULL_HANDLER,
40497: ZEND_NULL_HANDLER,
40498: ZEND_NULL_HANDLER,
40499: ZEND_NULL_HANDLER,
40500: ZEND_NULL_HANDLER,
40501: ZEND_NULL_HANDLER,
40502: ZEND_NULL_HANDLER,
1.1.1.2 misho 40503: ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
40504: ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
40505: ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
40506: ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
40507: ZEND_QM_ASSIGN_VAR_SPEC_CONST_HANDLER,
40508: ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
40509: ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
40510: ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
40511: ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
40512: ZEND_QM_ASSIGN_VAR_SPEC_TMP_HANDLER,
40513: ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
40514: ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
40515: ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
40516: ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
40517: ZEND_QM_ASSIGN_VAR_SPEC_VAR_HANDLER,
1.1 misho 40518: ZEND_NULL_HANDLER,
40519: ZEND_NULL_HANDLER,
40520: ZEND_NULL_HANDLER,
40521: ZEND_NULL_HANDLER,
40522: ZEND_NULL_HANDLER,
1.1.1.2 misho 40523: ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
40524: ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
40525: ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
40526: ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
40527: ZEND_QM_ASSIGN_VAR_SPEC_CV_HANDLER,
40528: ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
40529: ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
40530: ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
40531: ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
40532: ZEND_JMP_SET_VAR_SPEC_CONST_HANDLER,
40533: ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
40534: ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
40535: ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
40536: ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
40537: ZEND_JMP_SET_VAR_SPEC_TMP_HANDLER,
40538: ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
40539: ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
40540: ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
40541: ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
40542: ZEND_JMP_SET_VAR_SPEC_VAR_HANDLER,
1.1 misho 40543: ZEND_NULL_HANDLER,
40544: ZEND_NULL_HANDLER,
40545: ZEND_NULL_HANDLER,
40546: ZEND_NULL_HANDLER,
40547: ZEND_NULL_HANDLER,
1.1.1.2 misho 40548: ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
40549: ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
40550: ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
40551: ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
40552: ZEND_JMP_SET_VAR_SPEC_CV_HANDLER,
1.1 misho 40553: ZEND_NULL_HANDLER
40554: };
40555: zend_opcode_handlers = (opcode_handler_t*)labels;
40556: }
40557: static opcode_handler_t zend_vm_get_opcode_handler(zend_uchar opcode, zend_op* op)
40558: {
40559: static const int zend_vm_decode[] = {
40560: _UNUSED_CODE, /* 0 */
40561: _CONST_CODE, /* 1 = IS_CONST */
40562: _TMP_CODE, /* 2 = IS_TMP_VAR */
40563: _UNUSED_CODE, /* 3 */
40564: _VAR_CODE, /* 4 = IS_VAR */
40565: _UNUSED_CODE, /* 5 */
40566: _UNUSED_CODE, /* 6 */
40567: _UNUSED_CODE, /* 7 */
40568: _UNUSED_CODE, /* 8 = IS_UNUSED */
40569: _UNUSED_CODE, /* 9 */
40570: _UNUSED_CODE, /* 10 */
40571: _UNUSED_CODE, /* 11 */
40572: _UNUSED_CODE, /* 12 */
40573: _UNUSED_CODE, /* 13 */
40574: _UNUSED_CODE, /* 14 */
40575: _UNUSED_CODE, /* 15 */
40576: _CV_CODE /* 16 = IS_CV */
40577: };
1.1.1.2 misho 40578: return zend_opcode_handlers[opcode * 25 + zend_vm_decode[op->op1_type] * 5 + zend_vm_decode[op->op2_type]];
1.1 misho 40579: }
40580:
40581: ZEND_API void zend_vm_set_opcode_handler(zend_op* op)
40582: {
40583: op->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op);
40584: }
40585:
40586: ZEND_API int zend_do_fcall(ZEND_OPCODE_HANDLER_ARGS)
40587: {
40588: return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
40589: }
40590:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>