Can you send a unified diff of what call_user_function() would look like
with your changes?
Andi
At 06:04 AM 2/25/2002 -0800, brad lafountain wrote:
>Ok,
> I know ive already posted this but no responded. So I'll do it again.
>
>Currently call_user_function() doesn't call overloaded class methods.
>I hacked together a function to get around this. Does anyone want to look
>at it
>and see if it's gunna mess anything up as far as zend execution. if not put it
>in as part as the normal call_user_function.
>
>int my_call_user_function(HashTable *function_table, zval **object_pp, zval
>*function_name, zval *retval_ptr, int param_count, zval *params[] TSRMLS_DC)
>{
> if(call_user_function(function_table, object_pp, function_name,
> retval_ptr,
>param_count, params TSRMLS_CC) == FAILURE)
> {
> if(Z_OBJCE_PP(object_pp)->handle_function_call != NULL)
> {
> zend_overloaded_element overloaded_element;
> zend_property_reference property_reference;
> zend_function_state function_state;
> zend_function_state *original_function_state_ptr;
> int i;
>
> overloaded_element.element = *function_name;
> overloaded_element.type = OE_IS_METHOD;
>
> function_state.function = (zend_function *)
> emalloc(sizeof(zend_function));
> function_state.function->type =
> ZEND_OVERLOADED_FUNCTION;
> function_state.function->common.arg_types = NULL;
>
>function_state.function->overloaded_function.function_name =
>Z_STRVAL_P(function_name);
>
> property_reference.object = *object_pp;
> property_reference.type = BP_VAR_NA;
> property_reference.elements_list = (zend_llist
>*)emalloc(sizeof(zend_llist));
> zend_llist_init(property_reference.elements_list,
>sizeof(zend_overloaded_element), NULL, 0);
>
>zend_llist_add_element(property_reference.elements_list,
>&overloaded_element);
>
> //Build argument stack
> for(i = 0;i < param_count;i++)
> zend_ptr_stack_push(&EG(argument_stack),
> params[i]);
> zend_ptr_stack_n_push(&EG(argument_stack), 2,
> (void *)param_count, NULL);
>
> EG(function_state_ptr) = &function_state;
>
>Z_OBJCE_PP(object_pp)->handle_function_call(param_count, retval_ptr,
>*object_pp, 1 TSRMLS_CC, &property_reference);
> EG(function_state_ptr) = original_function_state_ptr;
>
> zend_llist_destroy(property_reference.elements_list);
> efree(property_reference.elements_list);
> efree(function_state.function);
>
> zend_ptr_stack_clear_multiple(TSRMLS_C);
> return SUCCESS;
> }
> }
>}
>
>
>__________________________________________________
>Do You Yahoo!?
>Yahoo! Sports - Coverage of the 2002 Olympic Games
>http://sports.yahoo.com
>
>--
>PHP Development Mailing List <http://www.php.net/>
>To unsubscribe, visit: http://www.php.net/unsub.php
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php