Re: call_user_function()

From: Date: Tue, 26 Feb 2002 17:13:25 +0000
Subject: Re: call_user_function()
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-80412@lists.php.net to get a copy of this message
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


« previous php.dev (#80412) next »