Re: zend_op_array question
| From: | Zeev Suraski | Date: | Sun, 19 May 2002 15:43:44 +0000 |
| Subject: | Re: zend_op_array question | ||
| References: | 1 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-84175@lists.php.net to get a copy of this message | ||
EX(function_state).function is supposed to be a pointer to the op_array that you passed to execute().
Any chance the op_array is somehow deleted by mistake? Did you try looking at EX(function_state) and EX(function_state).function to understand why it's dying?
At 03:02 PM 5/19/2002, Wez Furlong wrote:
I'm in the process of adding IActiveScriptError support to my active script sapi. The way the sapi works is by compiling "scriptlets" into zend_op_arrays and then, at a later time, uses zend_execute to execute them. This works perfectly when the script has no errors :-) If I deliberately add a scriplet that tries to call an undefined function, the code is compiled correctly, but when it is executed, the engine triggers a "call to undefined function error" (that's fine), but then I end up with a segfault: zend_execute.c: do_fcall_common: {zval **original_return_value; int return_value_used = RETURN_VALUE_USED(EX(opline));zend_ptr_stack_n_push(&EG(argument_stack), 2, (void *) EX(opline)->extended_value, NULL);EX(Ts)[EX(opline)->result.u.var].var.ptr_ptr = &EX(Ts)[EX(opline)->result.u.var].var.ptr;// Segfault on this next line if (EX(function_state).function->type==ZEND_INTERNAL_FUNCTION) {I suspect this probably has something to do with the way that the execution environment is setup. The code I'm using is this: zval *retval_ptr = NULL;zend_op_array *active_op_array = EG(active_op_array); zend_function_state *function_state_ptr = EG(function_state_ptr); zval **return_value_ptr_ptr =EG(return_value_ptr_ptr);zend_op **opline_ptr = EG(opline_ptr);EG(return_value_ptr_ptr) = &retval_ptr; EG(active_op_array) = frag->opcodes; EG(no_extensions) = 1;zend_execute(frag->opcodes TSRMLS_CC);EG(no_extensions) = 0; EG(opline_ptr) = opline_ptr; EG(active_op_array) = active_op_array; EG(function_state_ptr) = function_state_ptr; EG(return_value_ptr_ptr) = return_value_ptr_ptr;if (retval_ptr) {zval_ptr_dtor(&retval_ptr);} That works fine if there are no errors or calls to undefined functions; it's just when there are errors that I run into problems. Could this error also be attributed to the way that the op_array was compiled? I'm using compile_string to do that part. Is there anything in particular that I should do to make this work? The sapi framework is initialized in a similar way to the ISAPI sapi, in case that helps. --Wez.