Hello,
I'm new to the world of contributing code for open source projects. Please let
me know if I'm doing something incorrectly.
I propose that a new type, 'Z', be added in order to allow the extension coders
access to the zval** which was available with the now deprecated
zend_get_parameters().
I came to this conclusion after tracing some segfaults to a section of code
similar to this:
zval *zend_value;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zend_value) ==
FAILURE)
return;
convert_to_array_ex(&zend_value);
I realized after sifting through the Zend code that the proper handling of zval*
types is just as important as that of the zval's. This modification will give
extension programmers access to legitimate zval*'s and their corresponding zval.
Zend/zend_API.c RELEASE ver 4.3.1
425c425,434
<
case 'Z': { zval ***p=va_arg(*va, zval ***); if(Z_TYPE_PP(arg) == IS_NULL && return_null){ *p = NULL; } else { *p = arg; } } break;
474c483
< case 'z':
case 'z': case 'Z':
On a side note, since zval*'s and zvals are both controlled resources, it would
be nice to see an API that completely handles their use.
For example:
/* Zend already makes a distinction between
variables and values. Hence the refcount.
This idea could be reflected in the API. */
typedef zval** zvar; /* Named 'zvar' for the sake of argument. */
zvar zvar_new();
void zvar_destroy();
#define zvar_convert_to_*(ZVAR) convert_to_*_ex(ZVAR)
#define ZVAR_STRING(ZVAR, STRING, DUP) do{
SEPARATE_IF_NOT_REF(ZVAR);
ZVAL_STRING(*((zval**)ZVAR), STRING, DUP);
while(0)
etc
This would make extension creation much more friendly, and, as long as this API
is used, there should never be a worry that one is changing Zend internal data
in an inappropriate manner.
Josh