Hi, following a recent discussion on IRC I'd like to propose a little patch separating ZEND_FUNCTION and ZEND_METHOD.
Currently functions declared as ZEND_FUNCTION are named zif_exported_name. Class methods are exported as zif_class_method. If you try to create a PHP function called foo_bar but already have some class foo with a method bar this leads to a "redefinition of `zif_foo_bar`". The attached patch solves this kind of issues by prefixing methods with zim_ (with m like in method) instead of zif_. Additionally it might help a bit while debugging since you can see wether you're in some class/object or a function context. As always the patch is also available at my repository on http://svn.schlueters.de/phpatches/HEAD/zend_separate_zend_method.diff johannes
Index: Zend/zend_API.h =================================================================== RCS file: /repository/ZendEngine2/zend_API.h,v retrieving revision 1.236 diff -u -p -r1.236 zend_API.h --- Zend/zend_API.h 26 Feb 2006 11:57:14 -0000 1.236 +++ Zend/zend_API.h 3 Mar 2006 22:15:24 -0000 @@ -42,9 +42,10 @@ typedef struct _zend_function_entry { } zend_function_entry; #define ZEND_FN(name) zif_##name +#define ZEND_MN(name) zim_##name #define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS) #define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name)) -#define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_FN(classname##_##name)) +#define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name)) #define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags }, @@ -53,10 +54,10 @@ typedef struct _zend_function_entry { #define ZEND_DEP_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED) #define ZEND_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0) #define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED) -#define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_FN(classname##_##name), arg_info, flags) +#define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags) #define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_FENTRY(name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT) #define ZEND_MALIAS(classname, name, alias, arg_info, flags) \ - ZEND_FENTRY(name, ZEND_FN(classname##_##alias), arg_info, flags) + ZEND_FENTRY(name, ZEND_MN(classname##_##alias), arg_info, flags) #define ZEND_ME_MAPPING(name, func_name, arg_types) ZEND_NAMED_FE(name, ZEND_FN(func_name), arg_types) #define ZEND_ARG_INFO(pass_by_ref, name) { {#name}, sizeof(#name)-1, {NULL}, 0, 0, 0, pass_by_ref, 0, 0 },
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php