diff options
Diffstat (limited to 'Zend/zend_execute.c')
| -rw-r--r-- | Zend/zend_execute.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e2de52c777..bdc0e2e8db 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1225,7 +1225,7 @@ static void zend_fetch_dimension_address_read(zval *result, zval *container, zva zval tmp; zend_string *str; - if (Z_TYPE_P(dim) != IS_LONG) { + if (UNEXPECTED(Z_TYPE_P(dim) != IS_LONG)) { switch(Z_TYPE_P(dim)) { /* case IS_LONG: */ case IS_STRING: @@ -1253,13 +1253,19 @@ static void zend_fetch_dimension_address_read(zval *result, zval *container, zva dim = &tmp; } - if (Z_LVAL_P(dim) < 0 || Z_STRLEN_P(container) <= Z_LVAL_P(dim)) { + if (UNEXPECTED(Z_LVAL_P(dim) < 0) || UNEXPECTED(Z_STRLEN_P(container) <= Z_LVAL_P(dim))) { if (type != BP_VAR_IS) { zend_error(E_NOTICE, "Uninitialized string offset: %ld", Z_LVAL_P(dim)); } str = STR_EMPTY_ALLOC(); } else { - str = STR_INIT(Z_STRVAL_P(container) + Z_LVAL_P(dim), 1, 0); + zend_uchar c = (zend_uchar)Z_STRVAL_P(container)[Z_LVAL_P(dim)]; + + if (CG(one_char_string)[c]) { + str = CG(one_char_string)[c]; + } else { + str = STR_INIT(Z_STRVAL_P(container) + Z_LVAL_P(dim), 1, 0); + } } ZVAL_STR(result, str); return; |
