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