diff --git a/Zend/tests/eval_constant_resolution.phpt b/Zend/tests/eval_constant_resolution.phpt new file mode 100644 index 0000000000000..d302d50a2c05c --- /dev/null +++ b/Zend/tests/eval_constant_resolution.phpt @@ -0,0 +1,23 @@ +--TEST-- +eval() constant resolution +--FILE-- + +--EXPECT-- +In eval +bool(true) +bool(true) +string(4) "test" +bool(true) +Outside eval +bool(true) +bool(true) +string(4) "test" +bool(true) \ No newline at end of file diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 7eb2bffbcaf4a..99195793baf94 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1475,28 +1475,26 @@ static bool can_ct_eval_const(zend_constant *c) { static bool zend_try_ct_eval_const(zval *zv, zend_string *name, bool is_fully_qualified) /* {{{ */ { - zend_constant *c = zend_hash_find_ptr(EG(zend_constants), name); + /* Substitute true, false and null (including unqualified usage in namespaces) + * before looking up the possibly namespaced name. */ + const char *lookup_name = ZSTR_VAL(name); + size_t lookup_len = ZSTR_LEN(name); + + if (!is_fully_qualified) { + zend_get_unqualified_name(name, &lookup_name, &lookup_len); + } + + zend_constant *c; + if ((c = zend_get_special_const(lookup_name, lookup_len))) { + ZVAL_COPY_VALUE(zv, &c->value); + return 1; + } + c = zend_hash_find_ptr(EG(zend_constants), name); if (c && can_ct_eval_const(c)) { ZVAL_COPY_OR_DUP(zv, &c->value); return 1; } - - { - /* Substitute true, false and null (including unqualified usage in namespaces) */ - const char *lookup_name = ZSTR_VAL(name); - size_t lookup_len = ZSTR_LEN(name); - - if (!is_fully_qualified) { - zend_get_unqualified_name(name, &lookup_name, &lookup_len); - } - - if ((c = zend_get_special_const(lookup_name, lookup_len))) { - ZVAL_COPY_VALUE(zv, &c->value); - return 1; - } - - return 0; - } + return 0; } /* }}} */