Re: [PATCH] - Standardize argument parsing of objects

From: Date: Fri, 04 Nov 2005 08:28:36 +0000
Subject: Re: [PATCH] - Standardize argument parsing of objects
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-19903@lists.php.net to get a copy of this message
Hello Bob, this is a) wrong in the way you call the cast handler and b) we will definitively not add this behavior before the next major release aka HEAD. However it would be better to call the conversion functions (zend_operators.h) here to have get handler used when no cast handler is available to avoid inconsistencies with auto conversions in other places. I guess I know where you're heading, i am not quite sure this is essantial or even the rigth thing to for PHP yet at least for stuff like the array functions and objects that overload ArrayAccess it is more than usefull. regards marcus p.s.: You still haven't shown me any of your extension code :-/ Friday, November 4, 2005, 9:06:27 AM, you wrote: > --- zend_API.c 2005-11-03 20:26:02.000000000 -0800 > +++ zend_API.c 2005-11-03 20:26:02.000000000 -0800 > @@ -312,8 +312,17 @@ > *p = Z_LVAL_PP(arg); > break; > + case IS_OBJECT: { > + if (Z_OBJ_HANDLER_PP(arg, cast_object)) { > + SEPARATE_ZVAL_IF_NOT_REF(arg); > + if > (Z_OBJ_HANDLER_PP(arg, cast_object)(*arg, *arg, IS_LONG, 0 TSRMLS_CC) == SUCCESS) { > + *p = Z_LVAL_PP(arg); > + break; > + } > + } > + } > + > case IS_ARRAY: > - case IS_OBJECT: > case IS_RESOURCE: > default: > return "long"; > @@ -346,8 +355,17 @@ > *p = Z_DVAL_PP(arg); > break; > + case IS_OBJECT: { > + if (Z_OBJ_HANDLER_PP(arg, cast_object)) { > + SEPARATE_ZVAL_IF_NOT_REF(arg); > + if > (Z_OBJ_HANDLER_PP(arg, cast_object)(*arg, *arg, IS_DOUBLE, 0 TSRMLS_CC) == SUCCESS) { > + *p = Z_DVAL_PP(arg); > + break; > + } > + } > + } > + > case IS_ARRAY: > - case IS_OBJECT: > case IS_RESOURCE: > default: > return "double"; > @@ -408,8 +426,17 @@ > *p = Z_BVAL_PP(arg); > break; > + case IS_OBJECT: { > + if (Z_OBJ_HANDLER_PP(arg, cast_object)) { > + SEPARATE_ZVAL_IF_NOT_REF(arg); > + if > (Z_OBJ_HANDLER_PP(arg, cast_object)(*arg, *arg, IS_BOOL, 0 TSRMLS_CC) == SUCCESS) { > + *p = Z_BVAL_PP(arg); > + break; > + } > + } > + } > + > case IS_ARRAY: > - case IS_OBJECT: > case IS_RESOURCE: > default: > return "boolean"; > @@ -434,6 +461,15 @@ > case 'a': > { > zval **p = va_arg(*va, zval **); > + if (Z_TYPE_PP(arg) == IS_OBJECT) { > + if (Z_OBJ_HANDLER_PP(arg, cast_object)) { > + SEPARATE_ZVAL_IF_NOT_REF(arg); > + if (Z_OBJ_HANDLER_PP(arg, > cast_object)(*arg, *arg, IS_ARRAY, 0 TSRMLS_CC) == SUCCESS) { > + *p = *arg; > + break; > + } > + } > + } > if (Z_TYPE_PP(arg) != IS_ARRAY) { > if (Z_TYPE_PP(arg) == IS_NULL && return_null) { > *p = NULL; Best regards, Marcus

« previous php.internals (#19903) next »