Due to this patch being sent during the msession discussion, it has not
been noticed, so I am resending.


-Jason
--- Begin Message ---
Problem
-------

There are some scenarios where a function requires the ability to modify
parameters that may also be optional. Optional parameters work well,
except in the scenario where all of the pass by reference parameters can
be optional. ex the socket_select() function. Since select is
argument-result, all three arrays that are taken as input must be passed
by reference, yet any can be excluded. So for example if you were
calling socket_select with a read socket array, a write socket array,
yet no exception array (quite common), you are currently forced to do
something like the following:

$wfds = array($sock1, $sock2);
$rfds = array($sock3, $sock4);
$null = NULL;

socket_select($rfds, $wfds, $null);


I have ran into this problem before several times while developing in
user space. (Especially when passing around semi-complex data
structures)

Proposed Solution
------------------

Allow all expressions to be passed by reference. This will allow
something like the following

function  normalize(&$element_tree, &$node_mapping, $max_depth){
//Code
}

normalize($my_tree, NULL, 25000);


Patch
------

I have attached a patch against ZE2 that accomplishes this. 


Thanks,
-Jason





Index: zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.285
diff -u -r1.285 zend_compile.c
--- zend_compile.c      23 Apr 2002 18:06:53 -0000      1.285
+++ zend_compile.c      25 May 2002 06:45:21 -0000
@@ -1271,7 +1271,7 @@
                                op = ZEND_SEND_REF;
                                break;
                        default:
-                               zend_error(E_COMPILE_ERROR, "Only variables can be 
passed by reference");
+                               op = ZEND_SEND_VAR;
                                break;
                }
        }
Index: zend_execute.c
===================================================================
RCS file: /repository/ZendEngine2/zend_execute.c,v
retrieving revision 1.341
diff -u -r1.341 zend_execute.c
--- zend_execute.c      8 May 2002 18:43:19 -0000       1.341
+++ zend_execute.c      25 May 2002 06:45:25 -0000
@@ -2292,10 +2292,6 @@
                                        NEXT_OPCODE();
                                }
                        case ZEND_SEND_VAL: 
-                               if (EX(opline)->extended_value==ZEND_DO_FCALL_BY_NAME
-                                       && 
ARG_SHOULD_BE_SENT_BY_REF(EX(opline)->op2.u.opline_num, EX(fbc), 
EX(fbc)->common.arg_types)) {
-                                               zend_error(E_ERROR, "Cannot pass 
parameter %d by reference", EX(opline)->op2.u.opline_num);
-                               }
                                {
                                        zval *valptr;
                                        zval *value;
@@ -2329,7 +2325,8 @@
                                                
zend_ptr_stack_push(&EG(argument_stack), varptr);
                                                NEXT_OPCODE();
                                        }
-                                       zend_error(E_ERROR, "Only variables can be 
passed by reference");
+                                       /* Should only occur with an uninitialized 
+variable */
+                                       goto send_by_var;
                                }
                                NEXT_OPCODE();
                        case ZEND_SEND_VAR:

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php
--- End Message ---
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to