From cb0d2775fbbf442a7930bbd69f1136469d6d3337 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Thu, 21 Jun 2001 14:53:05 +0000 Subject: [PATCH] parent::methodname() now works better with runtime classes (fix bug #11589) --- Zend/zend_compile.c | 14 ++++++++++---- Zend/zend_execute.c | 7 +------ Zend/zend_globals.h | 1 + 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5c101d97c1..2dd01cb0b4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -74,6 +74,7 @@ void zend_init_compiler_data_structures(CLS_D) zend_stack_init(&CG(object_stack)); zend_stack_init(&CG(declare_stack)); CG(active_class_entry) = NULL; + CG(active_ce_parent_class_name).value.str.val = NULL; zend_llist_init(&CG(list_llist), sizeof(list_llist_element), NULL, 0); zend_llist_init(&CG(dimension_llist), sizeof(int), NULL, 0); CG(handle_op_arrays) = 1; @@ -883,11 +884,10 @@ void zend_do_begin_class_member_function_call(znode *class_name, znode *function zend_str_tolower(class_name->u.constant.value.str.val, class_name->u.constant.value.str.len); if ((class_name->u.constant.value.str.len == sizeof("parent")-1) && !memcmp(class_name->u.constant.value.str.val, "parent", sizeof("parent")-1) - && CG(active_class_entry) - && CG(active_class_entry)->parent) { + && CG(active_ce_parent_class_name).value.str.val) { efree(class_name->u.constant.value.str.val); - class_name->u.constant.value.str.len = CG(active_class_entry)->parent->name_length; - class_name->u.constant.value.str.val = estrndup(CG(active_class_entry)->parent->name, class_name->u.constant.value.str.len); + class_name->u.constant.value.str.len = CG(active_ce_parent_class_name).value.str.len; + class_name->u.constant.value.str.val = estrndup(CG(active_ce_parent_class_name).value.str.val, class_name->u.constant.value.str.len); } opline->op1 = *class_name; opline->op2 = *function_name; @@ -1547,6 +1547,8 @@ void zend_do_begin_class_declaration(znode *class_name, znode *parent_class_name zval *tmp; zend_str_tolower(parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len); + 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); + CG(active_ce_parent_class_name).value.str.len = parent_class_name->u.constant.value.str.len; 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) { /* copy functions */ @@ -1605,6 +1607,10 @@ void zend_do_end_class_declaration(CLS_D) { do_inherit_parent_constructor(CG(active_class_entry)); CG(active_class_entry) = NULL; + if (CG(active_ce_parent_class_name).value.str.val) { + efree(CG(active_ce_parent_class_name).value.str.val); + CG(active_ce_parent_class_name).value.str.val = NULL; + } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 74f6711748..e3a7066879 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1419,12 +1419,7 @@ binary_assign_op_addr: { object.ptr->refcount++; /* For this pointer */ } 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 */ - /* test for parent:: special case - if it doesn't exist - error out */ - if (opline->op1.u.constant.value.str.len!=(sizeof("parent")-1) - || memcmp(opline->op1.u.constant.value.str.val, "parent", sizeof("parent")-1)!=0 - || !(ce = object.ptr->value.obj.ce->parent)) { - zend_error(E_ERROR, "Undefined class name '%s'", opline->op1.u.constant.value.str.val); - } + zend_error(E_ERROR, "Undefined class name '%s'", opline->op1.u.constant.value.str.val); } active_function_table = &ce->function_table; } else { /* used for member function calls */ diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index cd4f20e3f2..e6a6a03b66 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -73,6 +73,7 @@ struct _zend_compiler_globals { zend_stack declare_stack; zend_class_entry class_entry, *active_class_entry; + zval active_ce_parent_class_name; /* variables for list() compilation */ zend_llist list_llist; -- 2.40.0