Any chance of sneeking this one in :) - patch attached

usage:
<?
class testclass2 extends testclass { }

class testclass {
    function test() {
        echo __CLASS__;
    }
}
testclass2::test();
$t = new testclass2();
$t->test();
?>

prints
testclass2
testclass2

extremely usefull for building mulitiple extendable constructors.

regards
alan


diff -b -B -r -u php-4.2.0RC2/Zend/zend_compile.h ALAN_Zend/zend_compile.h
--- php-4.2.0RC2/Zend/zend_compile.h    Sun Feb 10 20:52:45 2002
+++ ALAN_Zend/zend_compile.h    Fri Apr  5 17:26:04 2002
@@ -81,7 +81,7 @@
 
        zend_uchar *arg_types;          /* MUST be the second element of this struct! 
*/
        char *function_name;                    /* MUST be the third element of this 
struct! */
-
+         char *class_name;       /* set at execute time to record the active class */
        zend_uint *refcount;
 
        zend_op *opcodes;
@@ -114,7 +114,7 @@
 
        zend_uchar *arg_types;          /* MUST be the second element of this struct */
        char *function_name;                    /* MUST be the third element of this 
struct */
-
+        char *class_name;       /* set at execute time to record the active class */
        void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
 } zend_internal_function;
 
@@ -124,7 +124,7 @@
 
        zend_uchar *arg_types;          /* MUST be the second element of this struct */
        char *function_name;            /* MUST be the third element of this struct */
-
+        char *class_name;       /* set at execute time to record the active class */
        zend_uint var;
 } zend_overloaded_function;
 
@@ -135,6 +135,7 @@
                zend_uchar type;  /* never used */
                zend_uchar *arg_types;
                char *function_name;
+                char *class_name;       /* set at execute time to record the active 
+class */
        } common;
        
        zend_op_array op_array;
diff -b -B -r -u php-4.2.0RC2/Zend/zend_execute.c ALAN_Zend/zend_execute.c
--- php-4.2.0RC2/Zend/zend_execute.c    Sun Jan  6 23:21:09 2002
+++ ALAN_Zend/zend_execute.c    Fri Apr  5 17:26:04 2002
@@ -1485,6 +1485,7 @@
                                        zend_function *function;
                                        HashTable *active_function_table;
                                        zval tmp;
+                                        char *class_name=NULL;
 
                                        zend_ptr_stack_n_push(&EG(arg_types_stack), 2, 
EX(fbc), EX(object).ptr);
                                        if (EX(opline)->extended_value & 
ZEND_CTOR_CALL) {
@@ -1521,6 +1522,7 @@
                                                        if 
(zend_hash_find(EG(class_table), EX(opline)->op1.u.constant.value.str.val, 
EX(opline)->op1.u.constant.value.str.len+1, (void **) &ce)==FAILURE) { /* class 
doesn't exist */
                                                                zend_error(E_ERROR, 
"Undefined class name '%s'", EX(opline)->op1.u.constant.value.str.val);
                                                        }
+                                                        class_name =  ce->name;
                                                        active_function_table = 
&ce->function_table;
                                                } else { /* used for member function 
calls */
                                                        EX(object).ptr = 
_get_object_zval_ptr(&EX(opline)->op1, EX(Ts), &EG(free_op1) TSRMLS_CC);
@@ -1564,6 +1566,7 @@
                                                zend_error(E_ERROR, "Call to undefined 
function:  %s()", function_name->value.str.val);
                                        }
                                        zval_dtor(&tmp);
+                                        function->common.class_name = class_name; 
                                        EX(fbc) = function;
 overloaded_function_call_cont:
                                        FREE_OP(EX(Ts), &EX(opline)->op2, 
EG(free_op2));
@@ -1955,11 +1958,29 @@
                                NEXT_OPCODE();
                        case ZEND_FETCH_CONSTANT:
                                if 
(!zend_get_constant(EX(opline)->op1.u.constant.value.str.val, 
EX(opline)->op1.u.constant.value.str.len, &EX(Ts)[EX(opline)->result.u.var].tmp_var 
TSRMLS_CC)) {
+                                       /*if 
+(!strcmp(EX(opline)->op1.u.constant.value.str.val,"__FUNCTION__")) {
+                                                char *function_name = 
+get_active_function_name(TSRMLS_C);
+                                                if (!function_name) function_name ="";
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.val = function_name;
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.len = strlen(function_name);
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.type = IS_STRING;
+                                                
+zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var);
+                                       } else */
+                                       if 
+(!strcmp(EX(opline)->op1.u.constant.value.str.val,"__CLASS__")) {
+                                                char *class_name = 
+get_active_class_name(TSRMLS_C);
+                                                if (!class_name) class_name ="";
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.val = class_name;
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.value.str.len = strlen(class_name);
+                                                
+EX(Ts)[EX(opline)->result.u.var].tmp_var.type = IS_STRING;
+                                                
+zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var);
+                                        } else {
+                                                
                                        zend_error(E_NOTICE, "Use of undefined 
constant %s - assumed '%s'",
                                                                
EX(opline)->op1.u.constant.value.str.val,
                                                                
EX(opline)->op1.u.constant.value.str.val);
                                        EX(Ts)[EX(opline)->result.u.var].tmp_var = 
EX(opline)->op1.u.constant;
                                        
zval_copy_ctor(&EX(Ts)[EX(opline)->result.u.var].tmp_var);
+                                        }
                                }
                                NEXT_OPCODE();
                        case ZEND_INIT_ARRAY:
diff -b -B -r -u php-4.2.0RC2/Zend/zend_execute.h ALAN_Zend/zend_execute.h
--- php-4.2.0RC2/Zend/zend_execute.h    Sun Jan  6 23:21:09 2002
+++ ALAN_Zend/zend_execute.h    Fri Apr  5 17:26:04 2002
@@ -133,6 +133,7 @@
 
 /* services */
 ZEND_API char *get_active_function_name(TSRMLS_D);
+ZEND_API char *get_active_class_name(TSRMLS_D);
 ZEND_API char *zend_get_executed_filename(TSRMLS_D);
 ZEND_API uint zend_get_executed_lineno(TSRMLS_D);
 ZEND_API zend_bool zend_is_executing(TSRMLS_D);
diff -b -B -r -u php-4.2.0RC2/Zend/zend_execute_API.c ALAN_Zend/zend_execute_API.c
--- php-4.2.0RC2/Zend/zend_execute_API.c        Sun Jan  6 23:21:09 2002
+++ ALAN_Zend/zend_execute_API.c        Fri Apr  5 17:26:04 2002
@@ -218,6 +218,7 @@
 
 ZEND_API char *get_active_function_name(TSRMLS_D)
 {
+        
        switch(EG(function_state_ptr)->function->type) {
                case ZEND_USER_FUNCTION: {
                                char *function_name = ((zend_op_array *) 
EG(function_state_ptr)->function)->function_name;
@@ -237,6 +238,28 @@
        }
 }
 
+
+ZEND_API char *get_active_class_name(TSRMLS_D)
+{
+        
+        switch(EG(function_state_ptr)->function->type) {
+               case ZEND_USER_FUNCTION: {
+                               char *class_name = ((zend_op_array *) 
+EG(function_state_ptr)->function)->class_name;
+                       
+                               if (class_name) {
+                                       return class_name;
+                               } else {
+                                       return "main";
+                               }
+                       }
+                       break;
+               case ZEND_INTERNAL_FUNCTION:
+                       return ((zend_internal_function *) 
+EG(function_state_ptr)->function)->class_name;
+                       break;
+               default:
+                       return NULL;
+       }
+}
 
 ZEND_API char *zend_get_executed_filename(TSRMLS_D)
 {

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to