]> granicus.if.org Git - php/commitdiff
Resolve parent::class at compile-time if possible
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 4 Jan 2019 11:10:22 +0000 (12:10 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 4 Jan 2019 11:10:22 +0000 (12:10 +0100)
And remove some dead code.

Zend/zend_compile.c

index 08c9d970424fe9fc20092cbf9a788b57fbe27184..c5c9f1f475432275efd5bf2acb5f2a4023d0dfd1 100644 (file)
@@ -1390,8 +1390,14 @@ static zend_bool zend_try_compile_const_expr_resolve_class_name(zval *zv, zend_a
                                return 1;
                        }
                        return 0;
-               case ZEND_FETCH_CLASS_STATIC:
                case ZEND_FETCH_CLASS_PARENT:
+                       if (CG(active_class_entry) && CG(active_class_entry)->parent_name
+                                       && zend_is_scope_known()) {
+                               ZVAL_STR_COPY(zv, CG(active_class_entry)->parent_name);
+                               return 1;
+                       }
+                       return 0;
+               case ZEND_FETCH_CLASS_STATIC:
                        return 0;
                case ZEND_FETCH_CLASS_DEFAULT:
                        ZVAL_STR(zv, zend_resolve_class_name_ast(class_ast));
@@ -7722,38 +7728,6 @@ void zend_compile_class_name(znode *result, zend_ast *ast) /* {{{ */
 }
 /* }}} */
 
-void zend_compile_resolve_class_name(znode *result, zend_ast *ast) /* {{{ */
-{
-       zend_ast *name_ast = ast->child[0];
-       uint32_t fetch_type = zend_get_class_fetch_type(zend_ast_get_str(name_ast));
-       zend_ensure_valid_class_fetch_type(fetch_type);
-
-       switch (fetch_type) {
-               case ZEND_FETCH_CLASS_SELF:
-                       if (CG(active_class_entry) && zend_is_scope_known()) {
-                               result->op_type = IS_CONST;
-                               ZVAL_STR_COPY(&result->u.constant, CG(active_class_entry)->name);
-                       } else {
-                               zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
-                               opline->op1.num = fetch_type;
-                       }
-                       break;
-               case ZEND_FETCH_CLASS_STATIC:
-               case ZEND_FETCH_CLASS_PARENT:
-                       {
-                               zend_op *opline = zend_emit_op_tmp(result, ZEND_FETCH_CLASS_NAME, NULL, NULL);
-                               opline->op1.num = fetch_type;
-                       }
-                       break;
-               case ZEND_FETCH_CLASS_DEFAULT:
-                       result->op_type = IS_CONST;
-                       ZVAL_STR(&result->u.constant, zend_resolve_class_name_ast(name_ast));
-                       break;
-               EMPTY_SWITCH_DEFAULT_CASE()
-       }
-}
-/* }}} */
-
 static zend_op *zend_compile_rope_add(znode *result, uint32_t num, znode *elem_node) /* {{{ */
 {
        zend_op *opline = get_next_op();