From: Nikita Popov Date: Fri, 25 Apr 2014 11:37:07 +0000 (+0200) Subject: Align zval_get_long/double with zval_get_string X-Git-Tag: POST_PHPNG_MERGE~412^2~43 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93f9518a58b5e56803197e1a27d8426465d77f5e;p=php Align zval_get_long/double with zval_get_string --- diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 764396aa03..fa4c750232 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -389,7 +389,6 @@ ZEND_API void convert_to_long_base(zval *op, int base) /* {{{ */ ZVAL_LONG(op, 0); break; case IS_RESOURCE: { - TSRMLS_FETCH(); long l = Z_RES_HANDLE_P(op); zval_ptr_dtor(op); ZVAL_LONG(op, l); @@ -450,7 +449,6 @@ ZEND_API void convert_to_double(zval *op) /* {{{ */ ZVAL_DOUBLE(op, 0.0); break; case IS_RESOURCE: { - TSRMLS_FETCH(); double d = (double) Z_RES_HANDLE_P(op); zval_ptr_dtor(op); ZVAL_DOUBLE(op, d); @@ -532,7 +530,6 @@ ZEND_API void convert_to_boolean(zval *op) /* {{{ */ ZVAL_BOOL(op, 0); break; case IS_RESOURCE: { - TSRMLS_FETCH(); long l = (Z_RES_HANDLE_P(op) ? 1 : 0); zval_ptr_dtor(op); @@ -617,7 +614,6 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */ long tmp = Z_RES_HANDLE_P(op); char *str; int len; - TSRMLS_FETCH(); zval_ptr_dtor(op); len = zend_spprintf(&str, 0, "Resource id #%ld", tmp); @@ -819,8 +815,9 @@ ZEND_API void multi_convert_to_string_ex(int argc, ...) /* {{{ */ } /* }}} */ -ZEND_API long zval_get_long(zval *op TSRMLS_DC) /* {{{ */ +ZEND_API long _zval_get_long_func(zval *op TSRMLS_DC) /* {{{ */ { +try_again: switch (Z_TYPE_P(op)) { case IS_NULL: return 0; @@ -848,6 +845,9 @@ ZEND_API long zval_get_long(zval *op TSRMLS_DC) /* {{{ */ return 1; } } + case IS_REFERENCE: + op = Z_REFVAL_P(op); + goto try_again; default: zend_error(E_WARNING, "Cannot convert to ordinal value"); return 0; @@ -855,8 +855,9 @@ ZEND_API long zval_get_long(zval *op TSRMLS_DC) /* {{{ */ } /* }}} */ -ZEND_API double zval_get_double(zval *op TSRMLS_DC) /* {{{ */ +ZEND_API double _zval_get_double_func(zval *op TSRMLS_DC) /* {{{ */ { +try_again: switch (Z_TYPE_P(op)) { case IS_NULL: return 0.0; @@ -886,6 +887,9 @@ ZEND_API double zval_get_double(zval *op TSRMLS_DC) /* {{{ */ return 1.0; } } + case IS_REFERENCE: + op = Z_REFVAL_P(op); + goto try_again; default: zend_error(E_WARNING, "Cannot convert to real value (type=%d)", Z_TYPE_P(op)); return 0.0; diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index a727df6707..7d786fa8ed 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -338,10 +338,16 @@ ZEND_API void multi_convert_to_long_ex(int argc, ...); ZEND_API void multi_convert_to_double_ex(int argc, ...); ZEND_API void multi_convert_to_string_ex(int argc, ...); -ZEND_API long zval_get_long(zval *op TSRMLS_DC); -ZEND_API double zval_get_double(zval *op TSRMLS_DC); +ZEND_API long _zval_get_long_func(zval *op TSRMLS_DC); +ZEND_API double _zval_get_double_func(zval *op TSRMLS_DC); ZEND_API zend_string *_zval_get_string_func(zval *op TSRMLS_DC); +#define zval_get_long(op) ((Z_TYPE_P(op) == IS_LONG) ? \ + Z_LVAL_P(op) : _zval_get_long_func((op) TSRMLS_CC)) + +#define zval_get_double(op) ((Z_TYPE_P(op) == IS_DOUBLE) ? \ + Z_DVAL_P(op) : _zval_get_double_func((op) TSRMLS_CC)) + #define zval_get_string(op) ((Z_TYPE_P(op) == IS_STRING) ? \ STR_COPY(Z_STR_P(op)) : _zval_get_string_func((op) TSRMLS_CC)) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index dbcd7d8695..a0a189bbe4 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4048,7 +4048,7 @@ void date_interval_write_property(zval *object, zval *member, zval *value, zend_ #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ - obj->diff->n = zval_get_long(value TSRMLS_CC); \ + obj->diff->n = zval_get_long(value); \ break; \ } diff --git a/ext/dom/document.c b/ext/dom/document.c index 7dd6d41671..b2c3274063 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -388,7 +388,7 @@ int dom_document_standalone_write(dom_object *obj, zval *newval TSRMLS_DC) return FAILURE; } - standalone = zval_get_long(newval TSRMLS_CC); + standalone = zval_get_long(newval); docp->standalone = ZEND_NORMALIZE_BOOL(standalone); return SUCCESS;