]> granicus.if.org Git - php/commitdiff
Fix update_opX_const lowercasing
authorNikita Popov <nikic@php.net>
Fri, 6 Nov 2015 22:00:39 +0000 (23:00 +0100)
committerNikita Popov <nikic@php.net>
Sat, 7 Nov 2015 11:04:51 +0000 (12:04 +0100)
It was lowering in-place.

Zend/tests/varSyntax/static_prop_on_expr_class.phpt [new file with mode: 0644]
ext/opcache/Optimizer/zend_optimizer.c

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 (file)
index 0000000..d17b6cd
--- /dev/null
@@ -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)
index 22bb806a4cf2068d38fc305d3ad01979aeb05a55..1f5e4f1bf6115f9c8741b76791e475eb7e0601da 100644 (file)
@@ -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: