]> granicus.if.org Git - php/commitdiff
Drop addition of weird \ prefix for FQ consts
authorNikita Popov <nikic@php.net>
Sat, 28 Jun 2014 16:22:51 +0000 (18:22 +0200)
committerNikita Popov <nikic@php.net>
Sat, 28 Jun 2014 16:24:59 +0000 (18:24 +0200)
Also fixes a resolution bug

Zend/tests/use_const/no_global_fallback.phpt
Zend/zend_compile.c
Zend/zend_language_parser.y

index a128f353edb6d4dbe6cf5035eacfac4ffd1c405b..64e2a154cea303433180caf1afb75d50c3739b50 100644 (file)
@@ -10,5 +10,4 @@ var_dump(baz);
 
 ?>
 --EXPECTF--
-Notice: Use of undefined constant baz - assumed 'baz' in %s on line %d
-string(3) "baz"
+Fatal error: Undefined constant 'foo\bar\baz' in %s on line %d
index b9cfb3055ab7a9c8fa46542da008f8f9589f075d..bf02734e4f5ffe2e99a4956e4277b1cc9cf34d8a 100644 (file)
@@ -7404,7 +7404,6 @@ void zend_compile_const(znode *result, zend_ast *ast TSRMLS_DC) {
        zend_ast *name_ast = ast->child[0];
        zend_bool check_namespace = name_ast->attr;
 
-       zend_bool is_compound = zend_is_compound_name(zend_ast_get_zval(name_ast));
        znode name_node;
        zend_op *opline;
 
@@ -7418,8 +7417,7 @@ void zend_compile_const(znode *result, zend_ast *ast TSRMLS_DC) {
        opline = emit_op_tmp(result, ZEND_FETCH_CONSTANT, NULL, NULL TSRMLS_CC);
        opline->op2_type = IS_CONST;
 
-       if (is_compound) {
-               /* the name is unambiguous */
+       if (!check_namespace || zend_is_compound_name(zend_ast_get_zval(name_ast))) {
                opline->op2.constant = zend_add_const_name_literal(
                        CG(active_op_array), &name_node.u.constant, 0 TSRMLS_CC);
        } else {
@@ -7610,13 +7608,10 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
        zend_ast *ast = *ast_ptr;
        zend_ast *const_name_ast = ast->child[0];
        zend_bool check_namespace = const_name_ast->attr;
-       zend_bool is_compound;
 
        znode const_name, result;
        zend_compile_expr(&const_name, const_name_ast TSRMLS_CC);
 
-       is_compound = zend_is_compound_name(&const_name.u.constant);
-
        if (zend_constant_ct_subst(&result, &const_name.u.constant, 0 TSRMLS_CC)) {
                zend_ast_destroy(ast);
                *ast_ptr = zend_ast_create_zval(&result.u.constant);
@@ -7630,7 +7625,7 @@ void zend_compile_const_expr_const(zend_ast **ast_ptr TSRMLS_DC) {
        if (IS_INTERNED(Z_STR(result.u.constant))) {
                Z_TYPE_FLAGS(result.u.constant) &= ~ (IS_TYPE_REFCOUNTED | IS_TYPE_COPYABLE);
        }
-       if (!is_compound) {
+       if (check_namespace && !zend_is_compound_name(zend_ast_get_zval(const_name_ast))) {
                Z_CONST_FLAGS(result.u.constant) = IS_CONSTANT_UNQUALIFIED;
        }
 
index 4fed735826ba36bb7999fc238bf98d0d288e9080..eeffcf610eae2fb506478836769c96c2fba93058 100644 (file)
@@ -995,10 +995,7 @@ scalar:
                          zend_do_build_namespace_name(&$1, &$1, &$3 TSRMLS_CC);
                          $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$1)); }
        |       T_NS_SEPARATOR namespace_name
-                       { zval tmp; ZVAL_NEW_STR(&tmp, STR_ALLOC(Z_STRLEN($2.u.constant)+1, 0)); Z_STRVAL(tmp)[0] = '\\'; memcpy(Z_STRVAL(tmp) + 1, Z_STRVAL($2.u.constant), Z_STRLEN($2.u.constant)+1);
-                         if (Z_DELREF($2.u.constant) == 0) { efree(Z_STR($2.u.constant)); }
-                         Z_STR($2.u.constant) = Z_STR(tmp);
-                         $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$2)); }
+                       { $$.u.ast = zend_ast_create_unary(ZEND_AST_CONST, AST_ZVAL(&$2)); }
 ;