diff options
author | Nikita Popov <nikic@php.net> | 2015-11-06 23:00:39 +0100 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-11-07 12:04:51 +0100 |
commit | 632bee4abbcca0f3ab6ec2b15c87fb946b6d7129 (patch) | |
tree | 45aacc369fc6b48aa3e98de8fee6b992a89d1d6c | |
parent | c263dcee2ff727946b66380b6374f5d753bd8d36 (diff) | |
download | php-git-632bee4abbcca0f3ab6ec2b15c87fb946b6d7129.tar.gz |
Fix update_opX_const lowercasing
It was lowering in-place.
-rw-r--r-- | Zend/tests/varSyntax/static_prop_on_expr_class.phpt | 13 | ||||
-rw-r--r-- | ext/opcache/Optimizer/zend_optimizer.c | 23 |
2 files changed, 24 insertions, 12 deletions
diff --git a/Zend/tests/varSyntax/static_prop_on_expr_class.phpt b/Zend/tests/varSyntax/static_prop_on_expr_class.phpt new file mode 100644 index 0000000000..d17b6cdb0b --- /dev/null +++ b/Zend/tests/varSyntax/static_prop_on_expr_class.phpt @@ -0,0 +1,13 @@ +--TEST-- +Accessing a static property on a statically evaluable class expression +--FILE-- +<?php + +class A { + public static $b = 42; +} +var_dump(('A' . (string) '')::$b); + +?> +--EXPECT-- +int(42) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 22bb806a4c..1f5e4f1bf6 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -110,6 +110,13 @@ int zend_optimizer_add_literal(zend_op_array *op_array, zval *zv) return i; } +static inline int zend_optimizer_add_literal_string(zend_op_array *op_array, zend_string *str) { + zval zv; + ZVAL_STR(&zv, str); + zend_string_hash_val(str); + return zend_optimizer_add_literal(op_array, &zv); +} + int zend_optimizer_is_disabled_func(const char *name, size_t len) { zend_function *fbc = (zend_function *)zend_hash_str_find_ptr(EG(function_table), name, len); @@ -137,9 +144,7 @@ void zend_optimizer_update_op1_const(zend_op_array *op_array, zend_string_hash_val(Z_STR(ZEND_OP1_LITERAL(opline))); Z_CACHE_SLOT(op_array->literals[opline->op1.constant]) = op_array->cache_size; op_array->cache_size += sizeof(void*); - zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); - zend_optimizer_add_literal(op_array, val); - zend_string_hash_val(Z_STR(op_array->literals[opline->op1.constant+1])); + zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; default: opline->op1.constant = zend_optimizer_add_literal(op_array, val); @@ -195,23 +200,17 @@ void zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_INSTANCEOF: Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = op_array->cache_size; op_array->cache_size += sizeof(void*); - zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); - zend_optimizer_add_literal(op_array, val); - zend_string_hash_val(Z_STR(op_array->literals[opline->op2.constant+1])); + zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; case ZEND_INIT_DYNAMIC_CALL: opline->opcode = ZEND_INIT_FCALL_BY_NAME; Z_CACHE_SLOT(op_array->literals[opline->op2.constant]) = op_array->cache_size; op_array->cache_size += sizeof(void*); - zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); - zend_optimizer_add_literal(op_array, val); - zend_string_hash_val(Z_STR(op_array->literals[opline->op2.constant+1])); + zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; case ZEND_INIT_METHOD_CALL: case ZEND_INIT_STATIC_METHOD_CALL: - zend_str_tolower(Z_STRVAL_P(val), Z_STRLEN_P(val)); - zend_optimizer_add_literal(op_array, val); - zend_string_hash_val(Z_STR(op_array->literals[opline->op2.constant+1])); + zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); /* break missing intentionally */ /*case ZEND_FETCH_CONSTANT:*/ case ZEND_ASSIGN_OBJ: |