]> granicus.if.org Git - php/commitdiff
Keep lowercased parent class name as second argument of DECLARE_CLASS to avoid extra...
authorDmitry Stogov <dmitry@zend.com>
Tue, 25 Jun 2019 08:26:29 +0000 (11:26 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 25 Jun 2019 08:30:58 +0000 (11:30 +0300)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_inheritance.c
Zend/zend_inheritance.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/opcache/Optimizer/compact_literals.c
ext/opcache/ZendAccelerator.c

index cb9419c7b8a0b7b2c7909f085485cbe3f7402b15..20501176487c21f192641f1d1a84e07abf0ea74b 100644 (file)
@@ -1057,7 +1057,7 @@ ZEND_API int do_bind_function(zval *lcname) /* {{{ */
 }
 /* }}} */
 
-ZEND_API int do_bind_class(zval *lcname) /* {{{ */
+ZEND_API int do_bind_class(zval *lcname, zend_string *lc_parent_name) /* {{{ */
 {
        zend_class_entry *ce;
        zval *rtd_key, *zv;
@@ -1084,7 +1084,7 @@ ZEND_API int do_bind_class(zval *lcname) /* {{{ */
                return FAILURE;
        }
 
-       zend_do_link_class(ce);
+       zend_do_link_class(ce, lc_parent_name);
        return SUCCESS;
 }
 /* }}} */
@@ -1151,9 +1151,11 @@ ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array, uint3
                        const zend_op *opline = &op_array->opcodes[opline_num];
                        zval *lcname = RT_CONSTANT(opline, opline->op1);
                        zend_class_entry *ce = zend_hash_find_ptr(EG(class_table), Z_STR_P(lcname + 1));
-                       zend_class_entry *parent_ce = zend_lookup_class(ce->parent_name);
+                       zend_string *lc_parent_name = Z_STR_P(RT_CONSTANT(opline, opline->op2));
+                       zend_class_entry *parent_ce = zend_lookup_class_ex(ce->parent_name, lc_parent_name, 0);
+
                        if (ce && parent_ce && zend_can_early_bind(ce, parent_ce)) {
-                               do_bind_class(lcname);
+                               do_bind_class(lcname, lc_parent_name);
                        }
                        opline_num = op_array->opcodes[opline_num].result.opline_num;
                }
@@ -6458,6 +6460,13 @@ zend_op *zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */
 
        opline = get_next_op();
 
+       if (ce->parent_name) {
+               /* Lowercased parent name */
+               zend_string *lc_parent_name = zend_string_tolower(ce->parent_name);
+               opline->op2_type = IS_CONST;
+               LITERAL_STR(opline->op2, lc_parent_name);
+       }
+
        opline->op1_type = IS_CONST;
        LITERAL_STR(opline->op1, lcname);
 
index cfefe9ce31010237a1a008e989f4d977ceff45c0..6721612b4cf54431ae63645dcd3ab4af06420f22 100644 (file)
@@ -751,7 +751,7 @@ zend_bool zend_handle_encoding_declaration(zend_ast *ast);
 void zend_do_free(znode *op1);
 
 ZEND_API int do_bind_function(zval *lcname);
-ZEND_API int do_bind_class(zval *lcname);
+ZEND_API int do_bind_class(zval *lcname, zend_string *lc_parent_name);
 ZEND_API uint32_t zend_build_delayed_early_binding_list(const zend_op_array *op_array);
 ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array, uint32_t first_early_binding_opline);
 
index e62d990c18ae1815ec407c0f01d08541e58337a9..e107e8517746273cb559bcbcff497f874e299156 100644 (file)
@@ -2362,11 +2362,11 @@ static void report_variance_errors(zend_class_entry *ce) {
        zend_hash_index_del(all_obligations, num_key);
 }
 
-ZEND_API void zend_do_link_class(zend_class_entry *ce) /* {{{ */
+ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name) /* {{{ */
 {
        if (ce->parent_name) {
                zend_class_entry *parent = zend_fetch_class_by_name(
-                       ce->parent_name, NULL, ZEND_FETCH_CLASS_ALLOW_UNLINKED);
+                       ce->parent_name, lc_parent_name, ZEND_FETCH_CLASS_ALLOW_UNLINKED);
                if (!(parent->ce_flags & ZEND_ACC_LINKED)) {
                        add_dependency_obligation(ce, parent);
                }
index e2e37b82529bbf669847b564d135543eb6649b49..2ce6dec7d187b07f8c3c7f23c87970106935f7ff 100644 (file)
@@ -27,7 +27,7 @@ BEGIN_EXTERN_C()
 ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface);
 ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce);
 
-ZEND_API void zend_do_link_class(zend_class_entry *ce);
+ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_string *lc_parent_name);
 
 void zend_verify_abstract_class(zend_class_entry *ce);
 void zend_check_deprecated_constructor(const zend_class_entry *ce);
index 3508cba5dd0b84b91c667f3810494d2432b02728..bd14092fb314cdd547b4ad62e9851b6944ad69ba 100644 (file)
@@ -7030,7 +7030,7 @@ ZEND_VM_HANDLER(139, ZEND_DECLARE_CLASS, CONST, ANY)
        USE_OPLINE
 
        SAVE_OPLINE();
-       do_bind_class(RT_CONSTANT(opline, opline->op1));
+       do_bind_class(RT_CONSTANT(opline, opline->op1), (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -7043,7 +7043,7 @@ ZEND_VM_HANDLER(145, ZEND_DECLARE_CLASS_DELAYED, CONST, ANY)
        if ((zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1)) == NULL ||
            ((orig_zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)+1), 1)) != NULL &&
             Z_CE_P(zce) != Z_CE_P(orig_zce))) {
-               do_bind_class(RT_CONSTANT(opline, opline->op1));
+               do_bind_class(RT_CONSTANT(opline, opline->op1), (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
@@ -7064,7 +7064,7 @@ ZEND_VM_HANDLER(171, ZEND_DECLARE_ANON_CLASS, ANY, ANY, JMP_ADDR)
                ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
                ZEND_VM_CONTINUE();
        }
-       zend_do_link_class(ce);
+       zend_do_link_class(ce, (OP2_TYPE == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
index b5e63d394f7530d996a3cf9fd3b0d04528a34896..4f7aa5dc076338fea0adc791f5e0a2d95681d707 100644 (file)
@@ -2111,7 +2111,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_ANON_CLASS_SPEC_HANDLE
                ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value);
                ZEND_VM_CONTINUE();
        }
-       zend_do_link_class(ce);
+       zend_do_link_class(ce, (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -4022,7 +4022,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_SPEC_CONST_HANDL
        USE_OPLINE
 
        SAVE_OPLINE();
-       do_bind_class(RT_CONSTANT(opline, opline->op1));
+       do_bind_class(RT_CONSTANT(opline, opline->op1), (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
 
@@ -4035,7 +4035,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DECLARE_CLASS_DELAYED_SPEC_CON
        if ((zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)), 1)) == NULL ||
            ((orig_zce = zend_hash_find_ex(EG(class_table), Z_STR_P(RT_CONSTANT(opline, opline->op1)+1), 1)) != NULL &&
             Z_CE_P(zce) != Z_CE_P(orig_zce))) {
-               do_bind_class(RT_CONSTANT(opline, opline->op1));
+               do_bind_class(RT_CONSTANT(opline, opline->op1), (opline->op2_type == IS_CONST) ? Z_STR_P(RT_CONSTANT(opline, opline->op2)) : NULL);
        }
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
 }
index ad5497f8d40f0d70ea8c9fe7fd5f97e0ec309630..e5ba87d98939c5fd59103c3433b13f78f9995dee 100644 (file)
@@ -270,9 +270,14 @@ literals_handle_static_prop:
                                        LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
                                        break;
                                case ZEND_DECLARE_FUNCTION:
+                                       LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 2);
+                                       break;
                                case ZEND_DECLARE_CLASS:
                                case ZEND_DECLARE_CLASS_DELAYED:
                                        LITERAL_INFO(opline->op1.constant, LITERAL_VALUE, 2);
+                                       if (opline->op2_type == IS_CONST) {
+                                               LITERAL_INFO(opline->op2.constant, LITERAL_VALUE, 1);
+                                       }
                                        break;
                                case ZEND_ISSET_ISEMPTY_DIM_OBJ:
                                case ZEND_ASSIGN_DIM:
index 60e44c6508cf5db01eeafe0ca4a84689ad62b91a..86b6d5ce7c3052e695231225c78bf39e28308f2a 100644 (file)
@@ -3582,7 +3582,7 @@ static void preload_link(void)
                                        } else {
                                                CG(zend_lineno) = ce->info.user.line_start;
                                        }
-                                       zend_do_link_class(ce);
+                                       zend_do_link_class(ce, NULL);
                                        CG(in_compilation) = 0;
                                        CG(compiled_filename) = NULL;