]> granicus.if.org Git - php/commitdiff
Fix macro-expansion issues in ZEND_FE and friends
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 21 Feb 2020 14:23:10 +0000 (15:23 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 25 Feb 2020 09:21:31 +0000 (10:21 +0100)
I noticed that we have various places where we work around macros
conflicting with PHP function names. Rather than require this,
fix our ZEND_FE etc macros to avoid pre-scan macro expansion.
This requires duplicating the ZEND_FN/ZEND_MN macros in places,
but that seems like a reasonable tradeoff.

Zend/zend_API.h

index 9fd656b276db973cc4da38599d45d3c19ef1a760..4c29a0f1b928c6245381036452df631049796add 100644 (file)
@@ -59,40 +59,46 @@ typedef struct _zend_fcall_info_cache {
 
 #define ZEND_NS_NAME(ns, name)                 ns "\\" name
 
+/* ZEND_FN/ZEND_MN are inlined below to prevent pre-scan macro expansion,
+ * which causes issues if the function name is also a macro name. */
 #define ZEND_FN(name) zif_##name
 #define ZEND_MN(name) zim_##name
+
 #define ZEND_NAMED_FUNCTION(name)              void ZEND_FASTCALL name(INTERNAL_FUNCTION_PARAMETERS)
-#define ZEND_FUNCTION(name)                            ZEND_NAMED_FUNCTION(ZEND_FN(name))
-#define ZEND_METHOD(classname, name)   ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))
+#define ZEND_FUNCTION(name)                            ZEND_NAMED_FUNCTION(zif_##name)
+#define ZEND_METHOD(classname, name)   ZEND_NAMED_FUNCTION(zim_##classname##_##name)
 
 #define ZEND_FENTRY(zend_name, name, arg_info, flags)  { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags },
 
 #define ZEND_RAW_FENTRY(zend_name, name, arg_info, flags)   { zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags },
+
+/* Same as ZEND_NAMED_FE */
 #define ZEND_RAW_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0)
 
-#define ZEND_NAMED_FE(zend_name, name, arg_info)       ZEND_FENTRY(zend_name, name, arg_info, 0)
-#define ZEND_FE(name, arg_info)                                                ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
-#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_NAMED_FE(zend_name, name, arg_info)       ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0)
+#define ZEND_FE(name, arg_info)                                                ZEND_RAW_FENTRY(#name, zif_##name, arg_info, 0)
+#define ZEND_DEP_FE(name, arg_info)                 ZEND_RAW_FENTRY(#name, zif_##name, arg_info, ZEND_ACC_DEPRECATED)
+#define ZEND_FALIAS(name, alias, arg_info)                     ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, 0)
+#define ZEND_DEP_FALIAS(name, alias, arg_info)         ZEND_RAW_FENTRY(#name, zif_##alias, arg_info, ZEND_ACC_DEPRECATED)
 #define ZEND_NAMED_ME(zend_name, name, arg_info, flags)        ZEND_FENTRY(zend_name, name, arg_info, flags)
-#define ZEND_ME(classname, name, arg_info, flags)      ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags)
-#define ZEND_DEP_ME(classname, name, arg_info, flags) ZEND_ME(classname, name, arg_info, flags | ZEND_ACC_DEPRECATED)
-#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_MN(classname##_##alias), arg_info, flags)
-#define ZEND_ME_MAPPING(name, func_name, arg_types, flags) ZEND_NAMED_ME(name, ZEND_FN(func_name), arg_types, flags)
+#define ZEND_ME(classname, name, arg_info, flags)      ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags)
+#define ZEND_DEP_ME(classname, name, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##name, arg_info, flags | ZEND_ACC_DEPRECATED)
+#define ZEND_ABSTRACT_ME(classname, name, arg_info)    ZEND_RAW_FENTRY(#name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
+#define ZEND_MALIAS(classname, name, alias, arg_info, flags) ZEND_RAW_FENTRY(#name, zim_##classname##_##alias, arg_info, flags)
+#define ZEND_ME_MAPPING(name, func_name, arg_types, flags) ZEND_RAW_FENTRY(#name, zif_##func_name, arg_types, flags)
 
 #define ZEND_NS_FENTRY(ns, zend_name, name, arg_info, flags)           ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, #zend_name), name, arg_info, flags)
 
 #define ZEND_NS_RAW_FENTRY(ns, zend_name, name, arg_info, flags)       ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, zend_name), name, arg_info, flags)
+
+/* Same as ZEND_NS_NAMED_FE */
 #define ZEND_NS_RAW_NAMED_FE(ns, zend_name, name, arg_info)                    ZEND_NS_RAW_FENTRY(ns, #zend_name, name, arg_info, 0)
 
-#define ZEND_NS_NAMED_FE(ns, zend_name, name, arg_info)        ZEND_NS_FENTRY(ns, zend_name, name, arg_info, 0)
-#define ZEND_NS_FE(ns, name, arg_info)                                 ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, 0)
-#define ZEND_NS_DEP_FE(ns, name, arg_info)                             ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
-#define ZEND_NS_FALIAS(ns, name, alias, arg_info)              ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, 0)
-#define ZEND_NS_DEP_FALIAS(ns, name, alias, arg_info)  ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
+#define ZEND_NS_NAMED_FE(ns, zend_name, name, arg_info)        ZEND_NS_RAW_FENTRY(ns, #zend_name, name, arg_info, 0)
+#define ZEND_NS_FE(ns, name, arg_info)                                 ZEND_NS_RAW_FENTRY(ns, #name, zif_##name, arg_info, 0)
+#define ZEND_NS_DEP_FE(ns, name, arg_info)                             ZEND_NS_RAW_FENTRY(ns, #name, zif_##name, arg_info, ZEND_ACC_DEPRECATED)
+#define ZEND_NS_FALIAS(ns, name, alias, arg_info)              ZEND_NS_RAW_FENTRY(ns, #name, zif_##alias, arg_info, 0)
+#define ZEND_NS_DEP_FALIAS(ns, name, alias, arg_info)  ZEND_NS_RAW_FENTRY(ns, #name, zif_##alias, arg_info, ZEND_ACC_DEPRECATED)
 
 #define ZEND_FE_END            { NULL, NULL, NULL, 0, 0 }