This should really be implemented 100% in compile time, if you touch 
zend_execute.c, BUZZ :)
Anyway, incidentally, Jani implemented this very patch a few days 
ago.  We'll probably import it within a couple of days after we verify that 
it doesn't cause any gotcha's...

Zeev


At 12:34 PM 4/5/2002, Alan Knowles wrote:
>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


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

Reply via email to