Skip to content

Commit d5f048e

Browse files
authored
Add FEATURE_INIT_FINI support on Windows. (jerryscript-project#4859)
JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo [email protected]
1 parent 55acdf2 commit d5f048e

File tree

3 files changed

+64
-29
lines changed

3 files changed

+64
-29
lines changed

docs/12.EXT-REFERENCE-MODULE.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ resolved using the native JerryScript module resolver `jerryx_module_native_reso
3737
`jerryx_module_resolve()`. Native modules are registered during application startup and by calling `dlopen()` by means
3838
of library constructors, support for which can be turned on using the `FEATURE_INIT_FINI` build flag. In the absence of
3939
such a flag, the module registration and unregistration functions are exposed as global symbols which can be called
40-
explicitly. Note: `FEATURE_INIT_FINI` build flag isn't supported on Windows, because Microsoft Visual C/C++ Compiler
41-
doesn't support library constructors and destructors.
40+
explicitly. Note: On windows, `FEATURE_INIT_FINI` build flag only supported with GNU toolchain or Microsoft Visual C/C++ Compiler
41+
2008 and upper.
4242

4343
## jerryx_module_resolve
4444

jerry-ext/include/jerryscript-ext/module.h

+61-23
Original file line numberDiff line numberDiff line change
@@ -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
/**

tools/run-tests.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,7 @@ def skip_if(condition, desc):
6868
OPTIONS_COMMON + OPTIONS_DOCTESTS + OPTIONS_PROFILE_ES51),
6969
Options('unittests-es5.1-init-fini',
7070
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
71-
+ ['--cmake-param=-DFEATURE_INIT_FINI=ON'],
72-
skip=skip_if((sys.platform == 'win32'), 'FEATURE_INIT_FINI build flag isn\'t supported on Windows,' +
73-
' because Microsoft Visual C/C++ Compiler doesn\'t support' +
74-
' library constructors and destructors.')),
71+
+ ['--cmake-param=-DFEATURE_INIT_FINI=ON']),
7572
Options('unittests-es5.1-math',
7673
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
7774
+ ['--jerry-math=on']),

0 commit comments

Comments
 (0)