summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2014-06-03 13:10:42 +0400
committerDmitry Stogov <dmitry@zend.com>2014-06-03 13:10:42 +0400
commit3f6f0d5a700a7de777336569846fa2bfe23c667c (patch)
treee120f8bfc68c0fa6951ce16aaab2ebcc3d842c10
parentbc2ba841f94515170c4c1311cdde5a1a366db037 (diff)
downloadphp-git-3f6f0d5a700a7de777336569846fa2bfe23c667c.tar.gz
Simplified and optimized ZEND_HANDLE_NUMERIC()
-rw-r--r--Zend/zend_compile.c12
-rw-r--r--Zend/zend_execute.c4
-rw-r--r--Zend/zend_hash.h212
-rw-r--r--Zend/zend_vm_def.h12
-rw-r--r--Zend/zend_vm_execute.h176
-rw-r--r--ext/opcache/Optimizer/zend_optimizer.c4
-rw-r--r--ext/spl/spl_engine.c6
7 files changed, 299 insertions, 127 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index ea75c1503a..fda1c7606e 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -811,10 +811,8 @@ void fetch_array_dim(znode *result, znode *parent, znode *dim TSRMLS_DC) /* {{{
SET_NODE(opline.op2, dim);
if (opline.op2_type == IS_CONST && Z_TYPE(CONSTANT(opline.op2.constant)) == IS_STRING) {
ulong index;
- int numeric = 0;
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline.op2.constant)), Z_STRLEN(CONSTANT(opline.op2.constant))+1, index, numeric = 1);
- if (numeric) {
+ if (ZEND_HANDLE_NUMERIC(Z_STR(CONSTANT(opline.op2.constant)), index)) {
zval_dtor(&CONSTANT(opline.op2.constant));
ZVAL_LONG(&CONSTANT(opline.op2.constant), index);
}
@@ -5872,11 +5870,9 @@ void zend_do_init_array(znode *result, znode *expr, znode *offset, zend_bool is_
SET_NODE(opline->op2, offset);
if (opline->op2_type == IS_CONST && Z_TYPE(CONSTANT(opline->op2.constant)) == IS_STRING) {
ulong index;
- int numeric = 0;
opline->extended_value |= ZEND_ARRAY_NOT_PACKED;
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline->op2.constant)), Z_STRLEN(CONSTANT(opline->op2.constant))+1, index, numeric = 1);
- if (numeric) {
+ if (ZEND_HANDLE_NUMERIC(Z_STR(CONSTANT(opline->op2.constant)), index)) {
zval_dtor(&CONSTANT(opline->op2.constant));
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
}
@@ -5904,11 +5900,9 @@ void zend_do_add_array_element(znode *result, znode *expr, znode *offset, zend_b
SET_NODE(opline->op2, offset);
if (opline->op2_type == IS_CONST && Z_TYPE(CONSTANT(opline->op2.constant)) == IS_STRING) {
ulong index;
- int numeric = 0;
init_opline->extended_value |= ZEND_ARRAY_NOT_PACKED;
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL(CONSTANT(opline->op2.constant)), Z_STRLEN(CONSTANT(opline->op2.constant))+1, index, numeric = 1);
- if (numeric) {
+ if (ZEND_HANDLE_NUMERIC(Z_STR(CONSTANT(opline->op2.constant)), index)) {
zval_dtor(&CONSTANT(opline->op2.constant));
ZVAL_LONG(&CONSTANT(opline->op2.constant), index);
}
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index a9b9c92b0e..80d4fbb5db 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1045,7 +1045,9 @@ num_index:
} else if (EXPECTED(Z_TYPE_P(dim) == IS_STRING)) {
offset_key = Z_STR_P(dim);
if (dim_type != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(offset_key->val, offset_key->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(offset_key, hval)) {
+ goto num_index;
+ }
}
str_index:
retval = zend_hash_find(ht, offset_key);
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 8660f8b6b7..c196134657 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -235,46 +235,61 @@ END_EXTERN_C()
#define ZEND_INIT_SYMTABLE_EX(ht, n, persistent) \
zend_hash_init(ht, n, NULL, ZVAL_PTR_DTOR, persistent)
-#define ZEND_HANDLE_NUMERIC_EX(key, length, idx, func) do { \
- register const char *tmp = key; \
- \
- if (*tmp == '-') { \
- tmp++; \
- } \
- if (*tmp >= '0' && *tmp <= '9') { /* possibly a numeric index */ \
- const char *end = key + length - 1; \
- \
- if ((*end != '\0') /* not a null terminated string */ \
- || (*tmp == '0' && length > 2) /* numbers with leading zeros */ \
- || (end - tmp > MAX_LENGTH_OF_LONG - 1) /* number too long */ \
- || (SIZEOF_LONG == 4 && \
- end - tmp == MAX_LENGTH_OF_LONG - 1 && \
- *tmp > '2')) { /* overflow */ \
- break; \
- } \
- idx = (*tmp - '0'); \
- while (++tmp != end && *tmp >= '0' && *tmp <= '9') { \
- idx = (idx * 10) + (*tmp - '0'); \
- } \
- if (tmp == end) { \
- if (*key == '-') { \
- if (idx-1 > LONG_MAX) { /* overflow */ \
- break; \
- } \
- idx = 0 - idx; \
- } else if (idx > LONG_MAX) { /* overflow */ \
- break; \
- } \
- func; \
- } \
- } \
-} while (0)
-
-#define ZEND_HANDLE_NUMERIC(key, length, func) do { \
- ulong idx; \
- \
- ZEND_HANDLE_NUMERIC_EX(key, length, idx, return func); \
-} while (0)
+static inline int _zend_handle_numeric_str(const char *key, int length, ulong *idx)
+{
+ register const char *tmp = key;
+ const char *end;
+
+ if (*tmp > '9') {
+ return 0;
+ } else if (*tmp < '0') {
+ if (*tmp != '-') {
+ return 0;
+ }
+ tmp++;
+ if (*tmp > '9' || *tmp < '0') {
+ return 0;
+ }
+ }
+
+ /* possibly a numeric index */
+ end = key + length;
+
+ if ((*end != '\0') /* not a null terminated string */
+ || (*tmp == '0' && length > 1) /* numbers with leading zeros */
+ || (end - tmp > MAX_LENGTH_OF_LONG - 1) /* number too long */
+ || (SIZEOF_LONG == 4 &&
+ end - tmp == MAX_LENGTH_OF_LONG - 1 &&
+ *tmp > '2')) { /* overflow */
+ return 0;
+ }
+ *idx = (*tmp - '0');
+ while (1) {
+ ++tmp;
+ if (tmp == end) {
+ if (*key == '-') {
+ if (*idx-1 > LONG_MAX) { /* overflow */
+ return 0;
+ }
+ *idx = 0 - *idx;
+ } else if (*idx > LONG_MAX) { /* overflow */
+ return 0;
+ }
+ return 1;
+ }
+ if (*tmp <= '9' && *tmp >= '0') {
+ *idx = (*idx * 10) + (*tmp - '0');
+ } else {
+ return 0;
+ }
+ }
+}
+
+#define ZEND_HANDLE_NUMERIC_STR(key, length, idx) \
+ _zend_handle_numeric_str(key, length, &idx)
+
+#define ZEND_HANDLE_NUMERIC(key, idx) \
+ _zend_handle_numeric_str((key)->val, (key)->len, &idx)
static inline zval *zend_hash_find_ind(const HashTable *ht, zend_string *key)
@@ -307,92 +322,157 @@ static inline zval *zend_hash_str_find_ind(const HashTable *ht, const char *str,
static inline zval *zend_symtable_update(HashTable *ht, zend_string *key, zval *pData)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_update(ht, idx, pData));
- return zend_hash_update(ht, key, pData);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_update(ht, idx, pData);
+ } else {
+ return zend_hash_update(ht, key, pData);
+ }
}
static inline zval *zend_symtable_update_ind(HashTable *ht, zend_string *key, zval *pData)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_update(ht, idx, pData));
- return zend_hash_update_ind(ht, key, pData);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_update(ht, idx, pData);
+ } else {
+ return zend_hash_update_ind(ht, key, pData);
+ }
}
static inline int zend_symtable_del(HashTable *ht, zend_string *key)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_del(ht, idx));
- return zend_hash_del(ht, key);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_del(ht, idx);
+ } else {
+ return zend_hash_del(ht, key);
+ }
}
static inline int zend_symtable_del_ind(HashTable *ht, zend_string *key)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_del(ht, idx));
- return zend_hash_del_ind(ht, key);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_del(ht, idx);
+ } else {
+ return zend_hash_del_ind(ht, key);
+ }
}
static inline zval *zend_symtable_find(const HashTable *ht, zend_string *key)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_find(ht, idx));
- return zend_hash_find(ht, key);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_find(ht, idx);
+ } else {
+ return zend_hash_find(ht, key);
+ }
}
static inline zval *zend_symtable_find_ind(const HashTable *ht, zend_string *key)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_find(ht, idx));
- return zend_hash_find_ind(ht, key);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_find(ht, idx);
+ } else {
+ return zend_hash_find_ind(ht, key);
+ }
}
static inline int zend_symtable_exists(HashTable *ht, zend_string *key)
{
- ZEND_HANDLE_NUMERIC(key->val, key->len+1, zend_hash_index_exists(ht, idx));
- return zend_hash_exists(ht, key);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC(key, idx)) {
+ return zend_hash_index_exists(ht, idx);
+ } else {
+ return zend_hash_exists(ht, key);
+ }
}
static inline zval *zend_symtable_str_update(HashTable *ht, const char *str, int len, zval *pData)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_update(ht, idx, pData));
- return zend_hash_str_update(ht, str, len, pData);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_update(ht, idx, pData);
+ } else {
+ return zend_hash_str_update(ht, str, len, pData);
+ }
}
static inline zval *zend_symtable_str_update_ind(HashTable *ht, const char *str, int len, zval *pData)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_update(ht, idx, pData));
- return zend_hash_str_update_ind(ht, str, len, pData);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_update(ht, idx, pData);
+ } else {
+ return zend_hash_str_update_ind(ht, str, len, pData);
+ }
}
static inline int zend_symtable_str_del(HashTable *ht, const char *str, int len)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_del(ht, idx));
- return zend_hash_str_del(ht, str, len);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_del(ht, idx);
+ } else {
+ return zend_hash_str_del(ht, str, len);
+ }
}
static inline int zend_symtable_str_del_ind(HashTable *ht, const char *str, int len)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_del(ht, idx));
- return zend_hash_str_del_ind(ht, str, len);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_del(ht, idx);
+ } else {
+ return zend_hash_str_del_ind(ht, str, len);
+ }
}
static inline zval *zend_symtable_str_find(HashTable *ht, const char *str, int len)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_find(ht, idx));
- return zend_hash_str_find(ht, str, len);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_find(ht, idx);
+ } else {
+ return zend_hash_str_find(ht, str, len);
+ }
}
static inline int zend_symtable_str_exists(HashTable *ht, const char *str, int len)
{
- ZEND_HANDLE_NUMERIC(str, len+1, zend_hash_index_exists(ht, idx));
- return zend_hash_str_exists(ht, str, len);
+ ulong idx;
+
+ if (ZEND_HANDLE_NUMERIC_STR(str, len, idx)) {
+ return zend_hash_index_exists(ht, idx);
+ } else {
+ return zend_hash_str_exists(ht, str, len);
+ }
}
static inline void *zend_hash_add_ptr(HashTable *ht, zend_string *key, void *pData)
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 3329b14949..4f87f5b375 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -3770,7 +3770,9 @@ ZEND_VM_C_LABEL(num_index):
case IS_STRING:
str = Z_STR_P(offset);
if (OP2_TYPE != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, ZEND_VM_C_GOTO(num_index));
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ ZEND_VM_C_GOTO(num_index);
+ }
}
ZEND_VM_C_LABEL(str_index):
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -4141,7 +4143,9 @@ ZEND_VM_C_LABEL(num_index_dim):
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (OP2_TYPE != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, ZEND_VM_C_GOTO(numeric_index_dim));
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ ZEND_VM_C_GOTO(numeric_index_dim);
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -4664,7 +4668,9 @@ ZEND_VM_C_LABEL(num_index_prop):
case IS_STRING:
str = Z_STR_P(offset);
if (OP2_TYPE != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, ZEND_VM_C_GOTO(num_index_prop));
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ ZEND_VM_C_GOTO(num_index_prop);
+ }
}
ZEND_VM_C_LABEL(str_index_prop):
value = zend_hash_find_ind(ht, str);
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 316011fef8..4a66c7390d 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -4027,7 +4027,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -4895,7 +4897,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -5727,7 +5731,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -6402,7 +6408,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_UNUSED != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -7292,7 +7300,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -9114,7 +9124,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -9949,7 +9961,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -10781,7 +10795,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -11342,7 +11358,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_UNUSED != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -12159,7 +12177,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -15548,7 +15568,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -15718,7 +15740,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -15923,7 +15947,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -17684,7 +17710,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -17782,7 +17810,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -17908,7 +17938,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -19883,7 +19915,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -20053,7 +20087,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -20258,7 +20294,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -21336,7 +21374,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_UNUSED != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -23259,7 +23299,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -23357,7 +23399,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -23483,7 +23527,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -24815,7 +24861,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -24941,7 +24989,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -26097,7 +26147,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -26223,7 +26275,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -27381,7 +27435,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -27507,7 +27563,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -29180,7 +29238,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -29306,7 +29366,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -32348,7 +32410,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -32518,7 +32582,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -32723,7 +32789,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CONST != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -34367,7 +34435,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -34465,7 +34535,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -34591,7 +34663,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_TMP_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -36448,7 +36522,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -36618,7 +36694,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -36823,7 +36901,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_VAR != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
@@ -37785,7 +37865,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_UNUSED != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -39572,7 +39654,9 @@ num_index:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index;
+ }
}
str_index:
zend_hash_update(Z_ARRVAL_P(EX_VAR(opline->result.var)), str, expr_ptr);
@@ -39670,7 +39754,9 @@ num_index_dim:
if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
}
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto numeric_index_dim);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
+ goto numeric_index_dim;
+ }
}
if (ht == &EG(symbol_table).ht) {
zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
@@ -39796,7 +39882,9 @@ num_index_prop:
case IS_STRING:
str = Z_STR_P(offset);
if (IS_CV != IS_CONST) {
- ZEND_HANDLE_NUMERIC_EX(str->val, str->len+1, hval, goto num_index_prop);
+ if (ZEND_HANDLE_NUMERIC(str, hval)) {
+ goto num_index_prop;
+ }
}
str_index_prop:
value = zend_hash_find_ind(ht, str);
diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c
index 0c68cc14d5..657a3f4b52 100644
--- a/ext/opcache/Optimizer/zend_optimizer.c
+++ b/ext/opcache/Optimizer/zend_optimizer.c
@@ -297,10 +297,8 @@ static void update_op2_const(zend_op_array *op_array,
check_numeric:
{
ulong index;
- int numeric = 0;
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(val), Z_STRLEN_P(val)+1, index, numeric = 1);
- if (numeric) {
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(val), index)) {
zval_dtor(val);
ZVAL_LONG(val, index);
op_array->literals[opline->op2.constant] = *val;
diff --git a/ext/spl/spl_engine.c b/ext/spl/spl_engine.c
index a2f3653432..0cfcb8ee18 100644
--- a/ext/spl/spl_engine.c
+++ b/ext/spl/spl_engine.c
@@ -42,9 +42,13 @@ PHPAPI void spl_instantiate(zend_class_entry *pce, zval *object TSRMLS_DC)
PHPAPI long spl_offset_convert_to_long(zval *offset TSRMLS_DC) /* {{{ */
{
+ ulong idx;
+
switch (Z_TYPE_P(offset)) {
case IS_STRING:
- ZEND_HANDLE_NUMERIC(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, idx);
+ if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), idx)) {
+ return idx;
+ }
break;
case IS_DOUBLE:
return (long)Z_DVAL_P(offset);