]> granicus.if.org Git - php/commitdiff
- Support parent:: again
authorAndi Gutmans <andi@php.net>
Thu, 27 Dec 2001 13:12:45 +0000 (13:12 +0000)
committerAndi Gutmans <andi@php.net>
Thu, 27 Dec 2001 13:12:45 +0000 (13:12 +0000)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute.c

index 8cdf8cb93a9101f1408f2fe5c7628189a47ddebb..54871f825148ffbb14c673ffdbe5a43873113040 100644 (file)
@@ -961,6 +961,11 @@ void do_fetch_class(znode *result, znode *class_entry, znode *class_name TSRMLS_
                SET_UNUSED(opline->op2);
                opline->extended_value = ZEND_FETCH_CLASS_SELF;
                zval_dtor(&class_name->u.constant);
+       } else if ((class_name->u.constant.value.str.len == (sizeof("parent") - 1)) &&
+               !memcmp(class_name->u.constant.value.str.val, "parent", sizeof("parent"))) {
+               SET_UNUSED(opline->op2);
+               opline->extended_value = ZEND_FETCH_CLASS_PARENT;
+               zval_dtor(&class_name->u.constant);
        } else if ((class_name->u.constant.value.str.len == (sizeof("main") - 1)) &&
                !memcmp(class_name->u.constant.value.str.val, "main", sizeof("main"))) {
                SET_UNUSED(opline->op2);
@@ -999,16 +1004,6 @@ void zend_do_begin_class_member_function_call(znode *class_name, znode *function
        zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
 
        opline->opcode = ZEND_INIT_FCALL_BY_NAME;
-       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)) {
-               if (!CG(active_ce_parent_class_name).value.str.val) {
-                       zend_error(E_COMPILE_ERROR, "No parent class available");
-               }
-               efree(class_name->u.constant.value.str.val);
-               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;
        opline->extended_value = ZEND_MEMBER_FUNC_CALL;
index 6813fa6dd876b5bef83487a25a26298a1ff250b7..739afcd8985ca5afdbb1942437d00c2039905801 100644 (file)
@@ -558,7 +558,9 @@ int zendlex(znode *zendlval TSRMLS_DC);
 /* class fetches */
 #define ZEND_FETCH_CLASS_DEFAULT       0
 #define ZEND_FETCH_CLASS_SELF          1
-#define ZEND_FETCH_CLASS_MAIN          2
+#define ZEND_FETCH_CLASS_PARENT                2
+#define ZEND_FETCH_CLASS_MAIN          3
+
 
 /* variable parsing type (compile-time) */
 #define ZEND_PARSED_MEMBER                     (1<<0)
index cf9c4b42e44f3b20e069dd9bf7f872ac1e32f25b..70196d7dd4096620908eb570e9ad0a1533096e80 100644 (file)
@@ -1503,7 +1503,16 @@ binary_assign_op_addr: {
                                                } else if (EX(opline)->extended_value == ZEND_FETCH_CLASS_MAIN) {
                                                        EX(Ts)[EX(opline)->result.u.var].EA.class_entry = EG(main_class_ptr);
                                                        NEXT_OPCODE();
-                                               }
+                                               } else if (EX(opline)->extended_value == ZEND_FETCH_CLASS_PARENT) {
+                                                       if (!EG(namespace)) {
+                                                               zend_error(E_ERROR, "Cannot fetch parent:: when no class scope is active");
+                                                       }
+                                                       if (!EG(namespace)->parent) {
+                                                               zend_error(E_ERROR, "Cannot fetch parent:: as current class scope has no parent");
+                                                       }
+                                                       EX(Ts)[EX(opline)->result.u.var].EA.class_entry = EG(namespace)->parent;
+                                                       NEXT_OPCODE();
+                                               } 
 
                                                class_name = get_zval_ptr(&EX(opline)->op2, EX(Ts), &EG(free_op2), BP_VAR_R);