#25831 [Ver]: overload/__call breaks method Pass by reference

2003-10-26 Thread alan_k
 ID:   25831
 Updated by:   [EMAIL PROTECTED]
 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:

Ignore the last patch - doesnt help..


Previous Comments:


[2003-10-25 00:09:31] [EMAIL PROTECTED]

OK this seems to be working without segfaults..

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 -  1.20.2.3
+++ overload.c  25 Oct 2003 04:08:34 -
@@ -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;
+
zIndex: 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 -  1.20.2.3
+++ overload.c  25 Oct 2003 04:08:34 -
@@ -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;
@@ 

#25831 [Ver]: overload/__call breaks method Pass by reference

2003-10-24 Thread alan_k
 ID:   25831
 Updated by:   [EMAIL PROTECTED]
 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:

This appears to fix it.. 



? 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 -  1.20.2.3
+++ overload.c  24 Oct 2003 07:50:15 -
@@ -526,7 +526,7 @@
 
args = (zval ***)emalloc(ZEND_NUM_ARGS() * sizeof(zval **));
 
-   if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE)
{
+   if (zend_get_parameters_array(ht, ZEND_NUM_ARGS(), (zval **)args) ==
FAILURE) {
? 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 -  1.20.2.3
+++ overload.c  24 Oct 2003 07:50:15 -
@@ -526,7 +526,7 @@
 
args = (zval ***)emalloc(ZEND_NUM_ARGS() * sizeof(zval **));
 
-   if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE)
{
+   if (zend_get_parameters_array(ht, ZEND_NUM_ARGS(), (zval **)args) ==
FAILURE) {
efree(args);
php_error(E_WARNING, unable to obtain arguments);
return;



efree(args);
php_error(E_WARNING, unable to obtain arguments);
return;






Previous Comments:


[2003-10-10 22:12:29] [EMAIL PROTECTED]

simple script to reproduce:

?

 
class no_problem  {
function pass_by_reference($ref)   {
$ref = Pass by reference works;
}
}



class problem  { 
function pass_by_reference($ref)   {
$ref = Pass by reference works;
}
// simple dummy call implementation..
function __call($method,$params,$return) {
if ($method == get_class($this)) {
return true;
}
return false; // not found!
}
}

overload('problem');


$good = new no_problem;
$bad = new problem;

$message = Pass by reference does not work!;
$good-pass_by_reference($message);
print $message\n;



$message = Pass by reference does not work!;
$bad-pass_by_reference($message);
print $message\n;


?


should print 
Pass by reference works
Pass by reference works

actually prints
Pass by reference works
Pass by reference does not work!



[2003-10-10 19:30:28] viking at dslnorthwest dot net

Description:

When extending the DB_DataObject class using PHP 4.3.3, 
pass-by-reference calls to class methods don't work. 
After removing the call to overload() at the bottom of 
DB_DataObject.php, references work as expected. The 
following comments at the bottom of DB_DataObject 
allude to this:

// technially 4.3.2RC1 was broken!!
// looks like 4.3.3 may have problems too 
if ((phpversion() != '4.3.2-RC1')  (version_compare( 
phpversion(), 4.3.1)  0)) {
   overload('DB_DataObject');
   $GLOBALS['_DB_DATAOBJECT']['OVERLOADED'] = true; 
}

Reproduce code:
---
require_once(DB/DataObject.php);

class no_problem
{
function pass_by_reference($ref)
{
$ref = Pass by reference works;
}
}

class problem extends DB_DataObject
{
function pass_by_reference($ref)
{
$ref = Pass by reference works;
}
}

$good = new no_problem();
$bad = new problem();

$message = Pass by reference does not work!;
$good-pass_by_reference($message);
print $message\n;

$message = Pass by reference does not work!;
$bad-pass_by_reference($message);
print $message\n;

Expected result:

Pass by reference works 
Pass by reference works 

Actual result:
--
Pass by reference works 
Pass by reference does not work! 





-- 
Edit this bug report at http://bugs.php.net/?id=25831edit=1


#25831 [Ver]: overload/__call breaks method Pass by reference

2003-10-24 Thread alan_k
 ID:   25831
 Updated by:   [EMAIL PROTECTED]
 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:

OK this seems to be working without segfaults..

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 -  1.20.2.3
+++ overload.c  25 Oct 2003 04:08:34 -
@@ -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;
+
zIndex: 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 -  1.20.2.3
+++ overload.c  25 Oct 2003 04:08:34 -
@@ -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,