Skip to content

Commit cb0d277

Browse files
committed
parent::methodname() now works better with runtime classes (fix bug php#11589)
1 parent 8332ab4 commit cb0d277

File tree

3 files changed

+12
-10
lines changed

3 files changed

+12
-10
lines changed

Zend/zend_compile.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ void zend_init_compiler_data_structures(CLS_D)
7474
zend_stack_init(&CG(object_stack));
7575
zend_stack_init(&CG(declare_stack));
7676
CG(active_class_entry) = NULL;
77+
CG(active_ce_parent_class_name).value.str.val = NULL;
7778
zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0);
7879
zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0);
7980
CG(handle_op_arrays) = 1;
@@ -883,11 +884,10 @@ void zend_do_begin_class_member_function_call(znode *class_name, znode *function
883884
zend_str_tolower(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len);
884885
if ((class_name->u.constant.value.str.len == sizeof("parent")-1)
885886
&& !memcmp(class_name->u.constant.value.str.val, "parent", sizeof("parent")-1)
886-
&& CG(active_class_entry)
887-
&& CG(active_class_entry)->parent) {
887+
&& CG(active_ce_parent_class_name).value.str.val) {
888888
efree(class_name->u.constant.value.str.val);
889-
class_name->u.constant.value.str.len = CG(active_class_entry)->parent->name_length;
890-
class_name->u.constant.value.str.val = estrndup(CG(active_class_entry)->parent->name, class_name->u.constant.value.str.len);
889+
class_name->u.constant.value.str.len = CG(active_ce_parent_class_name).value.str.len;
890+
class_name->u.constant.value.str.val = estrndup(CG(active_ce_parent_class_name).value.str.val, class_name->u.constant.value.str.len);
891891
}
892892
opline->op1 = *class_name;
893893
opline->op2 = *function_name;
@@ -1547,6 +1547,8 @@ void zend_do_begin_class_declaration(znode *class_name, znode *parent_class_name
15471547
zval *tmp;
15481548

15491549
zend_str_tolower(parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len);
1550+
CG(active_ce_parent_class_name).value.str.val = estrndup(parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len);
1551+
CG(active_ce_parent_class_name).value.str.len = parent_class_name->u.constant.value.str.len;
15501552

15511553
if (zend_hash_find(CG(class_table), parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len+1, (void **) &parent_class)==SUCCESS) {
15521554
/* copy functions */
@@ -1605,6 +1607,10 @@ void zend_do_end_class_declaration(CLS_D)
16051607
{
16061608
do_inherit_parent_constructor(CG(active_class_entry));
16071609
CG(active_class_entry) = NULL;
1610+
if (CG(active_ce_parent_class_name).value.str.val) {
1611+
efree(CG(active_ce_parent_class_name).value.str.val);
1612+
CG(active_ce_parent_class_name).value.str.val = NULL;
1613+
}
16081614
}
16091615

16101616

Zend/zend_execute.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1419,12 +1419,7 @@ binary_assign_op_addr: {
14191419
object.ptr->refcount++; /* For this pointer */
14201420
}
14211421
if (zend_hash_find(EG(class_table), opline->op1.u.constant.value.str.val, opline->op1.u.constant.value.str.len+1, (void **) &ce)==FAILURE) { /* class doesn't exist */
1422-
/* test for parent:: special case - if it doesn't exist - error out */
1423-
if (opline->op1.u.constant.value.str.len!=(sizeof("parent")-1)
1424-
|| memcmp(opline->op1.u.constant.value.str.val, "parent", sizeof("parent")-1)!=0
1425-
|| !(ce = object.ptr->value.obj.ce->parent)) {
1426-
zend_error(E_ERROR, "Undefined class name '%s'", opline->op1.u.constant.value.str.val);
1427-
}
1422+
zend_error(E_ERROR, "Undefined class name '%s'", opline->op1.u.constant.value.str.val);
14281423
}
14291424
active_function_table = &ce->function_table;
14301425
} else { /* used for member function calls */

Zend/zend_globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ struct _zend_compiler_globals {
7373
zend_stack declare_stack;
7474

7575
zend_class_entry class_entry, *active_class_entry;
76+
zval active_ce_parent_class_name;
7677

7778
/* variables for list() compilation */
7879
zend_llist list_llist;

0 commit comments

Comments
 (0)