Why can't you just simply name your classes all lowercase. All of the extensions currently do this and it works fine.
- Brad --- Eric Lambart <[EMAIL PROTECTED]> wrote: > Hello. > > After a short bout of hair-pulling, I have discovered the source (in the > Zend engine) of a recent problem, and have fixed it. > > BACKGROUND: > As I have mentioned previously on this list, I am developing a complex > PHP extension, which among many other things creates its own PHP > classes, and when these classes are instantiated, I manually call the > class constructor (as one must) from my C code. > > I am creating the extension from existing C++ and Java versions of the > same system, so I am trying to maintain things as much as possible, > including names (including capitalization) of classes and functions > (although I am prefixing them all with "eo_" to avoid potential > conflicts with functions and classes from other PHP extensions). > > Thus, I have classes such as "eo_list", "eo_table" and "eo_NVList". > > THE SYMPTOM: > I had no trouble instantiating and calling the constructors for the > first two classes, but when I tried to do it for eo_NVList, > call_user_function_ex() was returning FAILURE, which I discovered can > occur for one of seven reasons. > > I tracked down the problem to a failure of zend_hash_find() to lookup > the function. Using zend_hash_display() I was able to verify that the > eo_NVList constructor was indeed contained in the function table for the > eo_NVList class. > > THE PROBLEM: > call_user_function_ex() is converting the requested function name to > lower case (at zend_execute_API.c:463) before performing the > zend_hash_find(), but zend_register_functions() (in zend_API.c) does NOT > convert the function names to lower case before storing them in the > function table--so call_user_function_ex() was searching for a function > called "eo_nvlist" and could never find "eo_NVList"! > > Class lookups worked fine of course, because object_init_ex() takes a > pointer to the class entry rather than a name. > > Additionally, zend_register_internal_class() (also in zend_API.c) > converts all class names to lower case, and execute() (in > zend_execute.c) does the same when looking up a class to instantiate it > from a script. > > I haven't looked into script-driven function registration and execution, > but presumably case-insensitivity is properly supported there, or I'm > sure you would have heard of it long ago! > > MY SOLUTION: > I present the following little patch for your approval. > > I apologize that it is done against 4.3.1 rather than the latest CVS but > I do not have time to deal with CVS at this time, as my project is > already behind schedule and of course I need to work with a stable > engine. If zend_API.c has changed since the 4.3.1 release, it should be > trivial to change these few lines of code (yes, I'm sure they all say > that!). =) > > I didn't find any patch submission guidlines in a quick web search; I'm > afraid you'll have to change the file/pathnames in the first lines. If > you don't want to deal with that, point me to the guidelines and I will > resubmit the patch. For now I will get back to work. > > Respectfully, > Eric Lambart > > --- Zend/OLD_zend_API.c Wed Oct 9 07:17:52 2002 > +++ Zend/zend_API.c Fri Mar 7 13:10:38 2003 > @@ -1039,6 +1039,12 @@ > internal_function->type = ZEND_INTERNAL_FUNCTION; > > while (ptr->fname) { > + /* store all function names in lower case so they will always be found > by > + * call_user_function_ex() */ > + size_t fname_len = strlen(ptr->fname); > + char *lowercase_name = zend_strndup(ptr->fname, fname_len); > + zend_str_tolower(lowercase_name, fname_len); > + > internal_function->handler = ptr->handler; > internal_function->arg_types = ptr->func_arg_types; > internal_function->function_name = ptr->fname; > @@ -1047,7 +1053,7 @@ > zend_unregister_functions(functions, count, > target_function_table > TSRMLS_CC); > return FAILURE; > } > - if (zend_hash_add(target_function_table, ptr->fname, > strlen(ptr->fname)+1, > &function, sizeof(zend_function), NULL) == FAILURE) { > + if (zend_hash_add(target_function_table, lowercase_name, fname_len+1, > &function, sizeof(zend_function), NULL) == FAILURE) { > unload=1; > break; > } > > > > -- > PHP Development Mailing List <http://www.php.net/> > To unsubscribe, visit: http://www.php.net/unsub.php > __________________________________________________ Do you Yahoo!? Yahoo! Tax Center - forms, calculators, tips, more http://taxes.yahoo.com/ -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php