@@ -42,38 +42,76 @@ typedef struct jerryx_native_module_t
42
42
*/
43
43
#ifdef ENABLE_INIT_FINI
44
44
#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"
47
86
#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
51
87
#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)
55
95
#endif /* ENABLE_INIT_FINI */
56
96
57
97
/**
58
98
* Having two levels of macros allows strings to be used unquoted.
59
99
*/
60
100
#define JERRYX_NATIVE_MODULE (module_name , on_resolve_cb ) JERRYX_NATIVE_MODULE_IMPLEM (module_name, on_resolve_cb)
61
101
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); \
77
115
}
78
116
79
117
/**
0 commit comments