logo       
Google Custom Search
    AddThis Social Bookmark Button
-->

cvs: ZendEngine2 / zend_API.c zend_API.h: msg#00016

Subject: cvs: ZendEngine2 / zend_API.c zend_API.h
helly           Thu Feb  8 14:33:16 2007 UTC

  Modified files:              
    /ZendEngine2        zend_API.c zend_API.h 
  Log:
  - Fix potential issue with 'f'-parameter parsing
  - Complete zend_fcall_info_*() API
  
  
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.c?r1=1.425&r2=1.426&diff_format=u
Index: ZendEngine2/zend_API.c
diff -u ZendEngine2/zend_API.c:1.425 ZendEngine2/zend_API.c:1.426
--- ZendEngine2/zend_API.c:1.425        Thu Feb  8 12:29:57 2007
+++ ZendEngine2/zend_API.c      Thu Feb  8 14:33:16 2007
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_API.c,v 1.425 2007/02/08 12:29:57 helly Exp $ */
+/* $Id: zend_API.c,v 1.426 2007/02/08 14:33:16 helly Exp $ */
 
 #include "zend.h"
 #include "zend_execute.h"
@@ -866,7 +866,6 @@
        int max_num_args = 0;
        int post_varargs = 0;
        zval **arg;
-       void **p;
        int arg_count;
        int quiet = flags & ZEND_PARSE_PARAMS_QUIET;
        zend_bool have_varargs = 0;
@@ -887,7 +886,7 @@
                        case 'o': case 'O':
                        case 'z': case 'Z':
                        case 't': case 'u':
-                       case 'C': case 'h':
+                       case 'C': case 'h':
                        case 'U': case 'S':
                        case 'f': case 'x':
                                max_num_args++;
@@ -958,8 +957,7 @@
                return FAILURE;
        }
 
-       p = EG(argument_stack).top_element-2;
-       arg_count = (ulong) *p;
+       arg_count = (ulong) *(EG(argument_stack).top_element-2);
 
        if (num_args > arg_count) {
                zend_error(E_WARNING, "%v(): could not obtain parameters for 
parsing",
@@ -972,7 +970,7 @@
                for (spec_walk = type_spec, i = 0; *spec_walk && i < num_args; 
spec_walk++) {
                        switch (*spec_walk) {
                                case 'T':
-                                       arg = (zval **) p - (arg_count-i);
+                                       arg = (zval **) 
(EG(argument_stack).top_element - 2 - (arg_count-i));
                                        if (Z_TYPE_PP(arg) == IS_UNICODE && 
(T_arg_type == -1 || T_arg_type == IS_STRING)) {
                                                /* we can upgrade from strings 
to Unicode */
                                                T_arg_type = IS_UNICODE;
@@ -1019,13 +1017,14 @@
 
                        if (num_varargs > 0) {
                                int iv = 0;
+                               zval **p = (zval **) 
(EG(argument_stack).top_element - 2 - (arg_count - i));
+
                                *n_varargs = num_varargs;
 
                                /* allocate space for array and store args */
                                *varargs = safe_emalloc(num_varargs, 
sizeof(zval **), 0);
                                while (num_varargs-- > 0) {
-                                       (*varargs)[iv++] = (zval **) p - 
(arg_count-i);
-                                       i++;
+                                       (*varargs)[iv++] = p++;
                                }
 
                                /* adjust how many args we have left and 
restart loop */
@@ -1037,7 +1036,7 @@
                        }
                }
 
-               arg = (zval **) p - (arg_count-i);
+               arg = (zval **) (EG(argument_stack).top_element - 2 - 
(arg_count-i));
 
                if (zend_parse_arg(i+1, arg, va, &type_spec, quiet, T_arg_type 
TSRMLS_CC) == FAILURE) {
                        /* clean up varargs array if it was used */
@@ -2939,11 +2938,33 @@
        return SUCCESS;
 }
 
-ZEND_API int zend_fcall_info_argn(zend_fcall_info *fci TSRMLS_DC, int argc, 
...)
+ZEND_API int zend_fcall_info_argp(zend_fcall_info *fci TSRMLS_DC, int argc, 
zval ***argv)
+{
+       int i;
+       
+       if (argc < 0) {
+               return FAILURE;
+       }
+       
+       zend_fcall_info_args_clear(fci, !argc);
+       
+       if (argc) {
+               fci->param_count = argc;
+               fci->params = (zval ***) erealloc(fci->params, fci->param_count 
* sizeof(zval **));
+
+               for (i = 0; i < argc; ++i) {
+                       ZVAL_ADDREF(*(argv[i]));
+                       fci->params[i] = argv[i];
+               }
+       }
+       
+       return SUCCESS;
+}
+
+ZEND_API int zend_fcall_info_argv(zend_fcall_info *fci TSRMLS_DC, int argc, 
va_list *argv)
 {
        int i;
        zval **arg;
-       va_list argv;
        
        if (argc < 0) {
                return FAILURE;
@@ -2955,18 +2976,28 @@
                fci->param_count = argc;
                fci->params = (zval ***) erealloc(fci->params, fci->param_count 
* sizeof(zval **));
                
-               va_start(argv, argc);
                for (i = 0; i < argc; ++i) {
-                       arg = va_arg(argv, zval **);
+                       arg = va_arg(*argv, zval **);
                        ZVAL_ADDREF(*arg);
                        fci->params[i] = arg;
                }
-               va_end(argv);
        }
        
        return SUCCESS;
 }
 
+ZEND_API int zend_fcall_info_argn(zend_fcall_info *fci TSRMLS_DC, int argc, 
...)
+{
+       int ret;
+       va_list argv;
+       
+       va_start(argv, argc);
+       ret = zend_fcall_info_argv(fci TSRMLS_CC, argc, &argv);
+       va_end(argv);
+       
+       return ret;
+}
+
 ZEND_API int zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache 
*fcc, zval **retval_ptr_ptr, zval *args TSRMLS_DC)
 {
        zval *retval, ***org_params = NULL;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.h?r1=1.285&r2=1.286&diff_format=u
Index: ZendEngine2/zend_API.h
diff -u ZendEngine2/zend_API.h:1.285 ZendEngine2/zend_API.h:1.286
--- ZendEngine2/zend_API.h:1.285        Thu Feb  8 12:29:57 2007
+++ ZendEngine2/zend_API.h      Thu Feb  8 14:33:16 2007
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_API.h,v 1.285 2007/02/08 12:29:57 helly Exp $ */
+/* $Id: zend_API.h,v 1.286 2007/02/08 14:33:16 helly Exp $ */
 
 #ifndef ZEND_API_H
 #define ZEND_API_H
@@ -1527,8 +1527,18 @@
  */
 ZEND_API int zend_fcall_info_init(zval *callable, zend_fcall_info *fci, 
zend_fcall_info_cache *fcc, zval *callable_name TSRMLS_DC);
 
+/** Clear argumens connected with zend_fcall_info *fci
+ * If free_mem is not zero then the params array gets free'd as well
+ */
 ZEND_API void zend_fcall_info_args_clear(zend_fcall_info *fci, int free_mem);
+
+/** Save current arguments from zend_fcall_info *fci
+ * params array will be set to NULL
+ */
 ZEND_API void zend_fcall_info_args_save(zend_fcall_info *fci, int 
*param_count, zval ****params);
+
+/** Free arguments connected with zend_fcall_info *fci andset back saved ones.
+ */
 ZEND_API void zend_fcall_info_args_restore(zend_fcall_info *fci, int 
param_count, zval ***params);
 
 /** Set or clear the arguments in the zend_call_info struct taking care of
@@ -1540,6 +1550,18 @@
  * If argc is 0 the arguments which are set will be cleared, else pass
  * a variable amount of zval** arguments.
  */
+ZEND_API int zend_fcall_info_argp(zend_fcall_info *fci TSRMLS_DC, int argc, 
zval ***argv);
+
+/** Set arguments in the zend_fcall_info struct taking care of refcount.
+ * If argc is 0 the arguments which are set will be cleared, else pass
+ * a variable amount of zval** arguments.
+ */
+ZEND_API int zend_fcall_info_argv(zend_fcall_info *fci TSRMLS_DC, int argc, 
va_list *argv);
+
+/** Set arguments in the zend_fcall_info struct taking care of refcount.
+ * If argc is 0 the arguments which are set will be cleared, else pass
+ * a variable amount of zval** arguments.
+ */
 ZEND_API int zend_fcall_info_argn(zend_fcall_info *fci TSRMLS_DC, int argc, 
...);
 
 /** Call a function using information created by zend_fcall_info_init()/args().

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




<Prev in Thread] Current Thread [Next in Thread>