diff options
Diffstat (limited to 'Zend')
| -rw-r--r-- | Zend/zend_compile.c | 81 | ||||
| -rw-r--r-- | Zend/zend_compile.h | 20 | ||||
| -rw-r--r-- | Zend/zend_default_classes.c | 4 | ||||
| -rw-r--r-- | Zend/zend_exceptions.c | 4 | ||||
| -rw-r--r-- | Zend/zend_execute.c | 1070 | ||||
| -rw-r--r-- | Zend/zend_execute.h | 3 | ||||
| -rw-r--r-- | Zend/zend_execute_API.c | 36 | ||||
| -rw-r--r-- | Zend/zend_globals.h | 3 | ||||
| -rw-r--r-- | Zend/zend_language_parser.y | 15 | ||||
| -rw-r--r-- | Zend/zend_language_scanner.l | 2 | ||||
| -rw-r--r-- | Zend/zend_opcode.c | 5 | 
11 files changed, 674 insertions, 569 deletions
| diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index a5b58f16f6..aae5653cea 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -122,7 +122,6 @@ void zend_init_compiler_data_structures(TSRMLS_D)  	CG(in_compilation) = 0;  	CG(start_lineno) = 0;  	init_compiler_declarables(TSRMLS_C); -	CG(throw_list) = NULL;  	zend_hash_apply(CG(auto_globals), (apply_func_t) zend_auto_global_arm TSRMLS_CC);  #ifdef ZEND_MULTIBYTE @@ -1085,8 +1084,6 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n  		zend_stack_push(&CG(foreach_copy_stack), (void *) &switch_entry.cond, sizeof(znode));  	} -	function_token->throw_list = CG(throw_list); -	CG(throw_list) = NULL;	  	if (CG(doc_comment)) {  		CG(active_op_array)->doc_comment = estrndup(CG(doc_comment), CG(doc_comment_len)); @@ -1095,11 +1092,22 @@ void zend_do_begin_function_declaration(znode *function_token, znode *function_n  	}  } +void zend_do_handle_exception(TSRMLS_D) +{ +	zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC); + +	opline->opcode = ZEND_HANDLE_EXCEPTION; +	SET_UNUSED(opline->op1); +	SET_UNUSED(opline->op2); +} +  void zend_do_end_function_declaration(znode *function_token TSRMLS_DC)  {  	zend_do_extended_info(TSRMLS_C);  	zend_do_return(NULL, 0 TSRMLS_CC); +	zend_do_handle_exception(TSRMLS_C); +  	pass_two(CG(active_op_array) TSRMLS_CC);  	if (CG(active_class_entry) @@ -1115,8 +1123,6 @@ void zend_do_end_function_declaration(znode *function_token TSRMLS_DC)  	/* Pop the switch and foreach seperators */  	zend_stack_del_top(&CG(switch_cond_stack));  	zend_stack_del_top(&CG(foreach_copy_stack)); - -	CG(throw_list) = function_token->throw_list;  } @@ -1358,16 +1364,6 @@ void zend_do_end_function_call(znode *function_name, znode *result, znode *argum  	*result = opline->result;  	SET_UNUSED(opline->op2); -	/* Check how much this is really needed -	  opline->op2.u.constant.value.lval = is_method; -	*/ -	if (CG(throw_list) != NULL) { -		long op_number = get_next_op_number(CG(active_op_array))-1; -		zend_llist_add_element(CG(throw_list), &op_number); -	} else { -		opline->op2.u.opline_num = -1; -	} -  	zend_stack_del_top(&CG(function_call_stack));  	opline->extended_value = argument_list->u.constant.value.lval;  } @@ -1536,12 +1532,46 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC)  } +static int zend_add_try_element(zend_uint try_op TSRMLS_DC) +{ +	int try_catch_offset = CG(active_op_array)->last_try_catch++; + +	CG(active_op_array)->try_catch_array = erealloc(CG(active_op_array)->try_catch_array, sizeof(zend_try_catch_element)*CG(active_op_array)->last_try_catch); +	CG(active_op_array)->try_catch_array[try_catch_offset].try_op = try_op; +	return try_catch_offset; +} + +static void zend_add_catch_element(int offset, zend_uint catch_op TSRMLS_DC) +{ +	CG(active_op_array)->try_catch_array[offset].catch_op = catch_op; +} + + +void zend_do_first_catch(znode *open_parentheses TSRMLS_DC) +{ +	open_parentheses->u.opline_num = get_next_op_number(CG(active_op_array)); +} + + +void zend_initialize_try_catch_element(znode *try_token TSRMLS_DC) +{ +	zend_add_catch_element(try_token->u.opline_num, get_next_op_number(CG(active_op_array)) TSRMLS_CC); +} + + +void zend_do_mark_last_catch(znode *first_catch, znode *last_additional_catch TSRMLS_DC) +{ +	if (last_additional_catch->u.opline_num == -1) { +		CG(active_op_array)->opcodes[first_catch->u.opline_num].op1.u.EA.type = 1; +	} else { +		CG(active_op_array)->opcodes[last_additional_catch->u.opline_num].op1.u.EA.type = 1; +	} +} + +  void zend_do_try(znode *try_token TSRMLS_DC)  { -	try_token->throw_list = (void *) CG(throw_list); -	CG(throw_list) = (zend_llist *) emalloc(sizeof(zend_llist)); -	zend_llist_init(CG(throw_list), sizeof(long), NULL, 0); -	/* Initialize try backpatch list used to backpatch throw, do_fcall */ +	try_token->u.opline_num = zend_add_try_element(get_next_op_number(CG(active_op_array)) TSRMLS_CC);  }  static void throw_list_applier(long *opline_num, long *catch_opline) @@ -1575,13 +1605,8 @@ void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var,  	opline->op1 = *catch_class;  /*	SET_UNUSED(opline->op1); *//* FIXME: Define IS_CLASS or something like that */  	opline->op2 = *catch_var; +	opline->op1.u.EA.type = 0; /* 1 means it's the last catch in the block */ -	if (first_catch) { -		zend_llist_apply_with_argument(CG(throw_list), (llist_apply_with_arg_func_t) throw_list_applier, &CG(catch_begin) TSRMLS_CC); -		zend_llist_destroy(CG(throw_list)); -		efree(CG(throw_list)); -		CG(throw_list) = (void *) try_token->throw_list; -	}  	try_token->u.opline_num = catch_op_number;  } @@ -1599,12 +1624,6 @@ void zend_do_throw(znode *expr TSRMLS_DC)  	opline->opcode = ZEND_THROW;  	opline->op1 = *expr;  	SET_UNUSED(opline->op2); -	 -	if (CG(throw_list) != NULL) { -		zend_llist_add_element(CG(throw_list), &throw_op_number); -	} else { -		opline->op2.u.opline_num = -1; -	}  }  ZEND_API void function_add_ref(zend_function *function) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 5f9b775d00..98226c21cf 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -52,7 +52,6 @@ typedef struct _zend_op zend_op;  typedef struct _znode {  	int op_type; -	zend_llist *throw_list; /* Try and save this space later on */  	union {  		zval constant; @@ -69,8 +68,8 @@ typedef struct _znode {  typedef struct _zend_execute_data zend_execute_data; -#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data, zend_op_array *op_array TSRMLS_DC -#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data, op_array TSRMLS_CC +#define ZEND_OPCODE_HANDLER_ARGS zend_execute_data *execute_data, zend_op *opline, zend_op_array *op_array TSRMLS_DC +#define ZEND_OPCODE_HANDLER_ARGS_PASSTHRU execute_data, opline, op_array TSRMLS_CC  typedef int (*opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS); @@ -94,6 +93,12 @@ typedef struct _zend_brk_cont_element {  } zend_brk_cont_element; +typedef struct _zend_try_catch_element { +	zend_uint try_op; +	zend_uint catch_op;  /* ketchup! */ +} zend_try_catch_element; + +  #define ZEND_ACC_STATIC			0x01  #define ZEND_ACC_ABSTRACT		0x02  #define ZEND_ACC_FINAL			0x04 @@ -160,6 +165,9 @@ struct _zend_op_array {  	zend_uint last_brk_cont;  	zend_uint current_brk_cont; +	zend_try_catch_element *try_catch_array; +	int last_try_catch; +  	/* static variables support */  	HashTable *static_variables; @@ -352,6 +360,7 @@ void zend_do_fetch_class_name(znode *result, znode *class_entry, znode *class_na  void zend_do_begin_class_member_function_call(TSRMLS_D);  void zend_do_end_function_call(znode *function_name, znode *result, znode *argument_list, int is_method, int is_dynamic_fcall TSRMLS_DC);  void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC); +void zend_do_handle_exception(TSRMLS_D);  void zend_do_try(znode *try_token TSRMLS_DC);  void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var, zend_bool first_catch TSRMLS_DC); @@ -483,6 +492,9 @@ int print_class(zend_class_entry *class_entry TSRMLS_DC);  void print_op_array(zend_op_array *op_array, int optimizations);  int pass_two(zend_op_array *op_array TSRMLS_DC);  zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array); +void zend_do_first_catch(znode *open_parentheses TSRMLS_DC); +void zend_initialize_try_catch_element(znode *try_token TSRMLS_DC); +void zend_do_mark_last_catch(znode *first_catch, znode *last_additional_catch TSRMLS_DC);  ZEND_API zend_bool zend_is_compiling(TSRMLS_D);  ZEND_API char *zend_make_compiled_string_description(char *name TSRMLS_DC);  ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers TSRMLS_DC); @@ -680,6 +692,8 @@ int zendlex(znode *zendlval TSRMLS_DC);  #define ZEND_ISSET_ISEMPTY_PROP_OBJ	148 +#define ZEND_HANDLE_EXCEPTION		149 +  /* end of block */  /* END: OPCODES */ diff --git a/Zend/zend_default_classes.c b/Zend/zend_default_classes.c index 9292c6edac..c061584062 100644 --- a/Zend/zend_default_classes.c +++ b/Zend/zend_default_classes.c @@ -435,7 +435,7 @@ ZEND_API void zend_throw_exception_ex(zend_class_entry *exception_ce, long code  	efree(message); -	EG(exception) = ex; +	zend_throw_exception_internal(ex TSRMLS_CC);  }  /* at the moment we can't use zend_throw_exception_ex because we don't have a protable @@ -465,7 +465,7 @@ ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message  		zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC);  	} -	EG(exception) = ex; +	zend_throw_exception_internal(ex TSRMLS_CC);  }  static void zend_error_va(int type, const char *file, uint lineno, const char *format, ...) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 9292c6edac..c061584062 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -435,7 +435,7 @@ ZEND_API void zend_throw_exception_ex(zend_class_entry *exception_ce, long code  	efree(message); -	EG(exception) = ex; +	zend_throw_exception_internal(ex TSRMLS_CC);  }  /* at the moment we can't use zend_throw_exception_ex because we don't have a protable @@ -465,7 +465,7 @@ ZEND_API void zend_throw_exception(zend_class_entry *exception_ce, char *message  		zend_update_property_long(default_exception_ptr, ex, "code", sizeof("code")-1, code TSRMLS_CC);  	} -	EG(exception) = ex; +	zend_throw_exception_internal(ex TSRMLS_CC);  }  static void zend_error_va(int type, const char *file, uint lineno, const char *format, ...) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3296e67647..ffaadaa133 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1202,6 +1202,14 @@ static int zend_check_symbol(zval **pz TSRMLS_DC)  	EX(opline)++;			\  	return 0; /* CHECK_ME */ +#define SET_OPCODE(new_op)	\ +	CHECK_SYMBOL_TABLES()	\ +	EX(opline) = new_op; + +#define INC_OPCODE()		\ +	CHECK_SYMBOL_TABLES()	\ +	EX(opline)++ +  #define RETURN_FROM_EXECUTE_LOOP(execute_data)								\  	free_alloca(EX(Ts));													\  	EG(in_execution) = EX(original_in_execution);							\ @@ -1230,9 +1238,9 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)  	EG(in_execution) = 1;  	if (op_array->start_op) { -		EX(opline) = op_array->start_op; +		SET_OPCODE(op_array->start_op);  	} else { -		EX(opline) = op_array->opcodes; +		SET_OPCODE(op_array->opcodes);  	}  	if (op_array->uses_this && EG(This)) { @@ -1261,7 +1269,7 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)  #endif  		zend_clean_garbage(TSRMLS_C); -		if (EX(opline)->handler(&execute_data, op_array TSRMLS_CC)) { +		if (EX(opline)->handler(&execute_data, EX(opline), op_array TSRMLS_CC)) {  			return;  		}  	} @@ -1274,230 +1282,230 @@ ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)  int zend_add_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	add_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	add_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_sub_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	sub_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	sub_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_mul_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	mul_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	mul_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_div_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	div_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	div_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_mod_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	mod_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	mod_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_sl_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	shift_left_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	shift_left_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_sr_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	shift_right_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	shift_right_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_concat_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	concat_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	concat_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_identical_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_identical_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_identical_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_not_identical_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_not_identical_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_not_identical_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_equal_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_equal_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_equal_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_not_equal_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_not_equal_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_not_equal_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_smaller_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_smaller_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_smaller_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_is_smaller_or_equal_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	is_smaller_or_equal_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	is_smaller_or_equal_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_bw_or_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	bitwise_or_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	bitwise_or_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_bw_and_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	bitwise_and_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	bitwise_and_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_bw_xor_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	bitwise_xor_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	bitwise_xor_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_bool_xor_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	boolean_xor_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -		get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	boolean_xor_function(&EX_T(opline->result.u.var).tmp_var,  +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +		get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  }  int zend_bw_not_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	bitwise_not_function(&EX_T(EX(opline)->result.u.var).tmp_var, -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	bitwise_not_function(&EX_T(opline->result.u.var).tmp_var, +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  }  int zend_bool_not_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	boolean_not_function(&EX_T(EX(opline)->result.u.var).tmp_var, -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	boolean_not_function(&EX_T(opline->result.u.var).tmp_var, +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R) TSRMLS_CC); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  }  static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result, zval *op1, zval *op2 TSRMLS_DC), ZEND_OPCODE_HANDLER_ARGS)  { -	zend_op *op_data = EX(opline)+1; -	zval **object_ptr = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_op *op_data = opline+1; +	zval **object_ptr = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);  	zval *object; -	zval *property = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval *property = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	zval *free_value;  	zval *value = get_zval_ptr(&op_data->op1, EX(Ts), &free_value, BP_VAR_R);  	zval tmp; -	znode *result = &EX(opline)->result; +	znode *result = &opline->result;  	zval **retval = &EX_T(result->u.var).var.ptr;  	int have_get_ptr = 0; @@ -1514,7 +1522,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result  		SELECTIVE_PZVAL_LOCK(*retval, result);  	} else {  		/* here we are sure we are dealing with an object */ -		switch (EX(opline)->op2.op_type) { +		switch (opline->op2.op_type) {  			case IS_CONST:  				/* already a constant string */  				break; @@ -1530,7 +1538,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result  		}  		/* here property is a string */ -		if (EX(opline)->extended_value == ZEND_ASSIGN_OBJ +		if (opline->extended_value == ZEND_ASSIGN_OBJ  			&& Z_OBJ_HT_P(object)->get_property_ptr_ptr) {  			zval **zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property TSRMLS_CC);  			if (zptr != NULL) { 			/* NULL means no success in getting PTR */ @@ -1546,7 +1554,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result  		if (!have_get_ptr) {  			zval *z; -			switch (EX(opline)->extended_value) { +			switch (opline->extended_value) {  				case ZEND_ASSIGN_OBJ:  					z = Z_OBJ_HT_P(object)->read_property(object, property, 0 TSRMLS_CC);  					break; @@ -1556,7 +1564,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result  			}  			SEPARATE_ZVAL_IF_NOT_REF(&z);  			binary_op(z, z, value TSRMLS_CC); -			switch (EX(opline)->extended_value) { +			switch (opline->extended_value) {  				case ZEND_ASSIGN_OBJ:  					Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);  					break; @@ -1579,7 +1587,7 @@ static inline int zend_binary_assign_op_obj_helper(int (*binary_op)(zval *result  	}  	/* assign_obj has two opcodes! */ -	EX(opline)++; +	INC_OPCODE();  	NEXT_OPCODE();  } @@ -1590,21 +1598,21 @@ static inline int zend_binary_assign_op_helper(int (*binary_op)(zval *result, zv  	zval *value;  	zend_bool increment_opline = 0; -	switch (EX(opline)->extended_value) { +	switch (opline->extended_value) {  		case ZEND_ASSIGN_OBJ:  			return zend_binary_assign_op_obj_helper(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  			break;  		case ZEND_ASSIGN_DIM: { -				zval **object_ptr = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W TSRMLS_CC); +				zval **object_ptr = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);  				(*object_ptr)->refcount++;  /* undo the effect of get_obj_zval_ptr_ptr() */  				if ((*object_ptr)->type == IS_OBJECT) {  					return zend_binary_assign_op_obj_helper(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  				} else { -					zend_op *data_opline = EX(opline)+1; +					zend_op *data_opline = opline+1; -					zend_fetch_dimension_address(&data_opline->op2, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_RW TSRMLS_CC); +					zend_fetch_dimension_address(&data_opline->op2, &opline->op1, &opline->op2, EX(Ts), BP_VAR_RW TSRMLS_CC);  					value = get_zval_ptr(&data_opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  					var_ptr = get_zval_ptr_ptr(&data_opline->op2, EX(Ts), BP_VAR_RW); @@ -1614,8 +1622,8 @@ static inline int zend_binary_assign_op_helper(int (*binary_op)(zval *result, zv  			}  			break;  		default: -			value = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); -			var_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_RW); +			value = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +			var_ptr = get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_RW);  			EG(free_op1) = 0;  			/* do nothing */  			break; @@ -1626,23 +1634,23 @@ static inline int zend_binary_assign_op_helper(int (*binary_op)(zval *result, zv  	}  	if (*var_ptr == EG(error_zval_ptr)) { -		EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); -		SELECTIVE_PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr, &EX(opline)->result); -		AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +		EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); +		SELECTIVE_PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &opline->result); +		AI_USE_PTR(EX_T(opline->result.u.var).var);  		NEXT_OPCODE();  	}  	SEPARATE_ZVAL_IF_NOT_REF(var_ptr);  	binary_op(*var_ptr, *var_ptr, value TSRMLS_CC); -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = var_ptr; -	SELECTIVE_PZVAL_LOCK(*var_ptr, &EX(opline)->result); -	FREE_OP(Ex(Ts), &EX(opline)->op1, EG(free_op1)); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	EX_T(opline->result.u.var).var.ptr_ptr = var_ptr; +	SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result); +	FREE_OP(Ex(Ts), &opline->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2)); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	if (increment_opline) { -		EX(opline)++; +		INC_OPCODE();  	}  	NEXT_OPCODE();  } @@ -1715,28 +1723,28 @@ int zend_assign_bw_xor_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_pre_inc_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_pre_incdec_property(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), increment_function TSRMLS_CC); +	zend_pre_incdec_property(&opline->result, &opline->op1, &opline->op2, EX(Ts), increment_function TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_pre_dec_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_pre_incdec_property(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), decrement_function TSRMLS_CC); +	zend_pre_incdec_property(&opline->result, &opline->op1, &opline->op2, EX(Ts), decrement_function TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_post_inc_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_post_incdec_property(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), increment_function TSRMLS_CC); +	zend_post_incdec_property(&opline->result, &opline->op1, &opline->op2, EX(Ts), increment_function TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_post_dec_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_post_incdec_property(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), decrement_function TSRMLS_CC); +	zend_post_incdec_property(&opline->result, &opline->op1, &opline->op2, EX(Ts), decrement_function TSRMLS_CC);  	NEXT_OPCODE();  } @@ -1744,24 +1752,24 @@ typedef int (*incdec_t)(zval *);  static inline int zend_incdec_op_helper(incdec_t incdec_op_arg, ZEND_OPCODE_HANDLER_ARGS)  { -	zval **var_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_RW); +	zval **var_ptr = get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_RW);  	int (*incdec_op)(zval *op1) = incdec_op_arg;  	if (!var_ptr) {  		zend_error(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");  	}  	if (*var_ptr == EG(error_zval_ptr)) { -		EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); -		SELECTIVE_PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr, &EX(opline)->result); -		AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +		EX_T(opline->result.u.var).var.ptr_ptr = &EG(uninitialized_zval_ptr); +		SELECTIVE_PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr, &opline->result); +		AI_USE_PTR(EX_T(opline->result.u.var).var);  		NEXT_OPCODE();  	} -	switch (EX(opline)->opcode) { +	switch (opline->opcode) {  		case ZEND_POST_INC:  		case ZEND_POST_DEC: -			EX_T(EX(opline)->result.u.var).tmp_var = **var_ptr; -			zendi_zval_copy_ctor(EX_T(EX(opline)->result.u.var).tmp_var); +			EX_T(opline->result.u.var).tmp_var = **var_ptr; +			zendi_zval_copy_ctor(EX_T(opline->result.u.var).tmp_var);  			break;  	} @@ -1769,12 +1777,12 @@ static inline int zend_incdec_op_helper(incdec_t incdec_op_arg, ZEND_OPCODE_HAND  	incdec_op(*var_ptr); -	switch (EX(opline)->opcode) { +	switch (opline->opcode) {  		case ZEND_PRE_INC:  		case ZEND_PRE_DEC: -			EX_T(EX(opline)->result.u.var).var.ptr_ptr = var_ptr; -			SELECTIVE_PZVAL_LOCK(*var_ptr, &EX(opline)->result); -			AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +			EX_T(opline->result.u.var).var.ptr_ptr = var_ptr; +			SELECTIVE_PZVAL_LOCK(*var_ptr, &opline->result); +			AI_USE_PTR(EX_T(opline->result.u.var).var);  			break;  	}  	NEXT_OPCODE(); @@ -1807,53 +1815,53 @@ int zend_post_dec_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_print_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); -	EX_T(EX(opline)->result.u.var).tmp_var.value.lval = 1; -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_LONG; -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	zend_print_variable(get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); +	EX_T(opline->result.u.var).tmp_var.value.lval = 1; +	EX_T(opline->result.u.var).tmp_var.type = IS_LONG; +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  }  int zend_echo_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_print_variable(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	zend_print_variable(get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  }  int zend_fetch_r_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_R TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_var_address(opline, EX(Ts), BP_VAR_R TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_w_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_fetch_var_address(opline, EX(Ts), BP_VAR_W TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_rw_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_RW TSRMLS_CC); +	zend_fetch_var_address(opline, EX(Ts), BP_VAR_RW TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)) { +	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {  		/* Behave like FETCH_W */ -		zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_W TSRMLS_CC); +		zend_fetch_var_address(opline, EX(Ts), BP_VAR_W TSRMLS_CC);  	} else {  		/* Behave like FETCH_R */ -		zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_R TSRMLS_CC); -		AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +		zend_fetch_var_address(opline, EX(Ts), BP_VAR_R TSRMLS_CC); +		AI_USE_PTR(EX_T(opline->result.u.var).var);  	}  	NEXT_OPCODE();  } @@ -1861,66 +1869,66 @@ int zend_fetch_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_fetch_unset_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_R TSRMLS_CC); -	PZVAL_UNLOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); -	if (EX_T(EX(opline)->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { -		SEPARATE_ZVAL_IF_NOT_REF(EX_T(EX(opline)->result.u.var).var.ptr_ptr); +	zend_fetch_var_address(opline, EX(Ts), BP_VAR_R TSRMLS_CC); +	PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr); +	if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { +		SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);  	} -	PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); +	PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);  	NEXT_OPCODE();  }  int zend_fetch_is_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_var_address(EX(opline), EX(Ts), BP_VAR_IS TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_var_address(opline, EX(Ts), BP_VAR_IS TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_dim_r_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (EX(opline)->extended_value == ZEND_FETCH_ADD_LOCK) { -		PZVAL_LOCK(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr); +	if (opline->extended_value == ZEND_FETCH_ADD_LOCK) { +		PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);  	} -	zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_dim_w_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_dim_rw_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_RW TSRMLS_CC); +	zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_RW TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_dim_is_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_IS TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_IS TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_dim_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)) { +	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {  		/* Behave like FETCH_DIM_W */ -		zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_W TSRMLS_CC); +		zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);  	} else {  		/* Behave like FETCH_DIM_R, except for locking used for list() */ -		zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -		AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +		zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +		AI_USE_PTR(EX_T(opline->result.u.var).var);  	}  	NEXT_OPCODE();  } @@ -1929,19 +1937,19 @@ int zend_fetch_dim_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_fetch_dim_unset_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	/* Not needed in DIM_UNSET -	if (EX(opline)->extended_value == ZEND_FETCH_ADD_LOCK) { -		PZVAL_LOCK(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr); +	if (opline->extended_value == ZEND_FETCH_ADD_LOCK) { +		PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);  	}  	*/ -	zend_fetch_dimension_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -	if (EX_T(EX(opline)->result.u.var).var.ptr_ptr == NULL) { +	zend_fetch_dimension_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +	if (EX_T(opline->result.u.var).var.ptr_ptr == NULL) {  		zend_error(E_ERROR, "Cannot unset string offsets");  	} else { -		PZVAL_UNLOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); -		if (EX_T(EX(opline)->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { -			SEPARATE_ZVAL_IF_NOT_REF(EX_T(EX(opline)->result.u.var).var.ptr_ptr); +		PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr); +		if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { +			SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);  		} -		PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); +		PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);  	}  	NEXT_OPCODE();  } @@ -1949,42 +1957,42 @@ int zend_fetch_dim_unset_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_fetch_obj_r_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_property_address_read(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_property_address_read(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_obj_w_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_property_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_obj_rw_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_property_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_RW TSRMLS_CC); +	zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_RW TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_fetch_obj_is_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_property_address_read(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_IS TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_property_address_read(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_IS TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  }  int zend_fetch_obj_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->extended_value)) { +	if (ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->extended_value)) {  		/* Behave like FETCH_OBJ_W */ -		zend_fetch_property_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_W TSRMLS_CC); +		zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);  	} else { -		zend_fetch_property_address_read(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -		AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +		zend_fetch_property_address_read(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +		AI_USE_PTR(EX_T(opline->result.u.var).var);  	}  	NEXT_OPCODE();  } @@ -1992,21 +2000,21 @@ int zend_fetch_obj_func_arg_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_fetch_obj_unset_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_property_address(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_R TSRMLS_CC); +	zend_fetch_property_address(&opline->result, &opline->op1, &opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC); -	PZVAL_UNLOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); -	if (EX_T(EX(opline)->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { -		SEPARATE_ZVAL_IF_NOT_REF(EX_T(EX(opline)->result.u.var).var.ptr_ptr); +	PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr); +	if (EX_T(opline->result.u.var).var.ptr_ptr != &EG(uninitialized_zval_ptr)) { +		SEPARATE_ZVAL_IF_NOT_REF(EX_T(opline->result.u.var).var.ptr_ptr);  	} -	PZVAL_LOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); +	PZVAL_LOCK(*EX_T(opline->result.u.var).var.ptr_ptr);  	NEXT_OPCODE();  }  int zend_fetch_dim_tmp_var_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_fetch_dimension_address_from_tmp_var(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, EX(Ts) TSRMLS_CC); -	AI_USE_PTR(EX_T(EX(opline)->result.u.var).var); +	zend_fetch_dimension_address_from_tmp_var(&opline->result, &opline->op1, &opline->op2, EX(Ts) TSRMLS_CC); +	AI_USE_PTR(EX_T(opline->result.u.var).var);  	NEXT_OPCODE();  } @@ -2015,8 +2023,8 @@ int zend_make_var_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zval *value, *value2; -	value = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); -	switch (EX(opline)->op1.op_type) { +	value = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	switch (opline->op1.op_type) {  		case IS_TMP_VAR:  			value2 = value;  			ALLOC_ZVAL(value); @@ -2034,8 +2042,8 @@ int zend_make_var_handler(ZEND_OPCODE_HANDLER_ARGS)  			break;  	} -	EX_T(EX(opline)->result.u.var).var.ptr = value; -	PZVAL_LOCK(EX_T(EX(opline)->result.u.var).var.ptr); +	EX_T(opline->result.u.var).var.ptr = value; +	PZVAL_LOCK(EX_T(opline->result.u.var).var.ptr);  	NEXT_OPCODE();  } @@ -2043,35 +2051,35 @@ int zend_make_var_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_assign_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_op *op_data = EX(opline)+1; -	zval **object_ptr = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_op *op_data = opline+1; +	zval **object_ptr = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC); -	zend_assign_to_object(&EX(opline)->result, object_ptr, &EX(opline)->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC); +	zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_OBJ TSRMLS_CC);  	/* assign_obj has two opcodes! */ -	EX(opline)++; +	INC_OPCODE();  	NEXT_OPCODE();  }  int zend_assign_dim_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_op *op_data = EX(opline)+1; -	zval **object_ptr = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W TSRMLS_CC); +	zend_op *op_data = opline+1; +	zval **object_ptr = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);  	if ((*object_ptr)->type == IS_OBJECT) { -		zend_assign_to_object(&EX(opline)->result, object_ptr, &EX(opline)->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC); +		zend_assign_to_object(&opline->result, object_ptr, &opline->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);  	} else {  		zval *value; -		zend_op *data_opline = EX(opline)+1; +		zend_op *data_opline = opline+1;  		(*object_ptr)->refcount++;  /* undo the effect of get_obj_zval_ptr_ptr() */ -		zend_fetch_dimension_address(&data_opline->op2, &EX(opline)->op1, &EX(opline)->op2, EX(Ts), BP_VAR_W TSRMLS_CC); +		zend_fetch_dimension_address(&data_opline->op2, &opline->op1, &opline->op2, EX(Ts), BP_VAR_W TSRMLS_CC);  		value = get_zval_ptr(&data_opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R); -	 	zend_assign_to_variable(&EX(opline)->result, &data_opline->op2, &data_opline->op1, value, (EG(free_op1)?IS_TMP_VAR:EX(opline)->op1.op_type), EX(Ts) TSRMLS_CC); +	 	zend_assign_to_variable(&opline->result, &data_opline->op2, &data_opline->op1, value, (EG(free_op1)?IS_TMP_VAR:opline->op1.op_type), EX(Ts) TSRMLS_CC);  	}  	/* assign_dim has two opcodes! */ -	EX(opline)++; +	INC_OPCODE();  	NEXT_OPCODE();  } @@ -2079,9 +2087,9 @@ int zend_assign_dim_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_assign_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zval *value; -	value = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	value = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R); - 	zend_assign_to_variable(&EX(opline)->result, &EX(opline)->op1, &EX(opline)->op2, value, (EG(free_op2)?IS_TMP_VAR:EX(opline)->op2.op_type), EX(Ts) TSRMLS_CC); + 	zend_assign_to_variable(&opline->result, &opline->op1, &opline->op2, value, (EG(free_op2)?IS_TMP_VAR:opline->op2.op_type), EX(Ts) TSRMLS_CC);  	/* zend_assign_to_variable() always takes care of op2, never free it! */  	NEXT_OPCODE(); @@ -2090,9 +2098,9 @@ int zend_assign_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_assign_ref_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval **value_ptr_ptr = get_zval_ptr_ptr(&EX(opline)->op2, EX(Ts), BP_VAR_W); +	zval **value_ptr_ptr = get_zval_ptr_ptr(&opline->op2, EX(Ts), BP_VAR_W); -	zend_assign_to_variable_reference(&EX(opline)->result, get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W), value_ptr_ptr, EX(Ts) TSRMLS_CC); +	zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W), value_ptr_ptr, EX(Ts) TSRMLS_CC);  	NEXT_OPCODE();  } @@ -2101,22 +2109,22 @@ int zend_assign_ref_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_jmp_handler(ZEND_OPCODE_HANDLER_ARGS)  {				  #if DEBUG_ZEND>=2 -	printf("Jumping to %d\n", EX(opline)->op1.u.opline_num); +	printf("Jumping to %d\n", opline->op1.u.opline_num);  #endif -	EX(opline) = EX(opline)->op1.u.jmp_addr; +	SET_OPCODE(opline->op1.u.jmp_addr);  	return 0; /* CHECK_ME */  }  int zend_jmpz_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	znode *op1 = &EX(opline)->op1; +	znode *op1 = &opline->op1;  	if (!i_zend_is_true(get_zval_ptr(op1, EX(Ts), &EG(free_op1), BP_VAR_R))) {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); +		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);  #endif -		EX(opline) = EX(opline)->op2.u.jmp_addr; +		SET_OPCODE(opline->op2.u.jmp_addr);  		FREE_OP(EX(Ts), op1, EG(free_op1));  		return 0; /* CHECK_ME */  	} @@ -2128,13 +2136,13 @@ int zend_jmpz_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_jmpnz_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	znode *op1 = &EX(opline)->op1; +	znode *op1 = &opline->op1;  	if (zend_is_true(get_zval_ptr(op1, EX(Ts), &EG(free_op1), BP_VAR_R))) {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); +		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);  #endif -		EX(opline) = EX(opline)->op2.u.jmp_addr; +		SET_OPCODE(opline->op2.u.jmp_addr);  		FREE_OP(EX(Ts), op1, EG(free_op1));  		return 0; /* CHECK_ME */  	} @@ -2146,18 +2154,18 @@ int zend_jmpnz_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_jmpznz_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	znode *res = &EX(opline)->op1; +	znode *res = &opline->op1;  	if (zend_is_true(get_zval_ptr(res, EX(Ts), &EG(free_op1), BP_VAR_R))) {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp on true to %d\n", EX(opline)->extended_value); +		printf("Conditional jmp on true to %d\n", opline->extended_value);  #endif -		EX(opline) = &op_array->opcodes[EX(opline)->extended_value]; +		SET_OPCODE(&op_array->opcodes[opline->extended_value]);  	} else {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp on false to %d\n", EX(opline)->op2.u.opline_num); +		printf("Conditional jmp on false to %d\n", opline->op2.u.opline_num);  #endif -		EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; +		SET_OPCODE(&op_array->opcodes[opline->op2.u.opline_num]);  	}  	FREE_OP(EX(Ts), res, EG(free_op1)); @@ -2167,7 +2175,7 @@ int zend_jmpznz_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_jmpz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_op *original_opline = EX(opline); +	zend_op *original_opline = opline;  	int retval = zend_is_true(get_zval_ptr(&original_opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R));  	FREE_OP(EX(Ts), &original_opline->op1, EG(free_op1)); @@ -2175,9 +2183,9 @@ int zend_jmpz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  	EX_T(original_opline->result.u.var).tmp_var.type = IS_BOOL;  	if (!retval) {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); +		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);  #endif -		EX(opline) = EX(opline)->op2.u.jmp_addr; +		SET_OPCODE(opline->op2.u.jmp_addr);  		return 0; /* CHECK_ME */  	}  	NEXT_OPCODE(); @@ -2186,7 +2194,7 @@ int zend_jmpz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_jmpnz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_op *original_opline = EX(opline); +	zend_op *original_opline = opline;  	int retval = zend_is_true(get_zval_ptr(&original_opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R));  	FREE_OP(EX(Ts), &original_opline->op1, EG(free_op1)); @@ -2194,9 +2202,9 @@ int zend_jmpnz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  	EX_T(original_opline->result.u.var).tmp_var.type = IS_BOOL;  	if (retval) {  #if DEBUG_ZEND>=2 -		printf("Conditional jmp to %d\n", EX(opline)->op2.u.opline_num); +		printf("Conditional jmp to %d\n", opline->op2.u.opline_num);  #endif -		EX(opline) = EX(opline)->op2.u.jmp_addr; +		SET_OPCODE(opline->op2.u.jmp_addr);  		return 0; /* CHECK_ME */  	}  	NEXT_OPCODE(); @@ -2205,28 +2213,28 @@ int zend_jmpnz_ex_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_free_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zendi_zval_dtor(EX_T(EX(opline)->op1.u.var).tmp_var); +	zendi_zval_dtor(EX_T(opline->op1.u.var).tmp_var);  	NEXT_OPCODE();  }  int zend_init_string_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	EX_T(EX(opline)->result.u.var).tmp_var.value.str.val = emalloc(1); -	EX_T(EX(opline)->result.u.var).tmp_var.value.str.val[0] = 0; -	EX_T(EX(opline)->result.u.var).tmp_var.value.str.len = 0; -	EX_T(EX(opline)->result.u.var).tmp_var.refcount = 1; -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_STRING; -	EX_T(EX(opline)->result.u.var).tmp_var.is_ref = 0; +	EX_T(opline->result.u.var).tmp_var.value.str.val = emalloc(1); +	EX_T(opline->result.u.var).tmp_var.value.str.val[0] = 0; +	EX_T(opline->result.u.var).tmp_var.value.str.len = 0; +	EX_T(opline->result.u.var).tmp_var.refcount = 1; +	EX_T(opline->result.u.var).tmp_var.type = IS_STRING; +	EX_T(opline->result.u.var).tmp_var.is_ref = 0;  	NEXT_OPCODE();  }  int zend_add_char_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	add_char_to_string(&EX_T(EX(opline)->result.u.var).tmp_var, -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_NA), -		&EX(opline)->op2.u.constant); +	add_char_to_string(&EX_T(opline->result.u.var).tmp_var, +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_NA), +		&opline->op2.u.constant);  	/* FREE_OP is missing intentionally here - we're always working on the same temporary variable */  	NEXT_OPCODE();  } @@ -2234,9 +2242,9 @@ int zend_add_char_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_add_string_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	add_string_to_string(&EX_T(EX(opline)->result.u.var).tmp_var, -		get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_NA), -		&EX(opline)->op2.u.constant); +	add_string_to_string(&EX_T(opline->result.u.var).tmp_var, +		get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_NA), +		&opline->op2.u.constant);  	/* FREE_OP is missing intentionally here - we're always working on the same temporary variable */  	NEXT_OPCODE();  } @@ -2244,7 +2252,7 @@ int zend_add_string_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_add_var_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *var = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval *var = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	zval var_copy;  	int use_copy; @@ -2252,8 +2260,8 @@ int zend_add_var_handler(ZEND_OPCODE_HANDLER_ARGS)  	if (use_copy) {  		var = &var_copy;  	} -	add_string_to_string(	&EX_T(EX(opline)->result.u.var).tmp_var, -							get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_NA), +	add_string_to_string(	&EX_T(opline->result.u.var).tmp_var, +							get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_NA),  							var);  	if (use_copy) {  		zval_dtor(var); @@ -2264,7 +2272,7 @@ int zend_add_var_handler(ZEND_OPCODE_HANDLER_ARGS)  	 * which aren't affected by FREE_OP(Ts, )'s anyway, unless they're  	 * string offsets or overloaded objects  	 */ -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  } @@ -2275,26 +2283,26 @@ int zend_fetch_class_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval *class_name; -	if (EX(opline)->op2.op_type == IS_UNUSED) { -		EX_T(EX(opline)->result.u.var).class_entry = zend_fetch_class(NULL, 0, EX(opline)->extended_value TSRMLS_CC); +	if (opline->op2.op_type == IS_UNUSED) { +		EX_T(opline->result.u.var).class_entry = zend_fetch_class(NULL, 0, opline->extended_value TSRMLS_CC);  		NEXT_OPCODE();  	} -	class_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	class_name = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	switch (class_name->type) {  		case IS_OBJECT: -			EX_T(EX(opline)->result.u.var).class_entry = Z_OBJCE_P(class_name); +			EX_T(opline->result.u.var).class_entry = Z_OBJCE_P(class_name);  			break;  		case IS_STRING: -			EX_T(EX(opline)->result.u.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC); +			EX_T(opline->result.u.var).class_entry = zend_fetch_class(Z_STRVAL_P(class_name), Z_STRLEN_P(class_name), ZEND_FETCH_CLASS_DEFAULT TSRMLS_CC);  			break;  		default:  			zend_error(E_ERROR, "Class name must be a valid object or a string");  			break;  	} -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  } @@ -2303,12 +2311,12 @@ int zend_init_ctor_call_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); -	if (EX(opline)->op1.op_type == IS_VAR) { -		SELECTIVE_PZVAL_LOCK(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr, &EX(opline)->op1); +	if (opline->op1.op_type == IS_VAR) { +		SELECTIVE_PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr, &opline->op1);  	}  	/* We are not handling overloaded classes right now */ -	EX(object) = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	EX(object) = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	if (!PZVAL_IS_REF(EX(object)) || !EG(implicit_clone)) {  		EX(object)->refcount++; /* For $this pointer */  	} else { @@ -2341,7 +2349,7 @@ int zend_init_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); -	function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	function_name = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	if (Z_TYPE_P(function_name)!=IS_STRING) {  		zend_error(E_ERROR, "Method name must be a string"); @@ -2352,7 +2360,7 @@ int zend_init_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)  	EX(calling_scope) = EG(scope); -	EX(object) = get_obj_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R TSRMLS_CC); +	EX(object) = get_obj_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R TSRMLS_CC);  	if (EX(object) && EX(object)->type == IS_OBJECT) {  		/* First, locate the function. */ @@ -2385,7 +2393,7 @@ int zend_init_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)  		EX(calling_scope) = NULL;  	} -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  } @@ -2398,17 +2406,17 @@ int zend_init_static_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); -	ce = EX_T(EX(opline)->op1.u.var).class_entry; -	if(EX(opline)->op2.op_type != IS_UNUSED) { +	ce = EX_T(opline->op1.u.var).class_entry; +	if(opline->op2.op_type != IS_UNUSED) {  		char *function_name_strval;  		int function_name_strlen; -		zend_bool is_const = (EX(opline)->op2.op_type == IS_CONST); +		zend_bool is_const = (opline->op2.op_type == IS_CONST);  		if (is_const) { -			function_name_strval = EX(opline)->op2.u.constant.value.str.val; -			function_name_strlen = EX(opline)->op2.u.constant.value.str.len; +			function_name_strval = opline->op2.u.constant.value.str.val; +			function_name_strlen = opline->op2.u.constant.value.str.len;  		} else { -			function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +			function_name = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  			if (Z_TYPE_P(function_name) != IS_STRING) {  				zend_error(E_ERROR, "Function name must be a string"); @@ -2421,7 +2429,7 @@ int zend_init_static_method_call_handler(ZEND_OPCODE_HANDLER_ARGS)  		if (!is_const) {  			efree(function_name_strval); -			FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +			FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  		}	  	} else {  		if(!ce->constructor) { @@ -2453,13 +2461,13 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); -	is_const = (EX(opline)->op2.op_type == IS_CONST); +	is_const = (opline->op2.op_type == IS_CONST);  	if (is_const) { -		function_name_strval = EX(opline)->op2.u.constant.value.str.val; -		function_name_strlen = EX(opline)->op2.u.constant.value.str.len; +		function_name_strval = opline->op2.u.constant.value.str.val; +		function_name_strlen = opline->op2.u.constant.value.str.len;  	} else { -		function_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +		function_name = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  		if (Z_TYPE_P(function_name) != IS_STRING) {  			zend_error(E_ERROR, "Function name must be a string"); @@ -2476,7 +2484,7 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS)  	efree(lcname);  	if (!is_const) { -		FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +		FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	}   	EX(calling_scope) = function->common.scope; @@ -2492,7 +2500,7 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  	zval **original_return_value;  	zend_class_entry *current_scope;  	zval *current_this; -	int return_value_used = RETURN_VALUE_USED(EX(opline)); +	int return_value_used = RETURN_VALUE_USED(opline);  	zend_bool should_change_scope;  	if (EX(function_state).function->common.fn_flags & ZEND_ACC_ABSTRACT) { @@ -2500,9 +2508,9 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		NEXT_OPCODE(); /* Never reached */  	} -	zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) EX(opline)->extended_value, NULL); +	zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) opline->extended_value, NULL); -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr; +	EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;  	if (EX(function_state).function->type == ZEND_USER_FUNCTION  		|| EX(function_state).function->common.scope) { @@ -2515,7 +2523,7 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		should_change_scope = 0;  	} -	EX_T(EX(opline)->result.u.var).var.fcall_returned_reference = 0; +	EX_T(opline->result.u.var).var.fcall_returned_reference = 0;  	if (EX(function_state).function->common.scope) {  		if (!EG(This) && !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC)) { @@ -2529,8 +2537,8 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		}  	}  	if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {	 -		ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -		INIT_ZVAL(*(EX_T(EX(opline)->result.u.var).var.ptr)); +		ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +		INIT_ZVAL(*(EX_T(opline->result.u.var).var.ptr));  		if (EX(function_state).function->common.arg_info) {  			zend_uint i=0; @@ -2547,21 +2555,21 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		}  		if (!zend_execute_internal) {  			/* saves one function call if zend_execute_internal is not used */ -			((zend_internal_function *) EX(function_state).function)->handler(EX(opline)->extended_value, EX_T(EX(opline)->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC); +			((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC);  		} else {  			zend_execute_internal(execute_data, return_value_used TSRMLS_CC);  		}  		EG(current_execute_data) = execute_data; -		EX_T(EX(opline)->result.u.var).var.ptr->is_ref = 0; -		EX_T(EX(opline)->result.u.var).var.ptr->refcount = 1; +		EX_T(opline->result.u.var).var.ptr->is_ref = 0; +		EX_T(opline->result.u.var).var.ptr->refcount = 1;  		if (!return_value_used) { -			zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); +			zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);  		}  	} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {  		HashTable *calling_symbol_table; -		EX_T(EX(opline)->result.u.var).var.ptr = NULL; +		EX_T(opline->result.u.var).var.ptr = NULL;  		if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {  			/*printf("Cache hit!  Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/  			EX(function_state).function_symbol_table = *(EG(symtable_cache_ptr)--); @@ -2573,19 +2581,19 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		calling_symbol_table = EG(active_symbol_table);  		EG(active_symbol_table) = EX(function_state).function_symbol_table;  		original_return_value = EG(return_value_ptr_ptr); -		EG(return_value_ptr_ptr) = EX_T(EX(opline)->result.u.var).var.ptr_ptr; +		EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;  		EG(active_op_array) = (zend_op_array *) EX(function_state).function;  		zend_execute(EG(active_op_array) TSRMLS_CC); -		EX_T(EX(opline)->result.u.var).var.fcall_returned_reference = EG(active_op_array)->return_reference; +		EX_T(opline->result.u.var).var.fcall_returned_reference = EG(active_op_array)->return_reference; -		if (return_value_used && !EX_T(EX(opline)->result.u.var).var.ptr) { +		if (return_value_used && !EX_T(opline->result.u.var).var.ptr) {  			if (!EG(exception)) { -				ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -				INIT_ZVAL(*EX_T(EX(opline)->result.u.var).var.ptr); +				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +				INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr);  			} -		} else if (!return_value_used && EX_T(EX(opline)->result.u.var).var.ptr) { -			zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); +		} else if (!return_value_used && EX_T(opline->result.u.var).var.ptr) { +			zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);  		}  		EG(opline_ptr) = &EX(opline); @@ -2602,12 +2610,12 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		}  		EG(active_symbol_table) = calling_symbol_table;  	} else { /* ZEND_OVERLOADED_FUNCTION */ -		ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -		INIT_ZVAL(*(EX_T(EX(opline)->result.u.var).var.ptr)); +		ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +		INIT_ZVAL(*(EX_T(opline->result.u.var).var.ptr));  			/* Not sure what should be done here if it's a static method */  		if (EX(object)) { -			Z_OBJ_HT_P(EX(object))->call_method(EX(fbc)->common.function_name, EX(opline)->extended_value, EX_T(EX(opline)->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC); +			Z_OBJ_HT_P(EX(object))->call_method(EX(fbc)->common.function_name, opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(object), return_value_used TSRMLS_CC);  		} else {  			zend_error(E_ERROR, "Cannot call overloaded function for non-object");  		} @@ -2618,10 +2626,10 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  		efree(EX(fbc));  		if (!return_value_used) { -			zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); +			zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);  		} else { -			EX_T(EX(opline)->result.u.var).var.ptr->is_ref = 0; -			EX_T(EX(opline)->result.u.var).var.ptr->refcount = 1; +			EX_T(opline->result.u.var).var.ptr->is_ref = 0; +			EX_T(opline->result.u.var).var.ptr->refcount = 1;  		}  	} @@ -2645,14 +2653,9 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS)  	zend_ptr_stack_clear_multiple(TSRMLS_C);  	if (EG(exception)) { -		if (return_value_used && EX_T(EX(opline)->result.u.var).var.ptr) { -			zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); -		} -		if (EX(opline)->op2.u.opline_num == -1) { -			RETURN_FROM_EXECUTE_LOOP(execute_data); -		} else { -			EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; -			return 0; /* CHECK_ME */ +		zend_throw_exception_internal(NULL TSRMLS_CC); +		if (return_value_used && EX_T(opline->result.u.var).var.ptr) { +			zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);  		}  	} @@ -2669,7 +2672,7 @@ int zend_do_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_do_fcall_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *fname = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *fname = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); @@ -2692,7 +2695,7 @@ int zend_do_fcall_handler(ZEND_OPCODE_HANDLER_ARGS)  		EX(calling_scope) = EX(function_state).function->common.scope;  	} while (0); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	return zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  } @@ -2704,21 +2707,21 @@ int zend_return_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval **retval_ptr_ptr;  	if (EG(active_op_array)->return_reference == ZEND_RETURN_REF) { -		if (EX(opline)->op1.op_type == IS_CONST || EX(opline)->op1.op_type == IS_TMP_VAR) { +		if (opline->op1.op_type == IS_CONST || opline->op1.op_type == IS_TMP_VAR) {  			/* Not supposed to happen, but we'll allow it */  			zend_error(E_STRICT, "Only variable references should be returned by reference");  			goto return_by_value;  		} -		retval_ptr_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W); +		retval_ptr_ptr = get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W);  		if (!retval_ptr_ptr) {  			zend_error(E_ERROR, "Cannot return string offsets by reference");  		}  		if (!(*retval_ptr_ptr)->is_ref) { -			if (EX_T(EX(opline)->op1.u.var).var.ptr_ptr == &EX_T(EX(opline)->op1.u.var).var.ptr -				|| (EX(opline)->extended_value == ZEND_RETURNS_FUNCTION && !EX_T(EX(opline)->op1.u.var).var.fcall_returned_reference)) { +			if (EX_T(opline->op1.u.var).var.ptr_ptr == &EX_T(opline->op1.u.var).var.ptr +				|| (opline->extended_value == ZEND_RETURNS_FUNCTION && !EX_T(opline->op1.u.var).var.fcall_returned_reference)) {  				zend_error(E_STRICT, "Only variable references should be returned by reference");  				PZVAL_LOCK(*retval_ptr_ptr); /* undo the effect of get_zval_ptr_ptr() */  				goto return_by_value; @@ -2731,7 +2734,7 @@ int zend_return_handler(ZEND_OPCODE_HANDLER_ARGS)  		(*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);  	} else {  return_by_value: -		retval_ptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		retval_ptr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  		if (!EG(free_op1)) { /* Not a temp var */  			if (PZVAL_IS_REF(retval_ptr) && retval_ptr->refcount > 0) { @@ -2760,7 +2763,7 @@ int zend_throw_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval *value;  	zval *exception; -	value = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	value = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	if (value->type != IS_OBJECT) {  		zend_error(E_ERROR, "Can only throw objects"); @@ -2772,14 +2775,8 @@ int zend_throw_handler(ZEND_OPCODE_HANDLER_ARGS)  		zval_copy_ctor(exception);  	}  	INIT_PZVAL(exception); -	EG(exception) = exception; -	 -	if (EX(opline)->op2.u.opline_num == -1) { -		RETURN_FROM_EXECUTE_LOOP(execute_data); -	} else { -		EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; -		return 0; /* CHECK_ME */ -	} + +	zend_throw_exception_internal(exception TSRMLS_CC);  	NEXT_OPCODE();  } @@ -2788,26 +2785,30 @@ int zend_catch_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zend_class_entry *ce; -	/* Check if this is really an exception, if not, jump over code */ +	/* Check whether an exception has been thrown, if not, jump over code */  	if (EG(exception) == NULL) { -		EX(opline) = &op_array->opcodes[EX(opline)->extended_value]; +		SET_OPCODE(&op_array->opcodes[opline->extended_value]);  		return 0; /* CHECK_ME */  	}  	ce = Z_OBJCE_P(EG(exception)); -	if (ce != EX_T(EX(opline)->op1.u.var).class_entry) { +	if (ce != EX_T(opline->op1.u.var).class_entry) {  		while (ce->parent) { -			if (ce->parent == EX_T(EX(opline)->op1.u.var).class_entry) { +			if (ce->parent == EX_T(opline->op1.u.var).class_entry) {  				goto exception_should_be_taken;  			}  			ce = ce->parent;  		} -		EX(opline) = &op_array->opcodes[EX(opline)->extended_value]; +		if (opline->op1.u.EA.type) { +			zend_throw_exception_internal(NULL TSRMLS_CC); +			NEXT_OPCODE(); +		} +		SET_OPCODE(&op_array->opcodes[opline->extended_value]);  		return 0; /* CHECK_ME */  	}  exception_should_be_taken: -	zend_hash_update(EG(active_symbol_table), EX(opline)->op2.u.constant.value.str.val, -		EX(opline)->op2.u.constant.value.str.len+1, &EG(exception), sizeof(zval *), (void **) NULL); +	zend_hash_update(EG(active_symbol_table), opline->op2.u.constant.value.str.val, +		opline->op2.u.constant.value.str.len+1, &EG(exception), sizeof(zval *), (void **) NULL);  	EG(exception) = NULL;  	NEXT_OPCODE();  } @@ -2815,15 +2816,15 @@ exception_should_be_taken:  int zend_send_val_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (EX(opline)->extended_value==ZEND_DO_FCALL_BY_NAME -		&& ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->op2.u.opline_num)) { -			zend_error(E_ERROR, "Cannot pass parameter %d by reference", EX(opline)->op2.u.opline_num); +	if (opline->extended_value==ZEND_DO_FCALL_BY_NAME +		&& ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) { +			zend_error(E_ERROR, "Cannot pass parameter %d by reference", opline->op2.u.opline_num);  	}  	{  		zval *valptr;  		zval *value; -		value = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		value = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  		ALLOC_ZVAL(valptr);  		*valptr = *value; @@ -2840,7 +2841,7 @@ int zend_send_val_handler(ZEND_OPCODE_HANDLER_ARGS)  static inline int zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS)  {  	zval *varptr; -	varptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	varptr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	if (varptr == &EG(uninitialized_zval)) {  		ALLOC_ZVAL(varptr); @@ -2857,7 +2858,7 @@ static inline int zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS)  	}  	varptr->refcount++;  	zend_ptr_stack_push(&EG(argument_stack), varptr); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1));  /* for string offsets */ +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  /* for string offsets */  	NEXT_OPCODE();  } @@ -2865,16 +2866,16 @@ static inline int zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS)  int zend_send_var_no_ref_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (EX(opline)->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */ -		if (!(EX(opline)->extended_value & ZEND_ARG_SEND_BY_REF)) { +	if (opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) { /* Had function_ptr at compile_time */ +		if (!(opline->extended_value & ZEND_ARG_SEND_BY_REF)) {  			return zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  		} -	} else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->op2.u.opline_num)) { +	} else if (!ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {  		return zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  	}  	{  		zval *varptr; -		varptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		varptr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  		if (varptr != &EG(uninitialized_zval) && (PZVAL_IS_REF(varptr) || varptr->refcount == 1)) {  			varptr->is_ref = 1; @@ -2892,7 +2893,7 @@ int zend_send_ref_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zval **varptr_ptr;  	zval *varptr; -	varptr_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W); +	varptr_ptr = get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_W);  	if (!varptr_ptr) {  		zend_error(E_ERROR, "Only variables can be passed by reference"); @@ -2909,8 +2910,8 @@ int zend_send_ref_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_send_var_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if ((EX(opline)->extended_value == ZEND_DO_FCALL_BY_NAME) -		&& ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), EX(opline)->op2.u.opline_num)) { +	if ((opline->extended_value == ZEND_DO_FCALL_BY_NAME) +		&& ARG_SHOULD_BE_SENT_BY_REF(EX(fbc), opline->op2.u.opline_num)) {  		return zend_send_ref_handler(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);  	}  	return zend_send_by_var_helper(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -2920,20 +2921,20 @@ int zend_send_var_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_recv_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zval **param; -	zend_uint arg_num = EX(opline)->op1.u.constant.value.lval; +	zend_uint arg_num = opline->op1.u.constant.value.lval;  	if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) {  		zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, NULL TSRMLS_CC); -		zend_error(E_WARNING, "Missing argument %ld for %s()", EX(opline)->op1.u.constant.value.lval, get_active_function_name(TSRMLS_C)); -		if (EX(opline)->result.op_type == IS_VAR) { -			PZVAL_UNLOCK(*EX_T(EX(opline)->result.u.var).var.ptr_ptr); +		zend_error(E_WARNING, "Missing argument %ld for %s()", opline->op1.u.constant.value.lval, get_active_function_name(TSRMLS_C)); +		if (opline->result.op_type == IS_VAR) { +			PZVAL_UNLOCK(*EX_T(opline->result.u.var).var.ptr_ptr);  		}  	} else {  		zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, *param TSRMLS_CC);  		if (PZVAL_IS_REF(*param)) { -			zend_assign_to_variable_reference(&EX(opline)->result, get_zval_ptr_ptr(&EX(opline)->result, EX(Ts), BP_VAR_W), param, NULL TSRMLS_CC); +			zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->result, EX(Ts), BP_VAR_W), param, NULL TSRMLS_CC);  		} else { -			zend_assign_to_variable(&EX(opline)->result, &EX(opline)->result, NULL, *param, IS_VAR, EX(Ts) TSRMLS_CC); +			zend_assign_to_variable(&opline->result, &opline->result, NULL, *param, IS_VAR, EX(Ts) TSRMLS_CC);  		}  	} @@ -2944,15 +2945,15 @@ int zend_recv_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_recv_init_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	zval **param, *assignment_value; -	zend_uint arg_num = EX(opline)->op1.u.constant.value.lval; +	zend_uint arg_num = opline->op1.u.constant.value.lval;  	if (zend_ptr_stack_get_arg(arg_num, (void **) ¶m TSRMLS_CC)==FAILURE) { -		if (EX(opline)->op2.u.constant.type == IS_CONSTANT || EX(opline)->op2.u.constant.type==IS_CONSTANT_ARRAY) { +		if (opline->op2.u.constant.type == IS_CONSTANT || opline->op2.u.constant.type==IS_CONSTANT_ARRAY) {  			zval *default_value;  			ALLOC_ZVAL(default_value); -			*default_value = EX(opline)->op2.u.constant; -			if (EX(opline)->op2.u.constant.type==IS_CONSTANT_ARRAY) { +			*default_value = opline->op2.u.constant; +			if (opline->op2.u.constant.type==IS_CONSTANT_ARRAY) {  				zval_copy_ctor(default_value);  			}  			default_value->refcount=1; @@ -2963,17 +2964,17 @@ int zend_recv_init_handler(ZEND_OPCODE_HANDLER_ARGS)  			assignment_value = default_value;  		} else {  			param = NULL; -			assignment_value = &EX(opline)->op2.u.constant; +			assignment_value = &opline->op2.u.constant;  		}  		zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC); -		zend_assign_to_variable(&EX(opline)->result, &EX(opline)->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC); +		zend_assign_to_variable(&opline->result, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);  	} else {  		assignment_value = *param;  		zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, assignment_value TSRMLS_CC);  		if (PZVAL_IS_REF(assignment_value)) { -			zend_assign_to_variable_reference(&EX(opline)->result, get_zval_ptr_ptr(&EX(opline)->result, EX(Ts), BP_VAR_W), param, NULL TSRMLS_CC); +			zend_assign_to_variable_reference(&opline->result, get_zval_ptr_ptr(&opline->result, EX(Ts), BP_VAR_W), param, NULL TSRMLS_CC);  		} else { -			zend_assign_to_variable(&EX(opline)->result, &EX(opline)->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC); +			zend_assign_to_variable(&opline->result, &opline->result, NULL, assignment_value, IS_VAR, EX(Ts) TSRMLS_CC);  		}  	} @@ -2984,9 +2985,9 @@ int zend_recv_init_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_bool_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	/* PHP 3.0 returned "" for false and 1 for true, here we use 0 and 1 for now */ -	EX_T(EX(opline)->result.u.var).tmp_var.value.lval = zend_is_true(get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_BOOL; -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	EX_T(opline->result.u.var).tmp_var.value.lval = zend_is_true(get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R)); +	EX_T(opline->result.u.var).tmp_var.type = IS_BOOL; +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  } @@ -2994,7 +2995,7 @@ int zend_bool_handler(ZEND_OPCODE_HANDLER_ARGS)  static inline int zend_brk_cont_helper(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *nest_levels_zval = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval *nest_levels_zval = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	zval tmp;  	int array_offset, nest_levels, original_nest_levels;  	zend_brk_cont_element *jmp_to; @@ -3008,7 +3009,7 @@ static inline int zend_brk_cont_helper(ZEND_OPCODE_HANDLER_ARGS)  		nest_levels = nest_levels_zval->value.lval;  	}  	original_nest_levels = nest_levels; -	array_offset = EX(opline)->op1.u.opline_num; +	array_offset = opline->op1.u.opline_num;  	do {  		if (array_offset==-1) {  			zend_error(E_ERROR, "Cannot break/continue %d level%s", original_nest_levels, (original_nest_levels == 1) ? "" : "s"); @@ -3029,12 +3030,12 @@ static inline int zend_brk_cont_helper(ZEND_OPCODE_HANDLER_ARGS)  		array_offset = jmp_to->parent;  	} while (--nest_levels > 0); -	if (EX(opline)->opcode == ZEND_BRK) { -		EX(opline) = op_array->opcodes+jmp_to->brk; +	if (opline->opcode == ZEND_BRK) { +		SET_OPCODE(op_array->opcodes+jmp_to->brk);  	} else { -		EX(opline) = op_array->opcodes+jmp_to->cont; +		SET_OPCODE(op_array->opcodes+jmp_to->cont);  	} -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	return 0; /* CHECK_ME */  } @@ -3055,28 +3056,28 @@ int zend_case_handler(ZEND_OPCODE_HANDLER_ARGS)  {  	int switch_expr_is_overloaded=0; -	if (EX(opline)->op1.op_type==IS_VAR) { -		if (EX_T(EX(opline)->op1.u.var).var.ptr_ptr) { -			PZVAL_LOCK(EX_T(EX(opline)->op1.u.var).var.ptr); +	if (opline->op1.op_type==IS_VAR) { +		if (EX_T(opline->op1.u.var).var.ptr_ptr) { +			PZVAL_LOCK(EX_T(opline->op1.u.var).var.ptr);  		} else {  			switch_expr_is_overloaded = 1; -			EX_T(EX(opline)->op1.u.var).str_offset.str->refcount++; +			EX_T(opline->op1.u.var).str_offset.str->refcount++;  		}  	} -	is_equal_function(&EX_T(EX(opline)->result.u.var).tmp_var,  -				 get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R), -				 get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); +	is_equal_function(&EX_T(opline->result.u.var).tmp_var,  +				 get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R), +				 get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R) TSRMLS_CC); -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	if (switch_expr_is_overloaded) {  		/* We only free op1 if this is a string offset,  		 * Since if it is a TMP_VAR, it'll be reused by  		 * other CASE opcodes (whereas string offsets  		 * are allocated at each get_zval_ptr())  		 */ -		FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -		EX_T(EX(opline)->op1.u.var).var.ptr_ptr = NULL; -		AI_USE_PTR(EX_T(EX(opline)->op1.u.var).var); +		FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +		EX_T(opline->op1.u.var).var.ptr_ptr = NULL; +		AI_USE_PTR(EX_T(opline->op1.u.var).var);  	}  	NEXT_OPCODE();  } @@ -3084,28 +3085,28 @@ int zend_case_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_switch_free_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_switch_free(EX(opline), EX(Ts) TSRMLS_CC); +	zend_switch_free(opline, EX(Ts) TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_new_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (EX_T(EX(opline)->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_ABSTRACT_CLASS)) { +	if (EX_T(opline->op1.u.var).class_entry->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_ABSTRACT_CLASS)) {  		char *class_type; -		if (EX_T(EX(opline)->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) { +		if (EX_T(opline->op1.u.var).class_entry->ce_flags & ZEND_ACC_INTERFACE) {  			class_type = "interface";  		} else {  			class_type = "abstract class";  		} -		zend_error(E_ERROR, "Cannot instantiate %s %s", class_type,  EX_T(EX(opline)->op1.u.var).class_entry->name); +		zend_error(E_ERROR, "Cannot instantiate %s %s", class_type,  EX_T(opline->op1.u.var).class_entry->name);  	} -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr; -	ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -	object_init_ex(EX_T(EX(opline)->result.u.var).var.ptr, EX_T(EX(opline)->op1.u.var).class_entry); -	EX_T(EX(opline)->result.u.var).var.ptr->refcount=1; -	EX_T(EX(opline)->result.u.var).var.ptr->is_ref=1; +	EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; +	ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +	object_init_ex(EX_T(opline->result.u.var).var.ptr, EX_T(opline->op1.u.var).class_entry); +	EX_T(opline->result.u.var).var.ptr->refcount=1; +	EX_T(opline->result.u.var).var.ptr->is_ref=1;  	NEXT_OPCODE();  } @@ -3113,15 +3114,15 @@ int zend_new_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_clone_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *obj = get_obj_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R TSRMLS_CC); +	zval *obj = get_obj_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R TSRMLS_CC);  	zend_class_entry *ce;  	zend_function *clone;  	zend_object_clone_obj_t clone_call;  	if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {  		zend_error(E_WARNING, "__clone method called on non-object"); -		EX_T(EX(opline)->result.u.var).var.ptr = EG(error_zval_ptr); -		EX_T(EX(opline)->result.u.var).var.ptr->refcount++; +		EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); +		EX_T(opline->result.u.var).var.ptr->refcount++;  		NEXT_OPCODE();  	}  @@ -3130,8 +3131,8 @@ int zend_clone_handler(ZEND_OPCODE_HANDLER_ARGS)  	clone_call =  Z_OBJ_HT_P(obj)->clone_obj;  	if (!clone_call) {  		zend_error(E_ERROR, "Trying to clone an uncloneable object of class %s", ce->name); -		EX_T(EX(opline)->result.u.var).var.ptr = EG(error_zval_ptr); -		EX_T(EX(opline)->result.u.var).var.ptr->refcount++; +		EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr); +		EX_T(opline->result.u.var).var.ptr->refcount++;  	}  	if (ce && clone) { @@ -3150,21 +3151,16 @@ int zend_clone_handler(ZEND_OPCODE_HANDLER_ARGS)  		}  	} -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr; -	ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -	EX_T(EX(opline)->result.u.var).var.ptr->value.obj = clone_call(obj TSRMLS_CC); +	EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr; +	ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +	EX_T(opline->result.u.var).var.ptr->value.obj = clone_call(obj TSRMLS_CC);  	if (EG(exception)) { -		FREE_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -		if (EX(opline)->op2.u.opline_num == -1) { -			RETURN_FROM_EXECUTE_LOOP(execute_data); -		} else { -			EX(opline) = &op_array->opcodes[EX(opline)->op2.u.opline_num]; -			return 0; /* CHECK_ME */ -		} +		FREE_ZVAL(EX_T(opline->result.u.var).var.ptr); +	} else { +		EX_T(opline->result.u.var).var.ptr->type = IS_OBJECT; +		EX_T(opline->result.u.var).var.ptr->refcount=1; +		EX_T(opline->result.u.var).var.ptr->is_ref=1;  	} -	EX_T(EX(opline)->result.u.var).var.ptr->type = IS_OBJECT; -	EX_T(EX(opline)->result.u.var).var.ptr->refcount=1; -	EX_T(EX(opline)->result.u.var).var.ptr->is_ref=1;  	NEXT_OPCODE();  } @@ -3174,35 +3170,35 @@ int zend_fetch_constant_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_class_entry *ce = NULL;  	zval **value; -	if (EX(opline)->op1.op_type == IS_UNUSED) { +	if (opline->op1.op_type == IS_UNUSED) {  		if (EG(scope)) {  			ce = EG(scope); -			if (zend_hash_find(&ce->constants_table, EX(opline)->op2.u.constant.value.str.val, EX(opline)->op2.u.constant.value.str.len+1, (void **) &value) == SUCCESS) { +			if (zend_hash_find(&ce->constants_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, (void **) &value) == SUCCESS) {  				zval_update_constant(value, (void *) 1 TSRMLS_CC); -				EX_T(EX(opline)->result.u.var).tmp_var = **value; -				zval_copy_ctor(&EX_T(EX(opline)->result.u.var).tmp_var); +				EX_T(opline->result.u.var).tmp_var = **value; +				zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);  				NEXT_OPCODE();  			}  		} -		if (!zend_get_constant(EX(opline)->op2.u.constant.value.str.val, EX(opline)->op2.u.constant.value.str.len, &EX_T(EX(opline)->result.u.var).tmp_var TSRMLS_CC)) { +		if (!zend_get_constant(opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len, &EX_T(opline->result.u.var).tmp_var TSRMLS_CC)) {  			zend_error(E_NOTICE, "Use of undefined constant %s - assumed '%s'", -						EX(opline)->op2.u.constant.value.str.val, -						EX(opline)->op2.u.constant.value.str.val); -			EX_T(EX(opline)->result.u.var).tmp_var = EX(opline)->op2.u.constant; -			zval_copy_ctor(&EX_T(EX(opline)->result.u.var).tmp_var); +						opline->op2.u.constant.value.str.val, +						opline->op2.u.constant.value.str.val); +			EX_T(opline->result.u.var).tmp_var = opline->op2.u.constant; +			zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);  		}  		NEXT_OPCODE();  	} -	ce = EX_T(EX(opline)->op1.u.var).class_entry; +	ce = EX_T(opline->op1.u.var).class_entry; -	if (zend_hash_find(&ce->constants_table, EX(opline)->op2.u.constant.value.str.val, EX(opline)->op2.u.constant.value.str.len+1, (void **) &value) == SUCCESS) { +	if (zend_hash_find(&ce->constants_table, opline->op2.u.constant.value.str.val, opline->op2.u.constant.value.str.len+1, (void **) &value) == SUCCESS) {  		zval_update_constant(value, (void *) 1 TSRMLS_CC); -		EX_T(EX(opline)->result.u.var).tmp_var = **value; -		zval_copy_ctor(&EX_T(EX(opline)->result.u.var).tmp_var); +		EX_T(opline->result.u.var).tmp_var = **value; +		zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);  	} else { -		zend_error(E_ERROR, "Undefined class constant '%s'", EX(opline)->op2.u.constant.value.str.val); +		zend_error(E_ERROR, "Undefined class constant '%s'", opline->op2.u.constant.value.str.val);  	}  	NEXT_OPCODE(); @@ -3211,24 +3207,24 @@ int zend_fetch_constant_handler(ZEND_OPCODE_HANDLER_ARGS)  static inline int zend_init_add_array_helper(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *array_ptr = &EX_T(EX(opline)->result.u.var).tmp_var; +	zval *array_ptr = &EX_T(opline->result.u.var).tmp_var;  	zval *expr_ptr, **expr_ptr_ptr = NULL; -	zval *offset=get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval *offset=get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R); -	if (EX(opline)->extended_value) { -		expr_ptr_ptr=get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_R); +	if (opline->extended_value) { +		expr_ptr_ptr=get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_R);  		expr_ptr = *expr_ptr_ptr;  	} else { -		expr_ptr=get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		expr_ptr=get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	} -	if (EX(opline)->opcode == ZEND_INIT_ARRAY) { +	if (opline->opcode == ZEND_INIT_ARRAY) {  		array_init(array_ptr);  		if (!expr_ptr) {  			NEXT_OPCODE();  		}  	} -	if (!EX(opline)->extended_value && EG(free_op1)) { /* temporary variable */ +	if (!opline->extended_value && EG(free_op1)) { /* temporary variable */  		zval *new_expr;  		ALLOC_ZVAL(new_expr); @@ -3236,7 +3232,7 @@ static inline int zend_init_add_array_helper(ZEND_OPCODE_HANDLER_ARGS)  		expr_ptr = new_expr;  		INIT_PZVAL(expr_ptr);  	} else { -		if (EX(opline)->extended_value) { +		if (opline->extended_value) {  			SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr_ptr);  			expr_ptr = *expr_ptr_ptr;  			expr_ptr->refcount++; @@ -3272,7 +3268,7 @@ static inline int zend_init_add_array_helper(ZEND_OPCODE_HANDLER_ARGS)  				/* do nothing */  				break;  		} -		FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +		FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	} else {  		zend_hash_next_index_insert(array_ptr->value.ht, &expr_ptr, sizeof(zval *), NULL);  	} @@ -3294,14 +3290,14 @@ int zend_add_array_element_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_cast_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *expr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); -	zval *result = &EX_T(EX(opline)->result.u.var).tmp_var; +	zval *expr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *result = &EX_T(opline->result.u.var).tmp_var;  	*result = *expr;  	if (!EG(free_op1)) {  		zendi_zval_copy_ctor(*result);  	}					 -	switch (EX(opline)->extended_value) { +	switch (opline->extended_value) {  		case IS_NULL:  			convert_to_null(result);  			break; @@ -3341,7 +3337,7 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_op_array *new_op_array=NULL;  	zval **original_return_value = EG(return_value_ptr_ptr);  	int return_value_used; -	zval *inc_filename = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *inc_filename = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	zval tmp_inc_filename;  	zend_bool failure_retval=0; @@ -3352,9 +3348,9 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  		inc_filename = &tmp_inc_filename;  	} -	return_value_used = RETURN_VALUE_USED(EX(opline)); +	return_value_used = RETURN_VALUE_USED(opline); -	switch (EX(opline)->op2.u.constant.value.lval) { +	switch (opline->op2.u.constant.value.lval) {  		case ZEND_INCLUDE_ONCE:  		case ZEND_REQUIRE_ONCE: {  				int dummy = 1; @@ -3367,7 +3363,7 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  					}	  					if (zend_hash_add(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1, (void *)&dummy, sizeof(int), NULL)==SUCCESS) { -						new_op_array = zend_compile_file(&file_handle, (EX(opline)->op2.u.constant.value.lval==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC); +						new_op_array = zend_compile_file(&file_handle, (opline->op2.u.constant.value.lval==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);  						zend_destroy_file_handle(&file_handle TSRMLS_CC);  						if (!new_op_array) {  							zend_error(E_ERROR, "Parse error inside included file."); @@ -3377,7 +3373,7 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  						failure_retval=1;  					}  				} else { -					if (EX(opline)->op2.u.constant.value.lval==ZEND_INCLUDE_ONCE) { +					if (opline->op2.u.constant.value.lval==ZEND_INCLUDE_ONCE) {  						zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, inc_filename->value.str.val);  					} else {  						zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, inc_filename->value.str.val); @@ -3388,7 +3384,7 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  			break;  		case ZEND_INCLUDE:  		case ZEND_REQUIRE: -			new_op_array = compile_filename(EX(opline)->op2.u.constant.value.lval, inc_filename TSRMLS_CC); +			new_op_array = compile_filename(opline->op2.u.constant.value.lval, inc_filename TSRMLS_CC);  			if (!new_op_array) {  				zend_error(E_ERROR, "Parse error inside included file.");  			} @@ -3405,15 +3401,15 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  	if (inc_filename==&tmp_inc_filename) {  		zval_dtor(&tmp_inc_filename);  	} -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr; +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1)); +	EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;  	if (new_op_array) {  		zval *saved_object;  		zend_function *saved_function; -		EG(return_value_ptr_ptr) = EX_T(EX(opline)->result.u.var).var.ptr_ptr; +		EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;  		EG(active_op_array) = new_op_array; -		EX_T(EX(opline)->result.u.var).var.ptr = NULL; +		EX_T(opline->result.u.var).var.ptr = NULL;  		saved_object = EX(object);  		saved_function = EX(function_state).function; @@ -3427,15 +3423,15 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  		EX(object) = saved_object;  		if (!return_value_used) { -			if (EX_T(EX(opline)->result.u.var).var.ptr) { -				zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); +			if (EX_T(opline->result.u.var).var.ptr) { +				zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);  			}   		} else { /* return value is used */ -			if (!EX_T(EX(opline)->result.u.var).var.ptr) { /* there was no return statement */ -				ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -				INIT_PZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -				EX_T(EX(opline)->result.u.var).var.ptr->value.lval = 1; -				EX_T(EX(opline)->result.u.var).var.ptr->type = IS_BOOL; +			if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */ +				ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +				INIT_PZVAL(EX_T(opline->result.u.var).var.ptr); +				EX_T(opline->result.u.var).var.ptr->value.lval = 1; +				EX_T(opline->result.u.var).var.ptr->type = IS_BOOL;  			}  		} @@ -3446,10 +3442,10 @@ int zend_include_or_eval_handler(ZEND_OPCODE_HANDLER_ARGS)  		efree(new_op_array);  	} else {  		if (return_value_used) { -			ALLOC_ZVAL(EX_T(EX(opline)->result.u.var).var.ptr); -			INIT_ZVAL(*EX_T(EX(opline)->result.u.var).var.ptr); -			EX_T(EX(opline)->result.u.var).var.ptr->value.lval = failure_retval; -			EX_T(EX(opline)->result.u.var).var.ptr->type = IS_BOOL; +			ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr); +			INIT_ZVAL(*EX_T(opline->result.u.var).var.ptr); +			EX_T(opline->result.u.var).var.ptr->value.lval = failure_retval; +			EX_T(opline->result.u.var).var.ptr->type = IS_BOOL;  		}  	}  	EG(return_value_ptr_ptr) = original_return_value; @@ -3462,7 +3458,7 @@ int zend_unset_var_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval tmp, *varname;  	HashTable *target_symbol_table; -	varname = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	varname = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	if (varname->type != IS_STRING) {  		tmp = *varname; @@ -3471,17 +3467,17 @@ int zend_unset_var_handler(ZEND_OPCODE_HANDLER_ARGS)  		varname = &tmp;  	} -	if (EX(opline)->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { -		zend_std_unset_static_property(EX_T(EX(opline)->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC); +	if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { +		zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);  	} else { -		target_symbol_table = zend_get_target_symbol_table(EX(opline), EX(Ts), BP_VAR_IS, varname TSRMLS_CC); +		target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);  		zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1);  	}  	if (varname == &tmp) {  		zval_dtor(&tmp);  	} -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  } @@ -3489,14 +3485,14 @@ int zend_unset_var_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_unset_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval **container = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_R TSRMLS_CC); -	zval *offset = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval **container = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); +	zval *offset = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	long index;  	if (container) {  		HashTable *ht; -		if (EX(opline)->extended_value == ZEND_UNSET_DIM) { +		if (opline->extended_value == ZEND_UNSET_DIM) {  			switch (Z_TYPE_PP(container)) {  				case IS_ARRAY:  					ht = Z_ARRVAL_PP(container); @@ -3549,7 +3545,7 @@ int zend_unset_dim_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  	} else {  		/* overloaded element */  	} -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  } @@ -3562,8 +3558,8 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)  	zend_object_iterator *iter = NULL;  	zend_class_entry *ce = NULL; -	if (EX(opline)->extended_value) { -		array_ptr_ptr = get_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_R); +	if (opline->extended_value) { +		array_ptr_ptr = get_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_R);  		if (array_ptr_ptr == NULL) {  			MAKE_STD_ZVAL(array_ptr);  		} else if (Z_TYPE_PP(array_ptr_ptr) == IS_OBJECT) { @@ -3579,7 +3575,7 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)  			array_ptr->refcount++;  		}  	} else { -		array_ptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		array_ptr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  		if (EG(free_op1)) { /* IS_TMP_VAR */  			zval *tmp; @@ -3605,8 +3601,8 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)  	}  	PZVAL_LOCK(array_ptr); -	EX_T(EX(opline)->result.u.var).var.ptr = array_ptr; -	EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;	 +	EX_T(opline->result.u.var).var.ptr = array_ptr; +	EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;	  	if (iter) {  		iter->index = 0; @@ -3619,8 +3615,8 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)  	} else {  		zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -		EX(opline)++; -		EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; +		opline++; +		SET_OPCODE(op_array->opcodes+opline->op2.u.opline_num);  		return 0;  	} @@ -3630,8 +3626,8 @@ int zend_fe_reset_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *array = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); -	zval *result = &EX_T(EX(opline)->result.u.var).tmp_var; +	zval *array = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *result = &EX_T(opline->result.u.var).tmp_var;  	zval **value, *key;  	char *str_key;  	uint str_key_len; @@ -3646,7 +3642,7 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  		default:  		case ZEND_ITER_INVALID:  			zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -			EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; +			SET_OPCODE(op_array->opcodes+opline->op2.u.opline_num);  			return 0; /* CHECK_ME */  		case ZEND_ITER_PLAIN_OBJECT: { @@ -3657,7 +3653,7 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  			do {  				if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {  					/* reached end of iteration */ -					EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; +					SET_OPCODE(op_array->opcodes+opline->op2.u.opline_num);  					return 0; /* CHECK_ME */  				}  				key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); @@ -3675,7 +3671,7 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  			fe_ht = HASH_OF(array);  			if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {  				/* reached end of iteration */ -				EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; +				SET_OPCODE(op_array->opcodes+opline->op2.u.opline_num);  				return 0; /* CHECK_ME */  			}  			key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL); @@ -3691,7 +3687,7 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  			}  			if (!iter || iter->funcs->has_more(iter TSRMLS_CC) == FAILURE) {  				/* reached end of iteration */ -				EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num; +				SET_OPCODE(op_array->opcodes+opline->op2.u.opline_num);  				return 0; /* CHECK_ME */  			}	  			iter->funcs->get_current_data(iter, &value TSRMLS_CC); @@ -3707,7 +3703,7 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)  	array_init(result); -	if (EX(opline)->extended_value) { +	if (opline->extended_value) {  		SEPARATE_ZVAL_IF_NOT_REF(value);  		(*value)->is_ref = 1;  	} @@ -3740,19 +3736,19 @@ int zend_jmp_no_ctor_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval *object_zval;  	zend_function *constructor; -	if (EX(opline)->op1.op_type == IS_VAR) { -		PZVAL_LOCK(*EX_T(EX(opline)->op1.u.var).var.ptr_ptr); +	if (opline->op1.op_type == IS_VAR) { +		PZVAL_LOCK(*EX_T(opline->op1.u.var).var.ptr_ptr);  	} -	object_zval = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	object_zval = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	constructor = Z_OBJ_HT_P(object_zval)->get_constructor(object_zval TSRMLS_CC);  	EX(fbc_constructor) = NULL;  	if (constructor == NULL) { -		if(EX(opline)->op1.u.EA.type & EXT_TYPE_UNUSED) { -			zval_ptr_dtor(EX_T(EX(opline)->op1.u.var).var.ptr_ptr); +		if(opline->op1.u.EA.type & EXT_TYPE_UNUSED) { +			zval_ptr_dtor(EX_T(opline->op1.u.var).var.ptr_ptr);  		} -		EX(opline) = op_array->opcodes + EX(opline)->op2.u.opline_num; +		SET_OPCODE(op_array->opcodes + opline->op2.u.opline_num);  		return 0; /* CHECK_ME */  	} else {  		EX(fbc_constructor) = constructor; @@ -3764,7 +3760,7 @@ int zend_jmp_no_ctor_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_isset_isempty_var_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval tmp, *varname = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval tmp, *varname = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	zval **value;  	zend_bool isset = 1;  	HashTable *target_symbol_table; @@ -3776,33 +3772,33 @@ int zend_isset_isempty_var_handler(ZEND_OPCODE_HANDLER_ARGS)  		varname = &tmp;  	} -	if (EX(opline)->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { -		value = zend_std_get_static_property(EX_T(EX(opline)->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC); +	if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) { +		value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);  		if (!value) {  			isset = 0;  		}  	} else { -		target_symbol_table = zend_get_target_symbol_table(EX(opline), EX(Ts), BP_VAR_IS, varname TSRMLS_CC); +		target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);  		if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {  			isset = 0;  		}  	} -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_BOOL; +	EX_T(opline->result.u.var).tmp_var.type = IS_BOOL; -	switch (EX(opline)->extended_value) { +	switch (opline->extended_value) {  		case ZEND_ISSET:  			if (isset && Z_TYPE_PP(value) == IS_NULL) { -				EX_T(EX(opline)->result.u.var).tmp_var.value.lval = 0; +				EX_T(opline->result.u.var).tmp_var.value.lval = 0;  			} else { -				EX_T(EX(opline)->result.u.var).tmp_var.value.lval = isset; +				EX_T(opline->result.u.var).tmp_var.value.lval = isset;  			}  			break;  		case ZEND_ISEMPTY:  			if (!isset || !zend_is_true(*value)) { -				EX_T(EX(opline)->result.u.var).tmp_var.value.lval = 1; +				EX_T(opline->result.u.var).tmp_var.value.lval = 1;  			} else { -				EX_T(EX(opline)->result.u.var).tmp_var.value.lval = 0; +				EX_T(opline->result.u.var).tmp_var.value.lval = 0;  			}  			break;  	} @@ -3810,7 +3806,7 @@ int zend_isset_isempty_var_handler(ZEND_OPCODE_HANDLER_ARGS)  	if (varname == &tmp) {  		zval_dtor(&tmp);  	} -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  } @@ -3818,8 +3814,8 @@ int zend_isset_isempty_var_handler(ZEND_OPCODE_HANDLER_ARGS)  static int zend_isset_isempty_dim_prop_obj_handler(int prop_dim, ZEND_OPCODE_HANDLER_ARGS)  { -	zval **container = get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_R TSRMLS_CC); -	zval *offset = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R); +	zval **container = get_obj_zval_ptr_ptr(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC); +	zval *offset = get_zval_ptr(&opline->op2, EX(Ts), &EG(free_op2), BP_VAR_R);  	zval **value = NULL;  	int result = 0;  	long index; @@ -3861,7 +3857,7 @@ static int zend_isset_isempty_dim_prop_obj_handler(int prop_dim, ZEND_OPCODE_HAN  					break;  			} -			switch (EX(opline)->extended_value) { +			switch (opline->extended_value) {  				case ZEND_ISSET:  					if (isset && Z_TYPE_PP(value) == IS_NULL) {  						result = 0; @@ -3879,12 +3875,12 @@ static int zend_isset_isempty_dim_prop_obj_handler(int prop_dim, ZEND_OPCODE_HAN  			}  		} else if ((*container)->type == IS_OBJECT) {  			if (prop_dim) { -				result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (EX(opline)->extended_value == ZEND_ISEMPTY) TSRMLS_CC); +				result = Z_OBJ_HT_P(*container)->has_property(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);  			} else { -				result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (EX(opline)->extended_value == ZEND_ISEMPTY) TSRMLS_CC); +				result = Z_OBJ_HT_P(*container)->has_dimension(*container, offset, (opline->extended_value == ZEND_ISEMPTY) TSRMLS_CC);  			}  		} else if ((*container)->type == IS_STRING) { /* string offsets */ -			switch (EX(opline)->extended_value) { +			switch (opline->extended_value) {  				case ZEND_ISSET:  					if (offset->value.lval <= Z_STRLEN_PP(container)) {  						result = 1; @@ -3899,18 +3895,18 @@ static int zend_isset_isempty_dim_prop_obj_handler(int prop_dim, ZEND_OPCODE_HAN  		}  	} -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_BOOL; +	EX_T(opline->result.u.var).tmp_var.type = IS_BOOL; -	switch (EX(opline)->extended_value) { +	switch (opline->extended_value) {  		case ZEND_ISSET: -			EX_T(EX(opline)->result.u.var).tmp_var.value.lval = result; +			EX_T(opline->result.u.var).tmp_var.value.lval = result;  			break;  		case ZEND_ISEMPTY: -			EX_T(EX(opline)->result.u.var).tmp_var.value.lval = !result; +			EX_T(opline->result.u.var).tmp_var.value.lval = !result;  			break;  	} -	FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); +	FREE_OP(EX(Ts), &opline->op2, EG(free_op2));  	NEXT_OPCODE();  } @@ -3930,16 +3926,16 @@ int zend_isset_isempty_prop_obj_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_exit_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (EX(opline)->op1.op_type != IS_UNUSED) { +	if (opline->op1.op_type != IS_UNUSED) {  		zval *ptr; -		ptr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +		ptr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  		if (Z_TYPE_P(ptr) == IS_LONG) {  			EG(exit_status) = Z_LVAL_P(ptr);  		} else {  			zend_print_variable(ptr);  		} -		FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +		FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	}  	zend_bailout();  	NEXT_OPCODE(); @@ -3948,8 +3944,8 @@ int zend_exit_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_begin_silence_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	EX_T(EX(opline)->result.u.var).tmp_var.value.lval = EG(error_reporting); -	EX_T(EX(opline)->result.u.var).tmp_var.type = IS_LONG;  /* shouldn't be necessary */ +	EX_T(opline->result.u.var).tmp_var.value.lval = EG(error_reporting); +	EX_T(opline->result.u.var).tmp_var.type = IS_LONG;  /* shouldn't be necessary */  	zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), "0", 1, ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);  	NEXT_OPCODE();  } @@ -3967,7 +3963,7 @@ int zend_end_silence_handler(ZEND_OPCODE_HANDLER_ARGS)  	zval restored_error_reporting;  	restored_error_reporting.type = IS_LONG; -	restored_error_reporting.value.lval = EX_T(EX(opline)->op1.u.var).tmp_var.value.lval; +	restored_error_reporting.value.lval = EX_T(opline->op1.u.var).tmp_var.value.lval;  	convert_to_string(&restored_error_reporting);  	zend_alter_ini_entry("error_reporting", sizeof("error_reporting"), Z_STRVAL(restored_error_reporting), Z_STRLEN(restored_error_reporting), ZEND_INI_USER, ZEND_INI_STAGE_RUNTIME);  	zendi_zval_dtor(restored_error_reporting); @@ -3977,11 +3973,11 @@ int zend_end_silence_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_qm_assign_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *value = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *value = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R); -	EX_T(EX(opline)->result.u.var).tmp_var = *value; +	EX_T(opline->result.u.var).tmp_var = *value;  	if (!EG(free_op1)) { -		zval_copy_ctor(&EX_T(EX(opline)->result.u.var).tmp_var); +		zval_copy_ctor(&EX_T(opline->result.u.var).tmp_var);  	}  	NEXT_OPCODE();  } @@ -4016,31 +4012,31 @@ int zend_ext_fcall_end_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_declare_class_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	EX_T(EX(opline)->result.u.var).class_entry = do_bind_class(EX(opline), EG(function_table), EG(class_table) TSRMLS_CC); +	EX_T(opline->result.u.var).class_entry = do_bind_class(opline, EG(function_table), EG(class_table) TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_declare_inherited_class_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	EX_T(EX(opline)->result.u.var).class_entry = do_bind_inherited_class(EX(opline), EG(function_table), EG(class_table), EX_T(EX(opline)->extended_value).class_entry TSRMLS_CC); +	EX_T(opline->result.u.var).class_entry = do_bind_inherited_class(opline, EG(function_table), EG(class_table), EX_T(opline->extended_value).class_entry TSRMLS_CC);  	NEXT_OPCODE();  }  int zend_declare_function_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	do_bind_function(EX(opline), EG(function_table), EG(class_table), 0); +	do_bind_function(opline, EG(function_table), EG(class_table), 0);  	NEXT_OPCODE();  }  int zend_ticks_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	if (++EG(ticks_count)>=EX(opline)->op1.u.constant.value.lval) { +	if (++EG(ticks_count)>=opline->op1.u.constant.value.lval) {  		EG(ticks_count)=0;  		if (zend_ticks_function) { -			zend_ticks_function(EX(opline)->op1.u.constant.value.lval); +			zend_ticks_function(opline->op1.u.constant.value.lval);  		}  	}  	NEXT_OPCODE(); @@ -4049,16 +4045,16 @@ int zend_ticks_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_instanceof_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zval *expr = get_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1), BP_VAR_R); +	zval *expr = get_zval_ptr(&opline->op1, EX(Ts), &EG(free_op1), BP_VAR_R);  	zend_bool result;  	if (Z_TYPE_P(expr) == IS_OBJECT) { -		result = instanceof_function(Z_OBJCE_P(expr), EX_T(EX(opline)->op2.u.var).class_entry TSRMLS_CC); +		result = instanceof_function(Z_OBJCE_P(expr), EX_T(opline->op2.u.var).class_entry TSRMLS_CC);  	} else {  		result = 0;  	} -	ZVAL_BOOL(&EX_T(EX(opline)->result.u.var).tmp_var, result); -	FREE_OP(EX(Ts), &EX(opline)->op1, EG(free_op1)); +	ZVAL_BOOL(&EX_T(opline->result.u.var).tmp_var, result); +	FREE_OP(EX(Ts), &opline->op1, EG(free_op1));  	NEXT_OPCODE();  } @@ -4076,14 +4072,14 @@ int zend_nop_handler(ZEND_OPCODE_HANDLER_ARGS)  int zend_add_interface_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_class_entry *ce = EX_T(EX(opline)->op1.u.var).class_entry; -	zend_class_entry *iface = EX_T(EX(opline)->op2.u.var).class_entry; +	zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry; +	zend_class_entry *iface = EX_T(opline->op2.u.var).class_entry;  	if (!(iface->ce_flags & ZEND_ACC_INTERFACE)) {  		zend_error(E_ERROR, "%s cannot implement %s - it is not an interface", ce->name, iface->name);  	} -	ce->interfaces[EX(opline)->extended_value] = iface; +	ce->interfaces[opline->extended_value] = iface;  	zend_do_implement_interface(ce, iface TSRMLS_CC); @@ -4091,6 +4087,30 @@ int zend_add_interface_handler(ZEND_OPCODE_HANDLER_ARGS)  } +int zend_handle_exception_handler(ZEND_OPCODE_HANDLER_ARGS) +{ +	zend_uint op_num = EG(opline_before_exception)-EG(active_op_array)->opcodes; +	int i; +	int encapsulating_block=-1; +	 +	for (i=0; i<EG(active_op_array)->last_try_catch; i++) { +		if (op_num >= EG(active_op_array)->try_catch_array[i].catch_op) { +			break; +		} +		if (op_num >= EG(active_op_array)->try_catch_array[i].try_op) { +			encapsulating_block = i; +		} +	} + +	if (encapsulating_block == -1) { +		RETURN_FROM_EXECUTE_LOOP(execute_data); +	} else { +		SET_OPCODE(&op_array->opcodes[EG(active_op_array)->try_catch_array[encapsulating_block].catch_op]); +		return 0; +	} +} + +  #define MAX_ABSTRACT_INFO_CNT 3  #define MAX_ABSTRACT_INFO_FMT "%s%s%s%s" @@ -4121,7 +4141,7 @@ int zend_verify_abstract_class_function(zend_function *fn, zend_abstract_info *a  int zend_verify_abstract_class_handler(ZEND_OPCODE_HANDLER_ARGS)  { -	zend_class_entry *ce = EX_T(EX(opline)->op1.u.var).class_entry; +	zend_class_entry *ce = EX_T(opline->op1.u.var).class_entry;  	zend_abstract_info ai;  	if ((ce->ce_flags & ZEND_ACC_ABSTRACT) && !(ce->ce_flags & ZEND_ACC_ABSTRACT_CLASS)) { @@ -4305,6 +4325,8 @@ void zend_init_opcodes_handlers()  	zend_opcode_handlers[ZEND_VERIFY_ABSTRACT_CLASS] = zend_verify_abstract_class_handler;  	zend_opcode_handlers[ZEND_ASSIGN_DIM] = zend_assign_dim_handler; + +	zend_opcode_handlers[ZEND_HANDLE_EXCEPTION] = zend_handle_exception_handler;  }  /* diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1c01453f26..1c3af83f6a 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -143,6 +143,9 @@ ZEND_API void zend_set_timeout(long seconds);  ZEND_API void zend_unset_timeout(TSRMLS_D);  ZEND_API void zend_timeout(int dummy);  ZEND_API zend_class_entry *zend_fetch_class(char *class_name, uint class_name_len, int fetch_type TSRMLS_DC); +void zend_throw_exception_internal(zval *exception TSRMLS_DC); +ZEND_API void zend_clear_exception(TSRMLS_D); +  #ifdef ZEND_WIN32  void zend_init_timeout_thread(); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 6cf4a2ebcb..086bde4b27 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -783,6 +783,10 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS  	EG(scope) = current_scope;  	EG(This) = current_this;  	EG(current_execute_data) = EX(prev_execute_data); + +	if (EG(exception)) { +		zend_throw_exception_internal(NULL TSRMLS_CC); +	}  	return SUCCESS;  } @@ -1188,6 +1192,38 @@ check_fetch_type:  	return *pce;  } +void zend_throw_exception_internal(zval *exception TSRMLS_DC) +{ +	if (exception != NULL) { +		if (EG(exception)) { +			/* FIXME:  bail out? */ +			return; +		} +		EG(exception) = exception; +	} +	if ((EG(current_execute_data)->opline+1)->opcode == ZEND_HANDLE_EXCEPTION) { +		/* no need to rethrow the exception */ +		return; +	} +	EG(opline_before_exception) = EG(current_execute_data)->opline; +	EG(current_execute_data)->opline = &EG(active_op_array)->opcodes[EG(active_op_array)->last-1-1]; +} + + +ZEND_API void zend_clear_exception(TSRMLS_D) +{ +	if (!EG(exception)) { +		return; +	} +	zval_ptr_dtor(&EG(exception)); +	EG(exception) = NULL; +	EG(current_execute_data)->opline = EG(opline_before_exception); +#if ZEND_DEBUG +	EG(opline_before_exception) = NULL; +#endif +} + +  /*   * Local variables:   * tab-width: 4 diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 8408cb8916..34f74a567c 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -115,7 +115,6 @@ struct _zend_compiler_globals {  	zend_llist open_files; -	zend_llist *throw_list;  	long catch_begin;  	struct _zend_ini_parser_param *ini_parser_param; @@ -229,9 +228,11 @@ struct _zend_executor_globals {  	HashTable *ini_directives;  	zend_objects_store objects_store;  	zval *exception; +	zend_op *opline_before_exception;  	struct _zend_execute_data *current_execute_data; +  	zend_property_info std_property_info;  	/* locale stuff */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index 1987d00fc2..8540ded223 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -212,20 +212,23 @@ unticked_statement:  	|	T_DECLARE { $1.u.opline_num = get_next_op_number(CG(active_op_array)); zend_do_declare_begin(TSRMLS_C); } '(' declare_list ')' declare_statement { zend_do_declare_end(&$1 TSRMLS_CC); }  	|	';'		/* empty statement */  	|	T_TRY { zend_do_try(&$1 TSRMLS_CC); } '{' inner_statement_list '}' -		T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' { zend_do_begin_catch(&$1, &$8, &$9, 1 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); } -		additional_catches +		T_CATCH '(' { zend_initialize_try_catch_element(&$1 TSRMLS_CC); } +		fully_qualified_class_name { zend_do_first_catch(&$7 TSRMLS_CC); } +		T_VARIABLE ')' { zend_do_begin_catch(&$1, &$9, &$11, 1 TSRMLS_CC); } +		'{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); } +		additional_catches { zend_do_mark_last_catch(&$7, &$18 TSRMLS_CC); }  	|	T_THROW expr ';' { zend_do_throw(&$2 TSRMLS_CC); }  ;  additional_catches: -		non_empty_additional_catches -	|	/* empty */ +		non_empty_additional_catches { $$ = $1; } +	|	/* empty */ { $$.u.opline_num = -1; }  ;  non_empty_additional_catches: -		non_empty_additional_catches T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' { zend_do_begin_catch(&$2, &$4, &$5, 0 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$2 TSRMLS_CC); } -	|	T_CATCH '(' fully_qualified_class_name T_VARIABLE ')' { zend_do_begin_catch(&$1, &$3, &$4, 0 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); } +		non_empty_additional_catches T_CATCH '(' fully_qualified_class_name { $$.u.opline_num = get_next_op_number(CG(active_op_array)); } T_VARIABLE ')' { zend_do_begin_catch(&$2, &$4, &$6, 0 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$2 TSRMLS_CC); } +	|	T_CATCH '(' fully_qualified_class_name { $$.u.opline_num = get_next_op_number(CG(active_op_array)); } T_VARIABLE ')' { zend_do_begin_catch(&$1, &$3, &$5, 0 TSRMLS_CC); } '{' inner_statement_list '}' { zend_do_end_catch(&$1 TSRMLS_CC); }  ; diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index 13efdaffab..eff969e499 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -365,6 +365,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR  		CG(active_op_array) = op_array;  		compiler_result = zendparse(TSRMLS_C);  		zend_do_return(&retval_znode, 0 TSRMLS_CC); +		zend_do_handle_exception(TSRMLS_C);  		CG(in_compilation) = original_in_compilation;  		if (compiler_result==1) { /* parser error */  			CG(unclean_shutdown) = 1; @@ -529,6 +530,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)  			retval = NULL;  		} else {  			zend_do_return(NULL, 0 TSRMLS_CC); +			zend_do_handle_exception(TSRMLS_C);  			CG(active_op_array) = original_active_op_array;  			pass_two(op_array TSRMLS_CC);  			retval = op_array; diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 122711604f..05402af5ce 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -83,10 +83,12 @@ void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_siz  	op_array->scope = NULL;  	op_array->brk_cont_array = NULL; +	op_array->try_catch_array = NULL;  	op_array->last_brk_cont = 0;  	op_array->current_brk_cont = -1;  	op_array->static_variables = NULL; +	op_array->last_try_catch = 0;  	op_array->return_reference = 0;  	op_array->done_pass_two = 0; @@ -229,6 +231,9 @@ ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC)  	if (op_array->brk_cont_array) {  		efree(op_array->brk_cont_array);  	} +	if (op_array->try_catch_array) { +		efree(op_array->try_catch_array); +	}  	if (op_array->done_pass_two) {  		zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array TSRMLS_CC);  	} | 
