[PHP-CVS] svn: /php/php-src/trunk/ UPGRADING ext/reflection/php_reflection.c ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt

2010-10-26 Thread Gustavo André dos Santos Lopes
cataphract   Tue, 26 Oct 2010 15:01:36 +

Revision: http://svn.php.net/viewvc?view=revisionrevision=304920

Log:
- Added ReflectionParameter::canBePassedByValue().

Changed paths:
U   php/php-src/trunk/UPGRADING
U   php/php-src/trunk/ext/reflection/php_reflection.c
A   
php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt

Modified: php/php-src/trunk/UPGRADING
===
--- php/php-src/trunk/UPGRADING 2010-10-26 12:40:48 UTC (rev 304919)
+++ php/php-src/trunk/UPGRADING 2010-10-26 15:01:36 UTC (rev 304920)
@@ -299,6 +299,7 @@
  - ReflectionClass::getTraits()
  - ReflectionClass::getTraitNames()
  - ReflectionClass::getTraitAliases()
+ - ReflectionParameter::canBePassedByValue()

- PDO_dblib
  - PDO::newRowset()

Modified: php/php-src/trunk/ext/reflection/php_reflection.c
===
--- php/php-src/trunk/ext/reflection/php_reflection.c   2010-10-26 12:40:48 UTC 
(rev 304919)
+++ php/php-src/trunk/ext/reflection/php_reflection.c   2010-10-26 15:01:36 UTC 
(rev 304920)
@@ -2519,6 +2519,23 @@
 }
 /* }}} */

+/* {{{ proto public bool ReflectionParameter::canBePassedByValue()
+   Returns whether this parameter can be passed by value */
+ZEND_METHOD(reflection_parameter, canBePassedByValue)
+{
+   reflection_object *intern;
+   parameter_reference *param;
+
+   if (zend_parse_parameters_none() == FAILURE) {
+   return;
+   }
+   GET_REFLECTION_OBJECT_PTR(param);
+
+   /* true if it's ZEND_SEND_BY_VAL or ZEND_SEND_PREFER_REF */
+   RETVAL_BOOL(param-arg_info-pass_by_reference != ZEND_SEND_BY_REF);
+}
+/* }}} */
+
 /* {{{ proto public bool ReflectionParameter::getPosition()
Returns whether this parameter is an optional parameter */
 ZEND_METHOD(reflection_parameter, getPosition)
@@ -5901,6 +5918,7 @@
ZEND_ME(reflection_parameter, __toString, arginfo_reflection__void, 0)
ZEND_ME(reflection_parameter, getName, arginfo_reflection__void, 0)
ZEND_ME(reflection_parameter, isPassedByReference, 
arginfo_reflection__void, 0)
+   ZEND_ME(reflection_parameter, canBePassedByValue, 
arginfo_reflection__void, 0)
ZEND_ME(reflection_parameter, getDeclaringFunction, 
arginfo_reflection__void, 0)
ZEND_ME(reflection_parameter, getDeclaringClass, 
arginfo_reflection__void, 0)
ZEND_ME(reflection_parameter, getClass, arginfo_reflection__void, 0)

Added: 
php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
===
--- 
php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
  (rev 0)
+++ 
php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
  2010-10-26 15:01:36 UTC (rev 304920)
@@ -0,0 +1,84 @@
+--TEST--
+ReflectionParameter class - canBePassedByValue() method.
+--FILE--
+?php
+
+function aux($fun) {
+
+$func = new ReflectionFunction($fun);
+$parameters = $func-getParameters();
+foreach($parameters as $parameter) {
+echo Name: , $parameter-getName(), \n;
+echo Is passed by reference: , 
$parameter-isPassedByReference()?yes:no, \n;
+echo Can be passed by value: , 
$parameter-canBePassedByValue()?yes:no, \n;
+echo \n;
+}
+
+}
+
+echo = array_multisort:\n\n;
+
+aux('array_multisort');
+
+
+echo = sort:\n\n;
+
+aux('sort');
+
+echo = user function:\n\n;
+
+function ufunc($arg1, $arg2) {}
+
+aux('ufunc');
+
+echo Done.\n;
+
+?
+--EXPECTF--
+= array_multisort:
+
+Name: arr1
+Is passed by reference: yes
+Can be passed by value: yes
+
+Name: SORT_ASC_or_SORT_DESC
+Is passed by reference: yes
+Can be passed by value: yes
+
+Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING
+Is passed by reference: yes
+Can be passed by value: yes
+
+Name: arr2
+Is passed by reference: yes
+Can be passed by value: yes
+
+Name: SORT_ASC_or_SORT_DESC
+Is passed by reference: yes
+Can be passed by value: yes
+
+Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING
+Is passed by reference: yes
+Can be passed by value: yes
+
+= sort:
+
+Name: arg
+Is passed by reference: yes
+Can be passed by value: no
+
+Name: sort_flags
+Is passed by reference: no
+Can be passed by value: yes
+
+= user function:
+
+Name: arg1
+Is passed by reference: yes
+Can be passed by value: no
+
+Name: arg2
+Is passed by reference: no
+Can be passed by value: yes
+
+Done.

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Re: [PHP-CVS] svn: /php/php-src/trunk/ UPGRADING ext/reflection/php_reflection.c ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt

2010-10-26 Thread Pierre Joye
hi Gustavo,

I'm not sure it makes sense to add a method to do the opposite of
::isPassedByReference. I'm also not sure about ZEND_SEND_PREFER_REF
being considered as by value in your implementation.

What is the logic/reasoning behind this addition?

Cheers,

2010/10/26 Gustavo André dos Santos Lopes cataphr...@php.net:
 cataphract                               Tue, 26 Oct 2010 15:01:36 +

 Revision: http://svn.php.net/viewvc?view=revisionrevision=304920

 Log:
 - Added ReflectionParameter::canBePassedByValue().

 Changed paths:
    U   php/php-src/trunk/UPGRADING
    U   php/php-src/trunk/ext/reflection/php_reflection.c
    A   
 php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt

 Modified: php/php-src/trunk/UPGRADING
 ===
 --- php/php-src/trunk/UPGRADING 2010-10-26 12:40:48 UTC (rev 304919)
 +++ php/php-src/trunk/UPGRADING 2010-10-26 15:01:36 UTC (rev 304920)
 @@ -299,6 +299,7 @@
          - ReflectionClass::getTraits()
          - ReflectionClass::getTraitNames()
          - ReflectionClass::getTraitAliases()
 +         - ReflectionParameter::canBePassedByValue()

        - PDO_dblib
          - PDO::newRowset()

 Modified: php/php-src/trunk/ext/reflection/php_reflection.c
 ===
 --- php/php-src/trunk/ext/reflection/php_reflection.c   2010-10-26 12:40:48 
 UTC (rev 304919)
 +++ php/php-src/trunk/ext/reflection/php_reflection.c   2010-10-26 15:01:36 
 UTC (rev 304920)
 @@ -2519,6 +2519,23 @@
  }
  /* }}} */

 +/* {{{ proto public bool ReflectionParameter::canBePassedByValue()
 +   Returns whether this parameter can be passed by value */
 +ZEND_METHOD(reflection_parameter, canBePassedByValue)
 +{
 +       reflection_object *intern;
 +       parameter_reference *param;
 +
 +       if (zend_parse_parameters_none() == FAILURE) {
 +               return;
 +       }
 +       GET_REFLECTION_OBJECT_PTR(param);
 +
 +       /* true if it's ZEND_SEND_BY_VAL or ZEND_SEND_PREFER_REF */
 +       RETVAL_BOOL(param-arg_info-pass_by_reference != ZEND_SEND_BY_REF);
 +}
 +/* }}} */
 +
  /* {{{ proto public bool ReflectionParameter::getPosition()
    Returns whether this parameter is an optional parameter */
  ZEND_METHOD(reflection_parameter, getPosition)
 @@ -5901,6 +5918,7 @@
        ZEND_ME(reflection_parameter, __toString, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getName, arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, isPassedByReference, 
 arginfo_reflection__void, 0)
 +       ZEND_ME(reflection_parameter, canBePassedByValue, 
 arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getDeclaringFunction, 
 arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getDeclaringClass, 
 arginfo_reflection__void, 0)
        ZEND_ME(reflection_parameter, getClass, arginfo_reflection__void, 0)

 Added: 
 php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
 ===
 --- 
 php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
                           (rev 0)
 +++ 
 php/php-src/trunk/ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt
   2010-10-26 15:01:36 UTC (rev 304920)
 @@ -0,0 +1,84 @@
 +--TEST--
 +ReflectionParameter class - canBePassedByValue() method.
 +--FILE--
 +?php
 +
 +function aux($fun) {
 +
 +    $func = new ReflectionFunction($fun);
 +    $parameters = $func-getParameters();
 +    foreach($parameters as $parameter) {
 +        echo Name: , $parameter-getName(), \n;
 +        echo Is passed by reference: , 
 $parameter-isPassedByReference()?yes:no, \n;
 +        echo Can be passed by value: , 
 $parameter-canBePassedByValue()?yes:no, \n;
 +        echo \n;
 +    }
 +
 +}
 +
 +echo = array_multisort:\n\n;
 +
 +aux('array_multisort');
 +
 +
 +echo = sort:\n\n;
 +
 +aux('sort');
 +
 +echo = user function:\n\n;
 +
 +function ufunc($arg1, $arg2) {}
 +
 +aux('ufunc');
 +
 +echo Done.\n;
 +
 +?
 +--EXPECTF--
 += array_multisort:
 +
 +Name: arr1
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 +Name: SORT_ASC_or_SORT_DESC
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 +Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 +Name: arr2
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 +Name: SORT_ASC_or_SORT_DESC
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 +Name: SORT_REGULAR_or_SORT_NUMERIC_or_SORT_STRING
 +Is passed by reference: yes
 +Can be passed by value: yes
 +
 += sort:
 +
 +Name: arg
 +Is passed by reference: yes
 +Can be passed by value: no
 +
 +Name: sort_flags
 +Is passed by reference: no
 +Can be passed by value: yes
 +
 += user function:
 +
 +Name: arg1
 +Is passed by reference: yes
 +Can be passed by value: no
 +
 +Name: 

Re: [PHP-CVS] svn: /php/php-src/trunk/ UPGRADING ext/reflection/php_reflection.c ext/reflection/tests/ReflectionParameter_canBePassedByValue.phpt

2010-10-26 Thread Gustavo Lopes
On Tue, 26 Oct 2010 17:41:30 +0100, Pierre Joye pierre@gmail.com  
wrote:



hi Gustavo,

I'm not sure it makes sense to add a method to do the opposite of
::isPassedByReference. I'm also not sure about ZEND_SEND_PREFER_REF
being considered as by value in your implementation.

What is the logic/reasoning behind this addition?



It's not the opposite of isPassedByReference(). There are three possible  
values for the pass_by_reference zend_bool (taking advantage of its  
8-bits...):


785 #define ZEND_SEND_BY_VAL 0
786 #define ZEND_SEND_BY_REF 1
787 #define ZEND_SEND_PREFER_REF 2

With ZEND_SEND_PREFER_REF, the parameter is sent by reference, but if it's  
not possible, instead of giving an error, it allows the value.


That's what canBePassedByValue tests; whether sending a value would give  
an error or not.


--
Gustavo Lopes

--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php