Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:4982 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 11536 invoked by uid 1010); 25 Oct 2003 04:14:01 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 11482 invoked from network); 25 Oct 2003 04:14:00 -0000 Received: from unknown (HELO alanathome.ossc.com.hk) (202.81.246.113) by pb1.pair.com with SMTP; 25 Oct 2003 04:14:00 -0000 Received: from [192.168.0.40] (helo=akbkhome.com ident=alan) by alanathome.ossc.com.hk with esmtp (Exim 4.22) id 1ADFr1-00034r-2p for internals@lists.php.net; Sat, 25 Oct 2003 12:16:43 +0800 Message-ID: <3F99F944.602@akbkhome.com> Date: Sat, 25 Oct 2003 12:17:08 +0800 User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5b) Gecko/20030909 X-Accept-Language: en-us, en MIME-Version: 1.0 To: internals@lists.php.net Content-Type: multipart/mixed; boundary="------------060903020205030202080400" Subject: [Fwd: [PATCH] to fix Re: #25831 [Ver]: overload/__call breaks method Pass by reference] From: alan@akbkhome.com (Alan Knowles) --------------060903020205030202080400 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Can someone have a look at this - it appears to work now. - eg. It runs overloaded classes ok without segfaulting. Regards Alan -- Edit this bug report at http://bugs.php.net/?id=25831&edit=1 alan_k@php.net wrote: > ID: 25831 > Updated by: alan_k@php.net > Reported By: viking at dslnorthwest dot net > Status: Verified > Bug Type: Scripting Engine problem > Operating System: all > PHP Version: 4.3.4RC2-dev > New Comment: -- Can you help out? Need Consulting Services or Know of a Job? http://www.akbkhome.com -- Can you help out? Need Consulting Services or Know of a Job? http://www.akbkhome.com --------------060903020205030202080400 Content-Type: text/plain; name="diff.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diff.txt" ? diff.txt Index: overload.c =================================================================== RCS file: /repository/php-src/ext/overload/Attic/overload.c,v retrieving revision 1.20.2.3 diff -u -r1.20.2.3 overload.c --- overload.c 15 Apr 2003 04:14:21 -0000 1.20.2.3 +++ overload.c 25 Oct 2003 04:08:34 -0000 @@ -507,7 +507,7 @@ static void overload_call_method(INTERNAL_FUNCTION_PARAMETERS, zend_property_reference *property_reference) { zval ***args; - zval *retval = NULL; + int call_result; zend_bool use_call_handler = 1; zval *object = property_reference->object; @@ -526,13 +526,15 @@ args = (zval ***)emalloc(ZEND_NUM_ARGS() * sizeof(zval **)); - if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { - efree(args); - php_error(E_WARNING, "unable to obtain arguments"); - return; - } if (use_call_handler) { + zval *retval = NULL; + + if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) { + efree(args); + php_error(E_WARNING, "unable to obtain arguments"); + return; + } zval **handler_args[3]; zval *arg_array; zval result, *result_ptr = &result; @@ -588,23 +590,29 @@ } zval_ptr_dtor(&retval); } else { + zval retval; + if (zend_get_parameters_array(ht, ZEND_NUM_ARGS(), (zval **)args) == FAILURE) { + efree(args); + php_error(E_WARNING, "unable to obtain arguments"); + return; + } + ZVAL_STRINGL(&call_handler, Z_STRVAL(method->element), Z_STRLEN(method->element), 0); - call_result = call_user_function_ex(NULL, + call_result = call_user_function(NULL, &object, &call_handler, - &retval, - ZEND_NUM_ARGS(), args, - 0, NULL TSRMLS_CC); + return_value, + ZEND_NUM_ARGS(),(zval **)args TSRMLS_CC); - if (call_result == FAILURE || !retval) { + if (call_result == FAILURE || !&return_value) { efree(args); php_error(E_WARNING, "unable to call %s::%s() method", Z_OBJCE_P(object)->name, Z_STRVAL(method->element)); return; } - *return_value = *retval; + zval_copy_ctor(return_value); - zval_ptr_dtor(&retval); + } efree(args); --------------060903020205030202080400--