@@ -42,38 +42,76 @@ typedef struct jerryx_native_module_t
4242 */
4343#ifdef ENABLE_INIT_FINI
4444#ifdef _MSC_VER
45- #error "`FEATURE_INIT_FINI` build flag isn't supported on Windows, because Microsoft Visual C/C++ Compiler \
46- doesn't support library constructors and destructors."
45+ /**
46+ * Only Visual Studio 2008 and upper version support for __pragma keyword
47+ * refer to https://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.90).aspx
48+ */
49+ #if _MSC_VER >= 1500
50+ #ifdef _WIN64
51+ #define JERRYX_MSVC_INCLUDE_SYM (s ) comment (linker, "/include:" #s)
52+ #else /* !_WIN64 */
53+ #define JERRYX_MSVC_INCLUDE_SYM (s ) comment (linker, "/include:_" #s)
54+ #endif /* _WIN64 */
55+
56+ #ifdef __cplusplus
57+ #define JERRYX_MSCV_EXTERN_C extern "C"
58+ #else /* !__cplusplus */
59+ #define JERRYX_MSCV_EXTERN_C
60+ #endif /* __cplusplus */
61+
62+ #pragma section(".CRT$XCU", read)
63+ #pragma section(".CRT$XTU", read)
64+
65+ #define JERRYX_MSVC_FUNCTION_ON_SECTION (sec_name , f ) \
66+ static void f (void); \
67+ __pragma (JERRYX_MSVC_INCLUDE_SYM (f##_section)) __declspec(allocate (sec_name)) \
68+ JERRYX_MSCV_EXTERN_C void (*f##_section) (void) = f; \
69+ static void f (void)
70+
71+ #define JERRYX_MODULE_CONSTRUCTOR (f ) JERRYX_MSVC_FUNCTION_ON_SECTION (".CRT$XCU", f)
72+ #define JERRYX_MODULE_DESTRUCTOR (f ) JERRYX_MSVC_FUNCTION_ON_SECTION (".CRT$XTU", f)
73+ #else /* !(_MSC_VER >= 1500) */
74+ #error "Only Visual Studio 2008 and upper version are supported."
75+ #endif /* _MSC_VER >= 1500 */
76+ #elif defined(__GNUC__ )
77+ #define JERRYX_MODULE_CONSTRUCTOR (f ) \
78+ static void f (void) __attribute__ ((constructor)); \
79+ static void f (void)
80+
81+ #define JERRYX_MODULE_DESTRUCTOR (f ) \
82+ static void f (void) __attribute__ ((destructor)); \
83+ static void f (void)
84+ #else /* __GNUC__ */
85+ #error "`FEATURE_INIT_FINI` build flag isn't supported on this compiler"
4786#endif /* _MSC_VER */
48- #define JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE __attribute__ ((constructor))
49- #define JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
50- #define JERRYX_MODULE_REGISTRATION_QUALIFIER static
5187#else /* !ENABLE_INIT_FINI */
52- #define JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE
53- #define JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE
54- #define JERRYX_MODULE_REGISTRATION_QUALIFIER
88+ #define JERRYX_MODULE_CONSTRUCTOR (f ) \
89+ void f (void); \
90+ void f (void)
91+
92+ #define JERRYX_MODULE_DESTRUCTOR (f ) \
93+ void f (void); \
94+ void f (void)
5595#endif /* ENABLE_INIT_FINI */
5696
5797/**
5898 * Having two levels of macros allows strings to be used unquoted.
5999 */
60100#define JERRYX_NATIVE_MODULE (module_name , on_resolve_cb ) JERRYX_NATIVE_MODULE_IMPLEM (module_name, on_resolve_cb)
61101
62- #define JERRYX_NATIVE_MODULE_IMPLEM (module_name , on_resolve_cb ) \
63- static jerryx_native_module_t _##module_name##_definition = { .name_p = (jerry_char_t *) #module_name, \
64- .on_resolve_p = (on_resolve_cb), \
65- .next_p = NULL }; \
66- \
67- JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_register (void) JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE; \
68- JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_register (void) \
69- { \
70- jerryx_native_module_register (&_##module_name##_definition); \
71- } \
72- \
73- JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_unregister (void) JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE; \
74- JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_unregister (void) \
75- { \
76- jerryx_native_module_unregister (&_##module_name##_definition); \
102+ #define JERRYX_NATIVE_MODULE_IMPLEM (module_name , on_resolve_cb ) \
103+ static jerryx_native_module_t _##module_name##_definition = { .name_p = (jerry_char_t *) #module_name, \
104+ .on_resolve_p = (on_resolve_cb), \
105+ .next_p = NULL }; \
106+ \
107+ JERRYX_MODULE_CONSTRUCTOR (module_name##_register) \
108+ { \
109+ jerryx_native_module_register (&_##module_name##_definition); \
110+ } \
111+ \
112+ JERRYX_MODULE_DESTRUCTOR (module_name##_unregister) \
113+ { \
114+ jerryx_native_module_unregister (&_##module_name##_definition); \
77115 }
78116
79117/**
0 commit comments