summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2001-06-21 14:53:05 +0000
committerZeev Suraski <zeev@php.net>2001-06-21 14:53:05 +0000
commitcb0d2775fbbf442a7930bbd69f1136469d6d3337 (patch)
treefbbdf5db43ff34d02b6138ffb7a3b316e19b879d
parent8332ab409ad8c6e099e15c3cd2badfe0ae7317f8 (diff)
downloadphp-git-cb0d2775fbbf442a7930bbd69f1136469d6d3337.tar.gz
parent::methodname() now works better with runtime classes (fix bug #11589)
-rw-r--r--Zend/zend_compile.c14
-rw-r--r--Zend/zend_execute.c7
-rw-r--r--Zend/zend_globals.h1
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;