summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-05-05 11:09:18 +0300
committerDmitry Stogov <dmitry@zend.com>2015-05-05 11:09:18 +0300
commit5fc88a99689ba27e9e15fb4749bb980e1fe5e5fb (patch)
tree7edec41d778b93d986dc2f9e4a9dc1d942519cc1
parentc50994dc0b1c9e7dfe0d21aed45079bfa15fec1d (diff)
downloadphp-git-5fc88a99689ba27e9e15fb4749bb980e1fe5e5fb.tar.gz
Inline IS_LONG value calculation and avoid strtol() call.
-rw-r--r--Zend/zend_operators.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 2c80432dab..e384031ddb 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2624,6 +2624,8 @@ ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t
int digits = 0, dp_or_e = 0;
double local_dval = 0.0;
zend_uchar type;
+ zend_long tmp_lval = 0;
+ int neg = 0;
if (!length) {
return 0;
@@ -2641,7 +2643,10 @@ ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t
}
ptr = str;
- if (*ptr == '-' || *ptr == '+') {
+ if (*ptr == '-') {
+ neg = 1;
+ ptr++;
+ } else if (*ptr == '+') {
ptr++;
}
@@ -2657,6 +2662,7 @@ ZEND_API zend_uchar ZEND_FASTCALL _is_numeric_string_ex(const char *str, size_t
for (type = IS_LONG; !(digits >= MAX_LENGTH_OF_LONG && (dval || allow_errors == 1)); digits++, ptr++) {
check_digits:
if (ZEND_IS_DIGIT(*ptr)) {
+ tmp_lval = tmp_lval * 10 + (*ptr) - '0';
continue;
} else if (*ptr == '.' && dp_or_e < 1) {
goto process_double;
@@ -2723,7 +2729,10 @@ process_double:
}
if (lval) {
- *lval = ZEND_STRTOL(str, NULL, 10);
+ if (neg) {
+ tmp_lval = -tmp_lval;
+ }
+ *lval = tmp_lval;
}
return IS_LONG;