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

Reply via email to