summaryrefslogtreecommitdiff
path: root/Zend/zend_operators.c
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2006-12-30 01:57:01 +0000
committerIlia Alshanetsky <iliaa@php.net>2006-12-30 01:57:01 +0000
commit689504556518b823ba8d375853ca79bef70a2fed (patch)
tree8cacbb95fb94019791ae1bad043d521ec7132bbe /Zend/zend_operators.c
parent790b0b9edf607327bcb0b427eec5f317033c322f (diff)
downloadphp-git-689504556518b823ba8d375853ca79bef70a2fed.tar.gz
Simplify & optimize code
# Patch by Matt Wilmas
Diffstat (limited to 'Zend/zend_operators.c')
-rw-r--r--Zend/zend_operators.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index a233ede195..7c0490316e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1958,19 +1958,23 @@ ZEND_API void zendi_smart_strcmp(zval *result, zval *s1, zval *s2)
(ret2=is_numeric_string(s2->value.str.val, s2->value.str.len, &lval2, &dval2, 0))) {
if ((ret1==IS_DOUBLE) || (ret2==IS_DOUBLE)) {
if (ret1!=IS_DOUBLE) {
- dval1 = zend_strtod(s1->value.str.val, NULL);
+ dval1 = (double) lval1;
} else if (ret2!=IS_DOUBLE) {
- dval2 = zend_strtod(s2->value.str.val, NULL);
+ dval2 = (double) lval2;
+ } else if (dval1 == dval2 && !zend_finite(dval1)) {
+ /* Both values overflowed and have the same sign,
+ * so a numeric comparison would be inaccurate */
+ goto string_cmp;
}
result->value.dval = dval1 - dval2;
result->value.lval = ZEND_NORMALIZE_BOOL(result->value.dval);
result->type = IS_LONG;
} else { /* they both have to be long's */
- result->value.lval = lval1 - lval2;
- result->value.lval = ZEND_NORMALIZE_BOOL(result->value.lval);
+ result->value.lval = lval1 > lval2 ? 1 : (lval1 < lval2 ? -1 : 0);
result->type = IS_LONG;
}
} else {
+string_cmp:
result->value.lval = zend_binary_zval_strcmp(s1, s2);
result->value.lval = ZEND_NORMALIZE_BOOL(result->value.lval);
result->type = IS_LONG;