I never posted a patch. Becuase the changes that im running are incomplete. I change the compiler and executer. Other things will need to change to reflect this type of change. Api calls like call_user_function() and userland functions like get_defined_methods() in addtion i would think a couple new api functions would come outta this. Like zend_method_exists() zend_get_method() i don't know where else would need to change. but i will include what i have been testing with in this email. I made these changes against 4.1.2 i can't get the cvs version my company seems to block out some ports. So i will send you the patch against 4.1.2.
/* brad */ --- Yasuo Ohgaki <[EMAIL PROTECTED]> wrote: > Hi Brad, > > I would like to try your patch. > Where did you post? I searched ze2 list messages, I couldn't find one. > > -- > Yasuo Ohgaki > > > Brad Lafountain wrote: > > Ok... > > These benchmarks are (win32) > > php-4.1.2 Release_TS_inline (brad) vs php-4.1.2 binary from php.net (php) > > > > i have attached the test scripts that i used. > > (I ran each about 10 times and averaged the times, I used cygwin's time > > command) > > > > case one (worse case for php): > > brad - .11 sec > > php - .45 sec > > > > This is the worse case because php copies all of the functions from the > > previous class to the extended class so this script has 100 classes with 10 > > different functions in each so the 100'th class will have 1000 functions. > With > > this test i still called a function defined in the base class. Not only is > this > > way faster the new way it uses less memory. > > > > case two (worse case for brad): > > brad - .060 sec > > php - .080 sec > > This test has 100 declared classes all inheriting each other, only defining > a > > constructor in each class. Then makes a instance of the 100'th class and > calls > > a method in the base class 100 times. > > > > brad - .075 sec > > php - .090 sec > > The same thing as above but it calls the method 1000 times. > > > > brad - .23 sec > > php - .14 sec > > again with 10000 method calls > > > > As you can tell as the number of method calls go up the time of execution > goes > > up in the 'brad' version. IMHO doing 10000 calls to a method declared in a > base > > class of a inheritance chain of 100 classes and only loosing .09 seconds > isn't > > that bad at all. Seing this type of path will solve a few problems. > > > > --- Yasuo Ohgaki <[EMAIL PROTECTED]> wrote: > > > >>Brad, > >>How about post detailed benchmarks for your patch? > >> > >>IMHO. This bug is fatal. Especially those who are > >>experienced with other OO languages, such as C++/Java. > >> > >>-- > >>Yasuo Ohgaki > >> > >>Brad Lafountain wrote: > >> > >>>This bug is eaisly fixable. This is also something that i have been trying > >> > >>to > >> > >>>push on a couple of threads now. You would need to do 3 things. > >>> > >>>1) change the compiler so that inherited objects don't copy the opcodes > >>> of the functions. it will just store the parent's ce. > >>> > >>>2) change the executor so it will execute functions recursivly thru the > >>> parents ce's > >>> > >>>( i was talking about this change on engine2 list andi was arguing that it > >>>would be slower on execution of a function. I made the changes and it was > >>>faster. See the 'Mulitple Inhertiance' thread on engine2 list. This would > >> > >>also > >> > >>>allow you to inherit overloaded objects defined in c.. ie Java) > >>> > >>>3) again change the compiler to test only the current ce for > re-definitions > >> > >>of > >> > >>>the defined function. (derick already did this) > >>> > >>>So as far as im conserned making this change will solve many problems... > >> > >>But im > >> > >>>really still confused why andi doesn't want this change. I will send my > >> > >>diff if > >> > >>>you want. > >>> > >>> - Brad > >>> > >>>--- [EMAIL PROTECTED] wrote: > >>> > >>> > >>>>ID: 16265 > >>>>Updated by: [EMAIL PROTECTED] > >>>>Reported By: [EMAIL PROTECTED] > >>>>-Status: Open > >>>>+Status: Suspended > >>>>Bug Type: Scripting Engine problem > >>>>Operating System: Linux > >>>>PHP Version: 4.1.2 > >>>>New Comment: > >>>> > >>>>I'm suspending this for now, this issue is not easily solved > >>>>unfortunately. But we keep this on the todo list for future releases. > >>>> > >>>>Derick > >>>> > >>>> > >>>>Previous Comments: > >>>>------------------------------------------------------------------------ > >>>> > >>>>[2002-04-01 21:37:21] [EMAIL PROTECTED] > >>>> > >>>>Need to open again. > >>>>This bug may be suspended. > >>>> > >>>>------------------------------------------------------------------------ > >>>> > >>>>[2002-03-25 15:32:48] [EMAIL PROTECTED] > >>>> > >>>>Fixed in CVS, will also be in PHP 4.2.0 > >>>> > >>>>Derick > >>>> > >>>>------------------------------------------------------------------------ > >>>> > >>>>[2002-03-25 13:12:42] [EMAIL PROTECTED] > >>>> > >>>>PHP does not report multiply-defined errors for class member functions. > >>>>For example, the following script below, when executed, only outputs > >>>>"two", with no errors. > >>>> > >>>>Instead, PHP should be giving error messages since the function bar has > >>>>been defined multiple times. > >>>> > >>>><? > >>>>class foo > >>>>{ > >>>> function bar() {echo "one\n";} > >>>> function bar() {echo "two\n";} > >>>>} > >>>> > >>>>$f = new foo(); > >>>>$f->bar(); > >>>> > >>>>------------------------------------------------------------------------ > >>>> > >>>> > >>>>-- > >>>>Edit this bug report at http://bugs.php.net/?id=16265&edit=1 > >>>> > >>> > >>> > >>> > >>>__________________________________________________ > >>>Do You Yahoo!? > >>>Yahoo! Tax Center - online filing with TurboTax > >>>http://http://taxes.yahoo.com/ > >> > >> > >> > >>-- > >>PHP Development Mailing List <http://www.php.net/> > >>To unsubscribe, visit: http://www.php.net/unsub.php > >> > > > > > > > > __________________________________________________ > > Do You Yahoo!? > > Yahoo! Tax Center - online filing with TurboTax > > http://http://taxes.yahoo.com/ > > > __________________________________________________ Do You Yahoo!? Yahoo! Tax Center - online filing with TurboTax http://taxes.yahoo.com/
--- zend_compile.c Mon Dec 17 00:22:24 2001 +++ zend_compile_brad.c Thu Mar 28 09:41:30 2002 @@ -1565,17 +1565,18 @@ CG(active_ce_parent_class_name).value.str.len = parent_class_name->u.constant.value.str.len; if (zend_hash_find(CG(class_table), parent_class_name->u.constant.value.str.val, parent_class_name->u.constant.value.str.len+1, (void **) &parent_class)==SUCCESS) { - /* copy functions */ + /* copy functions zend_hash_copy(&CG(class_entry).function_table, &parent_class->function_table, (copy_ctor_func_t) function_add_ref, &tmp_zend_function, sizeof(zend_function)); + */ /* copy default properties */ zend_hash_copy(&CG(class_entry).default_properties, &parent_class->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); - /* copy overloaded handlers */ + /* copy overloaded handlers CG(class_entry).handle_function_call = parent_class->handle_function_call; CG(class_entry).handle_property_get = parent_class->handle_property_get; CG(class_entry).handle_property_set = parent_class->handle_property_set; - + */ CG(class_entry).parent = parent_class; zval_dtor(&parent_class_name->u.constant);
--- zend_execute.c Mon Dec 17 00:22:24 2001 +++ zend_execute_brad.c Tue Apr 2 11:19:06 2002 @@ -1552,9 +1552,28 @@ object.ptr = NULL; active_function_table = EG(function_table); } - if (zend_hash_find(active_function_table, function_name->value.str.val, function_name->value.str.len+1, (void **) &function)==FAILURE) { - zend_error(E_ERROR, "Call to undefined function: %s()", function_name->value.str.val); + + if(zend_hash_find(active_function_table, +function_name->value.str.val, function_name->value.str.len+1, (void **) &function) == +FAILURE) + { + if(object.ptr != NULL && +Z_OBJCE_P(object.ptr) != NULL) + { + zend_class_entry *tmp_ce = +Z_OBJCE_P(object.ptr); + function = NULL; + while(tmp_ce->parent != NULL) + { + active_function_table += &(tmp_ce->parent->function_table); + if +(zend_hash_find(active_function_table, Z_STRVAL_P(function_name), +Z_STRLEN_P(function_name) + 1, (void **) &function)!=FAILURE) { + break; + } + tmp_ce = +tmp_ce->parent; + } + if(function == NULL) + zend_error(E_ERROR, +"Call to undefined function: %s()", Z_STRVAL_P(function_name)); + } + else + zend_error(E_ERROR, "Call to +undefined function: %s()", Z_STRVAL_P(function_name)); } + zval_dtor(&tmp); fbc = function; overloaded_function_call_cont:
-- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php