summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-04-30 18:32:42 +0400
committerDmitry Stogov <dmitry@zend.com>2014-04-30 18:32:42 +0400
commit17d027ed47c1f07b397a611431d28ad0e0107146 (patch)
treeda6cadcd3ca0cad02dd4ff39f027575070873cbd /Zend/zend_operators.c
parent6a911e833f6b6dcac669a60808e96dc2c4f391d3 (diff)
downloadphp-git-17d027ed47c1f07b397a611431d28ad0e0107146.tar.gz
Split IS_BOOL into IS_FALSE and IS_TRUE
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c148
1 files changed, 81 insertions, 67 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 7d4518adbc..a72a75b1f3 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -204,8 +204,12 @@ try_again:
STR_RELEASE(str);
break;
}
- case IS_BOOL:
- Z_TYPE_INFO_P(op) = IS_LONG;
+ case IS_NULL:
+ case IS_FALSE:
+ ZVAL_LONG(op, 0);
+ break;
+ case IS_TRUE:
+ ZVAL_LONG(op, 1);
break;
case IS_RESOURCE:
{
@@ -217,9 +221,6 @@ try_again:
case IS_OBJECT:
convert_to_long_base(op, 10);
break;
- case IS_NULL:
- ZVAL_LONG(op, 0);
- break;
}
}
/* }}} */
@@ -240,16 +241,17 @@ try_again:
(op) = &(holder); \
break; \
} \
- case IS_BOOL: \
- ZVAL_LONG(&(holder), Z_LVAL_P(op)); \
+ case IS_NULL: \
+ case IS_FALSE: \
+ ZVAL_LONG(&(holder), 0); \
(op) = &(holder); \
break; \
- case IS_RESOURCE: \
- ZVAL_LONG(&(holder), Z_RES_HANDLE_P(op)); \
+ case IS_TRUE: \
+ ZVAL_LONG(&(holder), 1); \
(op) = &(holder); \
break; \
- case IS_NULL: \
- ZVAL_LONG(&(holder), 0); \
+ case IS_RESOURCE: \
+ ZVAL_LONG(&(holder), Z_RES_HANDLE_P(op)); \
(op) = &(holder); \
break; \
case IS_OBJECT: \
@@ -271,7 +273,11 @@ try_again:
} else if (Z_TYPE_P(op) != IS_LONG) { \
switch (Z_TYPE_P(op)) { \
case IS_NULL: \
- ZVAL_LONG(&holder, 0); \
+ case IS_FALSE: \
+ ZVAL_LONG(&(holder), 0); \
+ break; \
+ case IS_TRUE: \
+ ZVAL_LONG(&(holder), 1); \
break; \
case IS_DOUBLE: \
ZVAL_LONG(&holder, zend_dval_to_lval(Z_DVAL_P(op)));\
@@ -286,9 +292,6 @@ try_again:
ZVAL_DUP(&(holder), (op)); \
convert_to_long_base(&(holder), 10); \
break; \
- case IS_BOOL: \
- ZVAL_LONG(&(holder), Z_LVAL_P(op)); \
- break; \
case IS_RESOURCE: \
ZVAL_LONG(&holder, Z_RES_HANDLE_P(op)); \
break; \
@@ -306,7 +309,8 @@ try_again:
#define zendi_convert_to_boolean(op, holder, result) \
if (op==result) { \
convert_to_boolean(op); \
- } else if (Z_TYPE_P(op) != IS_BOOL) { \
+ } else if (Z_TYPE_P(op) != IS_FALSE && \
+ Z_TYPE_P(op) != IS_TRUE) { \
switch (Z_TYPE_P(op)) { \
case IS_NULL: \
ZVAL_BOOL(&holder, 0); \
@@ -378,15 +382,18 @@ ZEND_API void convert_to_long_base(zval *op, int base) /* {{{ */
switch (Z_TYPE_P(op)) {
case IS_NULL:
+ case IS_FALSE:
ZVAL_LONG(op, 0);
break;
+ case IS_TRUE:
+ ZVAL_LONG(op, 1);
+ break;
case IS_RESOURCE: {
long l = Z_RES_HANDLE_P(op);
zval_ptr_dtor(op);
ZVAL_LONG(op, l);
}
/* break missing intentionally */
- case IS_BOOL:
Z_TYPE_INFO_P(op) = IS_LONG;
break;
case IS_LONG:
@@ -439,15 +446,18 @@ ZEND_API void convert_to_double(zval *op) /* {{{ */
switch (Z_TYPE_P(op)) {
case IS_NULL:
+ case IS_FALSE:
ZVAL_DOUBLE(op, 0.0);
break;
+ case IS_TRUE:
+ ZVAL_DOUBLE(op, 1.0);
+ break;
case IS_RESOURCE: {
double d = (double) Z_RES_HANDLE_P(op);
zval_ptr_dtor(op);
ZVAL_DOUBLE(op, d);
}
break;
- case IS_BOOL:
case IS_LONG:
ZVAL_DOUBLE(op, (double) Z_LVAL_P(op));
break;
@@ -518,7 +528,8 @@ ZEND_API void convert_to_boolean(zval *op) /* {{{ */
int tmp;
switch (Z_TYPE_P(op)) {
- case IS_BOOL:
+ case IS_FALSE:
+ case IS_TRUE:
break;
case IS_NULL:
ZVAL_BOOL(op, 0);
@@ -559,10 +570,10 @@ ZEND_API void convert_to_boolean(zval *op) /* {{{ */
zval dst;
TSRMLS_FETCH();
- convert_object_to_type(op, &dst, IS_BOOL, convert_to_boolean);
+ convert_object_to_type(op, &dst, _IS_BOOL, convert_to_boolean);
zval_dtor(op);
- if (Z_TYPE(dst) == IS_BOOL) {
+ if (Z_TYPE(dst) == IS_FALSE || Z_TYPE(dst) == IS_TRUE) {
ZVAL_COPY_VALUE(op, &dst);
} else {
ZVAL_BOOL(op, 1);
@@ -589,20 +600,16 @@ ZEND_API void _convert_to_string(zval *op ZEND_FILE_LINE_DC) /* {{{ */
double dval;
switch (Z_TYPE_P(op)) {
- case IS_NULL: {
+ case IS_NULL:
+ case IS_FALSE: {
TSRMLS_FETCH();
ZVAL_EMPTY_STRING(op);
break;
}
- case IS_STRING:
+ case IS_TRUE:
+ ZVAL_NEW_STR(op, STR_INIT("1", 1, 0));
break;
- case IS_BOOL:
- if (Z_LVAL_P(op)) {
- ZVAL_NEW_STR(op, STR_INIT("1", 1, 0));
- } else {
- TSRMLS_FETCH();
- ZVAL_EMPTY_STRING(op);
- }
+ case IS_STRING:
break;
case IS_RESOURCE: {
long tmp = Z_RES_HANDLE_P(op);
@@ -812,10 +819,12 @@ ZEND_API long _zval_get_long_func(zval *op TSRMLS_DC) /* {{{ */
try_again:
switch (Z_TYPE_P(op)) {
case IS_NULL:
+ case IS_FALSE:
return 0;
+ case IS_TRUE:
+ return 1;
case IS_RESOURCE:
return Z_RES_HANDLE_P(op);
- case IS_BOOL:
case IS_LONG:
return Z_LVAL_P(op);
case IS_DOUBLE:
@@ -850,10 +859,12 @@ ZEND_API double _zval_get_double_func(zval *op TSRMLS_DC) /* {{{ */
try_again:
switch (Z_TYPE_P(op)) {
case IS_NULL:
+ case IS_FALSE:
return 0.0;
+ case IS_TRUE:
+ return 1.0;
case IS_RESOURCE:
return (double) Z_RES_HANDLE_P(op);
- case IS_BOOL:
case IS_LONG:
return (double) Z_LVAL_P(op);
case IS_DOUBLE:
@@ -890,15 +901,12 @@ ZEND_API zend_string *_zval_get_string_func(zval *op TSRMLS_DC) /* {{{ */
try_again:
switch (Z_TYPE_P(op)) {
case IS_NULL:
+ case IS_FALSE:
return STR_EMPTY_ALLOC();
case IS_STRING:
return STR_COPY(Z_STR_P(op));
- case IS_BOOL:
- if (Z_BVAL_P(op)) {
- return STR_INIT("1", 1, 0);
- } else {
- return STR_EMPTY_ALLOC();
- }
+ case IS_TRUE:
+ return STR_INIT("1", 1, 0);
case IS_RESOURCE: {
char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
int len;
@@ -1309,17 +1317,18 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
zval op1_copy, op2_copy;
long op1_lval;
- if (Z_TYPE_P(op1) != IS_BOOL || Z_TYPE_P(op2) != IS_BOOL) {
+ if ((Z_TYPE_P(op1) != IS_FALSE && Z_TYPE_P(op1) != IS_TRUE) ||
+ (Z_TYPE_P(op2) != IS_FALSE && Z_TYPE_P(op2) != IS_TRUE)) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_XOR);
zendi_convert_to_boolean(op1, op1_copy, result);
- op1_lval = Z_LVAL_P(op1);
+ op1_lval = Z_TYPE_P(op1) == IS_TRUE;
zendi_convert_to_boolean(op2, op2_copy, result);
} else {
- op1_lval = Z_LVAL_P(op1);
+ op1_lval = Z_TYPE_P(op1) == IS_TRUE;
}
- ZVAL_BOOL(result, op1_lval ^ Z_LVAL_P(op2));
+ ZVAL_BOOL(result, op1_lval ^ (Z_TYPE_P(op2) == IS_TRUE));
return SUCCESS;
}
/* }}} */
@@ -1328,13 +1337,17 @@ ZEND_API int boolean_not_function(zval *result, zval *op1 TSRMLS_DC) /* {{{ */
{
zval op1_copy;
- if (Z_TYPE_P(op1) != IS_BOOL) {
+ if (Z_TYPE_P(op1) == IS_FALSE) {
+ ZVAL_TRUE(result);
+ } else if (Z_TYPE_P(op1) == IS_TRUE) {
+ ZVAL_FALSE(result);
+ } else {
ZEND_TRY_UNARY_OBJECT_OPERATION(ZEND_BOOL_NOT);
zendi_convert_to_boolean(op1, op1_copy, result);
- }
- ZVAL_BOOL(result, !Z_LVAL_P(op1));
+ ZVAL_BOOL(result, Z_TYPE_P(op1) == IS_FALSE);
+ }
return SUCCESS;
}
/* }}} */
@@ -1741,19 +1754,19 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
return SUCCESS;
case TYPE_PAIR(IS_NULL, IS_NULL):
+ case TYPE_PAIR(IS_NULL, IS_FALSE):
+ case TYPE_PAIR(IS_FALSE, IS_NULL):
+ case TYPE_PAIR(IS_FALSE, IS_FALSE):
+ case TYPE_PAIR(IS_TRUE, IS_TRUE):
ZVAL_LONG(result, 0);
return SUCCESS;
- case TYPE_PAIR(IS_NULL, IS_BOOL):
- ZVAL_LONG(result, Z_LVAL_P(op2) ? -1 : 0);
- return SUCCESS;
-
- case TYPE_PAIR(IS_BOOL, IS_NULL):
- ZVAL_LONG(result, Z_LVAL_P(op1) ? 1 : 0);
+ case TYPE_PAIR(IS_NULL, IS_TRUE):
+ ZVAL_LONG(result, -1);
return SUCCESS;
- case TYPE_PAIR(IS_BOOL, IS_BOOL):
- ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2)));
+ case TYPE_PAIR(IS_TRUE, IS_NULL):
+ ZVAL_LONG(result, 1);
return SUCCESS;
case TYPE_PAIR(IS_STRING, IS_STRING):
@@ -1803,7 +1816,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
return ret;
} else if (Z_TYPE_P(op2) != IS_OBJECT && Z_OBJ_HT_P(op1)->cast_object) {
ZVAL_UNDEF(&tmp_free);
- if (Z_OBJ_HT_P(op1)->cast_object(op1, &tmp_free, Z_TYPE_P(op2) TSRMLS_CC) == FAILURE) {
+ if (Z_OBJ_HT_P(op1)->cast_object(op1, &tmp_free, ((Z_TYPE_P(op2) == IS_FALSE || Z_TYPE_P(op2) == IS_TRUE) ? _IS_BOOL : Z_TYPE_P(op2)) TSRMLS_CC) == FAILURE) {
ZVAL_LONG(result, 1);
zend_free_obj_get_result(&tmp_free TSRMLS_CC);
return SUCCESS;
@@ -1822,7 +1835,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
return ret;
} else if (Z_TYPE_P(op1) != IS_OBJECT && Z_OBJ_HT_P(op2)->cast_object) {
ZVAL_UNDEF(&tmp_free);
- if (Z_OBJ_HT_P(op2)->cast_object(op2, &tmp_free, Z_TYPE_P(op1) TSRMLS_CC) == FAILURE) {
+ if (Z_OBJ_HT_P(op2)->cast_object(op2, &tmp_free, ((Z_TYPE_P(op1) == IS_FALSE || Z_TYPE_P(op1) == IS_TRUE) ? _IS_BOOL : Z_TYPE_P(op1)) TSRMLS_CC) == FAILURE) {
ZVAL_LONG(result, -1);
zend_free_obj_get_result(&tmp_free TSRMLS_CC);
return SUCCESS;
@@ -1840,21 +1853,21 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
} else if (Z_ISREF_P(op2)) {
op2 = Z_REFVAL_P(op2);
} else if (!converted) {
- if (Z_TYPE_P(op1) == IS_NULL) {
+ if (Z_TYPE_P(op1) == IS_NULL || Z_TYPE_P(op1) == IS_FALSE) {
zendi_convert_to_boolean(op2, op2_copy, result);
- ZVAL_LONG(result, Z_LVAL_P(op2) ? -1 : 0);
+ ZVAL_LONG(result, (Z_TYPE_P(op2) == IS_TRUE) ? -1 : 0);
return SUCCESS;
- } else if (Z_TYPE_P(op2) == IS_NULL) {
+ } else if (Z_TYPE_P(op2) == IS_NULL || Z_TYPE_P(op2) == IS_FALSE) {
zendi_convert_to_boolean(op1, op1_copy, result);
- ZVAL_LONG(result, Z_LVAL_P(op1) ? 1 : 0);
+ ZVAL_LONG(result, (Z_TYPE_P(op1) == IS_TRUE) ? 1 : 0);
return SUCCESS;
- } else if (Z_TYPE_P(op1) == IS_BOOL) {
+ } else if (Z_TYPE_P(op1) == IS_TRUE) {
zendi_convert_to_boolean(op2, op2_copy, result);
- ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2)));
+ ZVAL_LONG(result, (Z_TYPE_P(op2) == IS_TRUE) ? 0 : 1);
return SUCCESS;
- } else if (Z_TYPE_P(op2) == IS_BOOL) {
+ } else if (Z_TYPE_P(op2) == IS_TRUE) {
zendi_convert_to_boolean(op1, op1_copy, result);
- ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2)));
+ ZVAL_LONG(result, (Z_TYPE_P(op1) == IS_TRUE) ? 0 : -1);
return SUCCESS;
} else {
zendi_convert_scalar_to_number(op1, op1_copy, result);
@@ -1895,7 +1908,7 @@ static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
if (is_identical_function(&result, z1, z2 TSRMLS_CC)==FAILURE) {
return 1;
}
- return !Z_LVAL(result);
+ return Z_TYPE(result) != IS_TRUE;
}
/* }}} */
@@ -1907,9 +1920,10 @@ ZEND_API int is_identical_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
}
switch (Z_TYPE_P(op1)) {
case IS_NULL:
+ case IS_FALSE:
+ case IS_TRUE:
ZVAL_BOOL(result, 1);
break;
- case IS_BOOL:
case IS_LONG:
ZVAL_BOOL(result, Z_LVAL_P(op1) == Z_LVAL_P(op2));
break;
@@ -1951,7 +1965,7 @@ ZEND_API int is_not_identical_function(zval *result, zval *op1, zval *op2 TSRMLS
if (is_identical_function(result, op1, op2 TSRMLS_CC) == FAILURE) {
return FAILURE;
}
- Z_LVAL_P(result) = !Z_LVAL_P(result);
+ ZVAL_BOOL(result, Z_TYPE_P(result) != IS_TRUE);
return SUCCESS;
}
/* }}} */
@@ -2242,7 +2256,7 @@ ZEND_API int decrement_function(zval *op1) /* {{{ */
ZEND_API int zval_is_true(zval *op) /* {{{ */
{
convert_to_boolean(op);
- return (Z_LVAL_P(op) ? 1 : 0);
+ return (Z_TYPE_P(op) == IS_TRUE ? 1 : 0);
}
/* }}} */