I don't think we should stop people from tweaking ZE1. ZE2 is probably
more than a year away from realistically being available to a lot of
people. It takes a while for people to upgrade, and many will skip the .0
release.  If a few tweaks to ZE1 can eliminate peoples' motivation to move
to ZE2, then why are you writing ZE2?  I obviously don't think that is the
case as ZE2 has a number of features people have been asking for.

-Rasmus

On Sun, 18 Aug 2002, Zeev Suraski wrote:

> I haven't, because of the two reasons I mentioned.  There's nothing about
> the specifics of the patch that can make me change my personal mind about it...
> I understand you disagree with me about the momentum issue, so let's agree
> to disagree.
>
> Zeev
>
> At 20:12 18/08/2002, Thies C. Arntzen wrote:
>
> >     there is one tiny change that might destabelize the ZE1 - i
> >     asked if you could take a look and see if you agree with
> >     me that this change is actually *not* harmful.
> >
> >     i don't really see your point that having debug_backtrace
> >     only available in ZE2 will bring more momentum to the ZE2
> >     development. and not wanting a new (and btw very useful
> >     feature) in ZE1 for that very reason is not good IMHO.
> >
> >     zeev, andi - have you had a *look* at the patch and do you see
> >     any good reason not to have it in 4.3? i do not buy you "lets
> >     only bring ZE2 forward" argument at all.
> >
> >     i'd love to hear more opinions on this.
> >     tc
> >
> >On Sun, Aug 18, 2002 at 06:40:35PM +0300, Andi Gutmans wrote:
> > > I also think we should make sure enough people have motivation to move to
> > > ZE2. If not it'll be hard to push it out and we all know that it's a very
> > > important step for PHP. As it is, there is still not enough momentum
> > behind
> > > it.
> > > Andi
> > >
> > > At 05:38 PM 8/18/2002 +0300, Zeev Suraski wrote:
> > > >I said before - I prefer not having any changes in ZE1, for both
> > stability
> > > >reasons and also as a motivation to get ZE2 out the door more quickly.
> > > >
> > > >Zeev
> > > >
> > > >At 17:21 18/08/2002, Thies C. Arntzen wrote:
> > > >
> > > >>    if noone objects i'm going to commit this to -HEAD (and we
> > > >>    can start discussing it then;-)
> > > >>
> > > >>    re,
> > > >>    tc
> > > >>
> > > >>On Fri, Aug 16, 2002 at 07:39:59PM +0200, Thies C. Arntzen wrote:
> > > >>>
> > > >>>     hi,
> > > >>>
> > > >>>     this patch adds the extremely useful debug_backtrace()
> > > >>>     function to ZE1.  as it's more-or-less the same
> > > >>>     implementation as in ZE2 so it should be "fast and efficient"
> > > >>>     enough for inclusion in 4.3 IMHO.
> > > >>>
> > > >>>     it has one extra feature over the ZE2 implementation by
> > > >>>     giving some extra information if a method was called
> > > >>>     using :: or -> (see the 'type' attribute in the array
> > > >>>     returned by debug_backtrace).
> > > >>>
> > > >>>     zeev, andi one question: i had to comment line 1628 (just
> > > >>>     apply the patch and see for yourself) to make the following
> > > >>>     code work correctly (= show the class in the backtrace):
> > > >>>
> > > >>> <?php
> > > >>> class a {
> > > >>>       function dump() {
> > > >>>               var_dump(debug_backtrace());
> > > >>>       }
> > > >>> }
> > > >>>
> > > >>> $a = new a;
> > > >>> $a->dump();
> > > >>> ?>
> > > >>>
> > > >>>     (just uncomment line 1628 in the patched sources and see how
> > > >>>     the output of debug_backtrace doesn't show the class-name for
> > > >>>     this script any more)
> > > >>>
> > > >>>     i don't think that commenting this line will have any
> > > >>>     side-effect as EG(object).ptr will be re-initialized in 1665
> > > >>>     and i don't see any references to it in between.
> > > >>>
> > > >>>     i'd love to have this included in 4.3.0 and i think a lot of
> > > >>>     people would be happy as well.
> > > >>>
> > > >>>     implementation:
> > > >>>     to make this whole thing work i simply added the class_entry
> > > >>>     to the execute_data and am pushing and popping it together
> > > >>>     with (object).ptr.
> > > >>>
> > > >>>     if this patch gets accepted i'll add an php.ini seting so
> > > >>>     that errors and warnings will optionally have the full
> > > >>>     call-stack.
> > > >>>
> > > >>>
> > > >>>     comments are welcome - especially from andi & zeev.
> > > >>>     tc
> > > >>>
> > > >>>     PS: patch is against -HEAD
> > > >>>
> > > >>> --
> > > >>> Thies C. Arnzten   -   Looking for all sorts of freelance
> > > >>work  -   just ask..
> > > >>> Whishlist:
> > > >>http://www.amazon.de/exec/obidos/wishlist/AB9DY62QWDSZ/ref=wl_em_to
> > > >>
> > > >>> ? ext/tca_prof
> > > >>> Index: Zend/zend_builtin_functions.c
> > > >>> ===================================================================
> > > >>> RCS file: /repository/Zend/zend_builtin_functions.c,v
> > > >>> retrieving revision 1.118
> > > >>> diff -u -r1.118 zend_builtin_functions.c
> > > >>> --- Zend/zend_builtin_functions.c     12 Jun 2002 17:02:22
> > > >>-0000      1.118
> > > >>> +++ Zend/zend_builtin_functions.c     16 Aug 2002 17:22:01 -0000
> > > >>> @@ -65,6 +65,7 @@
> > > >>>  static ZEND_FUNCTION(extension_loaded);
> > > >>>  static ZEND_FUNCTION(get_extension_funcs);
> > > >>>  static ZEND_FUNCTION(get_defined_constants);
> > > >>> +static ZEND_FUNCTION(debug_backtrace);
> > > >>>  #if ZEND_DEBUG
> > > >>>  static ZEND_FUNCTION(zend_test_func);
> > > >>>  #endif
> > > >>> @@ -116,6 +117,7 @@
> > > >>>       ZEND_FE(extension_loaded,                       NULL)
> > > >>>       ZEND_FE(get_extension_funcs,            NULL)
> > > >>>       ZEND_FE(get_defined_constants,          NULL)
> > > >>> +     ZEND_FE(debug_backtrace,                        NULL)
> > > >>>  #if ZEND_DEBUG
> > > >>>       ZEND_FE(zend_test_func,         NULL)
> > > >>>  #endif
> > > >>> @@ -1133,6 +1135,69 @@
> > > >>>       array_init(return_value);
> > > >>>       zend_hash_apply_with_argument(EG(zend_constants),
> > > >>(apply_func_arg_t) add_constant_info, return_value TSRMLS_CC);
> > > >>>  }
> > > >>> +
> > > >>> +/* {{{ proto void debug_backtrace(void)
> > > >>> +   Prints out a backtrace */
> > > >>> +ZEND_FUNCTION(debug_backtrace)
> > > >>> +{
> > > >>> +     zend_execute_data *ptr;
> > > >>> +     int lineno;
> > > >>> +     char *function_name;
> > > >>> +     char *filename;
> > > >>> +     char *class_name;
> > > >>> +     zend_uint class_name_length;
> > > >>> +     zval *stack_frame;
> > > >>> +
> > > >>> +     ptr = EG(execute_data_ptr);
> > > >>> +
> > > >>> +     /* Skip debug_backtrace() itself */
> > > >>> +     ptr = ptr->prev_execute_data;
> > > >>> +
> > > >>> +     array_init(return_value);
> > > >>> +
> > > >>> +     while (ptr) {
> > > >>> +             MAKE_STD_ZVAL(stack_frame);
> > > >>> +             array_init(stack_frame);
> > > >>> +
> > > >>> +
> > > >>> +/*           if (ptr->object) {
> > > >>> +                     class_name = Z_OBJCE(*ptr->object)->name;
> > > >>> +                     class_name_length =
> > > >>Z_OBJCE(*ptr->object)->name_length;
> > > >>> +             }
> > > >>> +             if (ptr->function_state.function->common.scope) {
> > > >>> +                     class_name =
> > > >>ptr->function_state.function->common.scope->name;
> > > >>> +             }
> > > >>> +*/
> > > >>> +             if (ptr->ce) {
> > > >>> +                     add_assoc_string_ex(stack_frame, "type",
> > > >>sizeof("type"), "::", 1);
> > > >>> +                     class_name = ptr->ce->name;
> > > >>> +             } else if (ptr->object.ptr) {
> > > >>> +                     add_assoc_string_ex(stack_frame, "type",
> > > >>sizeof("type"), "->", 1);
> > > >>> +                     class_name = ptr->object.ptr->value.obj.ce->name;
> > > >>> +
> > > >>> +             } else {
> > > >>> +                     class_name = NULL;
> > > >>> +             }
> > > >>> +
> > > >>> +             function_name =
> > > >>ptr->function_state.function->common.function_name;
> > > >>> +
> > > >>> +             filename = ptr->op_array->filename;
> > > >>> +             lineno = ptr->opline->lineno;
> > > >>> +
> > > >>> +             if (function_name) {
> > > >>> +                     add_assoc_string_ex(stack_frame, "function",
> > > >>sizeof("function"), function_name, 1);
> > > >>> +             }
> > > >>> +             if (class_name) {
> > > >>> +                     add_assoc_string_ex(stack_frame, "class",
> > > >>sizeof("class"), class_name, 1);
> > > >>> +             }
> > > >>> +             add_assoc_string_ex(stack_frame, "file", sizeof("file"),
> > > >>filename, 1);
> > > >>> +             add_assoc_long_ex(stack_frame, "line", sizeof("line"),
> > > >>lineno);
> > > >>> +             add_next_index_zval(return_value, stack_frame);
> > > >>> +
> > > >>> +             ptr = ptr->prev_execute_data;
> > > >>> +     }
> > > >>> +}
> > > >>> +/* }}} */
> > > >>>
> > > >>>
> > > >>>  /* {{{ proto bool extension_loaded(string extension_name)
> > > >>> Index: Zend/zend_execute.c
> > > >>> ===================================================================
> > > >>> RCS file: /repository/Zend/zend_execute.c,v
> > > >>> retrieving revision 1.300
> > > >>> diff -u -r1.300 zend_execute.c
> > > >>> --- Zend/zend_execute.c       2 Aug 2002 20:21:38 -0000       1.300
> > > >>> +++ Zend/zend_execute.c       16 Aug 2002 17:22:02 -0000
> > > >>> @@ -1000,14 +1000,17 @@
> > > >>>  {
> > > >>>       zend_execute_data execute_data;
> > > >>>
> > > >>> -     EG(execute_data_ptr) = &execute_data;
> > > >>> -
> > > >>>       /* Initialize execute_data */
> > > >>>       EX(fbc) = NULL;
> > > >>> +     EX(ce) = NULL;
> > > >>>       EX(object).ptr = NULL;
> > > >>> +     EX(op_array) = op_array;
> > > >>>       EX(Ts) = (temp_variable *)
> > > >>do_alloca(sizeof(temp_variable)*op_array->T);
> > > >>> +     EX(prev_execute_data) = EG(execute_data_ptr);
> > > >>>       EX(original_in_execution)=EG(in_execution);
> > > >>>
> > > >>> +     EG(execute_data_ptr) = &execute_data;
> > > >>> +
> > > >>>       EG(in_execution) = 1;
> > > >>>       if (op_array->start_op) {
> > > >>>               EX(opline) = op_array->start_op;
> > > >>> @@ -1479,7 +1482,7 @@
> > > >>>                                       HashTable *active_function_table;
> > > >>>                                       zval tmp;
> > > >>>
> > > >>> - zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(fbc),
> > > >>EX(object).ptr);
> > > >>> + zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc),
> > > >>EX(object).ptr, EX(ce));
> > > >>>                                       if (EX(opline)->extended_value &
> > > >>ZEND_CTOR_CALL) {
> > > >>>                                               /* constructor call */
> > > >>>
> > > >>> @@ -1497,10 +1500,9 @@
> > > >>>                                       convert_to_string(&tmp);
> > > >>>                                       function_name = &tmp;
> > > >>> zend_str_tolower(tmp.value.str.val, tmp.value.str.len);
> > > >>> -
> > > >>> +                                     EX(ce) = NULL;
> > > >>>                                       if (EX(opline)->op1.op_type !=
> > > >>IS_UNUSED) {
> > > >>>                                               if
> > > >>(EX(opline)->op1.op_type==IS_CONST) { /* used for class_name::function()
> > > >>*/
> > > >>> -                                                     zend_class_entry
> > > >>*ce;
> > > >>>                                                       zval
> > > >>**object_ptr_ptr;
> > > >>>
> > > >>>                                                       if
> > > >>(zend_hash_find(EG(active_symbol_table), "this", sizeof("this"), (void
> > > >>**) &object_ptr_ptr)==FAILURE) {
> > > >>> @@ -1511,10 +1513,10 @@
> > > >>> EX(object).ptr = *object_ptr_ptr;
> > > >>> EX(object).ptr->refcount++; /* For this pointer */
> > > >>>                                                       }
> > > >>> -                                                     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 */
> > > >>> +                                                     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 **) &EX(ce))==FAILURE)
> > > >>{ /* class doesn't exist */
> > > >>> zend_error(E_ERROR, "Undefined class name '%s'",
> > > >>EX(opline)->op1.u.constant.value.str.val);
> > > >>>                                                       }
> > > >>> - active_function_table = &ce->function_table;
> > > >>> + active_function_table = &EX(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);
> > > >>>
> > > >>> @@ -1572,8 +1574,9 @@
> > > >>>                                               zend_error(E_ERROR,
> > > >>"Unknown function:  %s()\n", fname->value.str.val);
> > > >>>                                       }
> > > >>>                                       FREE_OP(EX(Ts),
> > > >>&EX(opline)->op1, EG(free_op1));
> > > >>> - zend_ptr_stack_push(&EG(arg_types_stack), EX(object).ptr);
> > > >>> + zend_ptr_stack_n_push(&EG(arg_types_stack), 2, EX(object).ptr,
> > > >>EX(ce));
> > > >>>                                       EX(object).ptr = NULL;
> > > >>> +                                     EX(ce) = NULL;
> > > >>>                                       goto do_fcall_common;
> > > >>>                               }
> > > >>>  do_fcall_common:
> > > >>> @@ -1623,7 +1626,7 @@
> > > >>> zend_error(E_WARNING, "Problem with method call - please report this
> > > >>bug");
> > > >>>                                       }
> > > >>>                                                       *this_ptr =
> > > >>EX(object).ptr;
> > > >>> -                                                     EX(object).ptr =
> > > >>NULL;
> > > >>> +                                     /*              EX(object).ptr =
> > > >>NULL; */
> > > >>>                                               }
> > > >>>                                               original_return_value =
> > > >>EG(return_value_ptr_ptr);
> > > >>>                                               EG(return_value_ptr_ptr)
> > > >>= EX(Ts)[EX(opline)->result.u.var].var.ptr_ptr;
> > > >>> @@ -1659,9 +1662,9 @@
> > > >>>                                               }
> > > >>>                                       }
> > > >>>                                       if (EX(opline)->opcode ==
> > > >>ZEND_DO_FCALL_BY_NAME) {
> > > >>> - zend_ptr_stack_n_pop(&EG(arg_types_stack), 2, &EX(object).ptr,
> > > >>&EX(fbc));
> > > >>> + zend_ptr_stack_n_pop(&EG(arg_types_stack), 3, &EX(ce),
> > > >>&EX(object).ptr, &EX(fbc));
> > > >>>                                       } else {
> > > >>> -                                             EX(object).ptr =
> > > >>zend_ptr_stack_pop(&EG(arg_types_stack));
> > > >>> + zend_ptr_stack_n_pop(&EG(arg_types_stack), 2, &EX(ce),
> > > >>&EX(object).ptr);
> > > >>>                                       }
> > > >>>                                       EX(function_state).function =
> > > >>(zend_function *) op_array;
> > > >>>                                       EG(function_state_ptr) =
> > > >>&EX(function_state);
> > > >>> @@ -1709,6 +1712,7 @@
> > > >>>                                       }
> > > >>>                                       free_alloca(EX(Ts));
> > > >>>                                       EG(in_execution) =
> > > >>EX(original_in_execution);
> > > >>> +                                     EG(execute_data_ptr) =
> > > >>EX(prev_execute_data);
> > > >>>                                       return;
> > > >>>                               }
> > > >>>                               break;
> > > >>> Index: Zend/zend_execute_globals.h
> > > >>> ===================================================================
> > > >>> RCS file: /repository/Zend/zend_execute_globals.h,v
> > > >>> retrieving revision 1.1
> > > >>> diff -u -r1.1 zend_execute_globals.h
> > > >>> --- Zend/zend_execute_globals.h       16 May 2002 04:28:18 -0000
> > > >>1.1
> > > >>> +++ Zend/zend_execute_globals.h       16 Aug 2002 17:22:02 -0000
> > > >>> @@ -55,9 +55,12 @@
> > > >>>       zend_op *opline;
> > > >>>       zend_function_state function_state;
> > > >>>       zend_function *fbc; /* Function Being Called */
> > > >>> +     zend_class_entry *ce;
> > > >>>       object_info object;
> > > >>>       temp_variable *Ts;
> > > >>>       zend_bool original_in_execution;
> > > >>> +     zend_op_array *op_array;
> > > >>> +     struct  _zend_execute_data *prev_execute_data;
> > > >>>  } zend_execute_data;
> > > >>>
> > > >>>  #endif
> > > >>>
> > > >>
> > > >>> --
> > > >>> PHP Development Mailing List <http://www.php.net/>
> > > >>> To unsubscribe, visit: http://www.php.net/unsub.php
> > > >>
> > > >>--
> > > >>Thies C. Arnzten   -   Looking for all sorts of freelance work  -   just
> > > >>ask..
> > > >>    Whishlist:  http://www.amazon.de/exec/obidos/wishlist/AB9DY62QWDSZ
> >
> >--
> >Thies C. Arnzten   -   Looking for all sorts of freelance work  -   just ask..
> >     Whishlist:  http://www.amazon.de/exec/obidos/wishlist/AB9DY62QWDSZ
>
>
> --
> 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