Add FEATURE_INIT_FINI support on Windows. (#4859)
JerryScript-DCO-1.0-Signed-off-by: Yonggang Luo luoyonggang@gmail.com
This commit is contained in:
@@ -37,8 +37,8 @@ resolved using the native JerryScript module resolver `jerryx_module_native_reso
|
|||||||
`jerryx_module_resolve()`. Native modules are registered during application startup and by calling `dlopen()` by means
|
`jerryx_module_resolve()`. Native modules are registered during application startup and by calling `dlopen()` by means
|
||||||
of library constructors, support for which can be turned on using the `FEATURE_INIT_FINI` build flag. In the absence of
|
of library constructors, support for which can be turned on using the `FEATURE_INIT_FINI` build flag. In the absence of
|
||||||
such a flag, the module registration and unregistration functions are exposed as global symbols which can be called
|
such a flag, the module registration and unregistration functions are exposed as global symbols which can be called
|
||||||
explicitly. Note: `FEATURE_INIT_FINI` build flag isn't supported on Windows, because Microsoft Visual C/C++ Compiler
|
explicitly. Note: On windows, `FEATURE_INIT_FINI` build flag only supported with GNU toolchain or Microsoft Visual C/C++ Compiler
|
||||||
doesn't support library constructors and destructors.
|
2008 and upper.
|
||||||
|
|
||||||
## jerryx_module_resolve
|
## jerryx_module_resolve
|
||||||
|
|
||||||
|
|||||||
@@ -42,16 +42,56 @@ typedef struct jerryx_native_module_t
|
|||||||
*/
|
*/
|
||||||
#ifdef ENABLE_INIT_FINI
|
#ifdef ENABLE_INIT_FINI
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#error "`FEATURE_INIT_FINI` build flag isn't supported on Windows, because Microsoft Visual C/C++ Compiler \
|
/**
|
||||||
doesn't support library constructors and destructors."
|
* Only Visual Studio 2008 and upper version support for __pragma keyword
|
||||||
|
* refer to https://msdn.microsoft.com/en-us/library/d9x1s805(v=vs.90).aspx
|
||||||
|
*/
|
||||||
|
#if _MSC_VER >= 1500
|
||||||
|
#ifdef _WIN64
|
||||||
|
#define JERRYX_MSVC_INCLUDE_SYM(s) comment (linker, "/include:" #s)
|
||||||
|
#else /* !_WIN64 */
|
||||||
|
#define JERRYX_MSVC_INCLUDE_SYM(s) comment (linker, "/include:_" #s)
|
||||||
|
#endif /* _WIN64 */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define JERRYX_MSCV_EXTERN_C extern "C"
|
||||||
|
#else /* !__cplusplus */
|
||||||
|
#define JERRYX_MSCV_EXTERN_C
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#pragma section(".CRT$XCU", read)
|
||||||
|
#pragma section(".CRT$XTU", read)
|
||||||
|
|
||||||
|
#define JERRYX_MSVC_FUNCTION_ON_SECTION(sec_name, f) \
|
||||||
|
static void f (void); \
|
||||||
|
__pragma (JERRYX_MSVC_INCLUDE_SYM (f##_section)) __declspec(allocate (sec_name)) \
|
||||||
|
JERRYX_MSCV_EXTERN_C void (*f##_section) (void) = f; \
|
||||||
|
static void f (void)
|
||||||
|
|
||||||
|
#define JERRYX_MODULE_CONSTRUCTOR(f) JERRYX_MSVC_FUNCTION_ON_SECTION (".CRT$XCU", f)
|
||||||
|
#define JERRYX_MODULE_DESTRUCTOR(f) JERRYX_MSVC_FUNCTION_ON_SECTION (".CRT$XTU", f)
|
||||||
|
#else /* !(_MSC_VER >= 1500) */
|
||||||
|
#error "Only Visual Studio 2008 and upper version are supported."
|
||||||
|
#endif /* _MSC_VER >= 1500 */
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#define JERRYX_MODULE_CONSTRUCTOR(f) \
|
||||||
|
static void f (void) __attribute__ ((constructor)); \
|
||||||
|
static void f (void)
|
||||||
|
|
||||||
|
#define JERRYX_MODULE_DESTRUCTOR(f) \
|
||||||
|
static void f (void) __attribute__ ((destructor)); \
|
||||||
|
static void f (void)
|
||||||
|
#else /* __GNUC__ */
|
||||||
|
#error "`FEATURE_INIT_FINI` build flag isn't supported on this compiler"
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
#define JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE __attribute__ ((constructor))
|
|
||||||
#define JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
|
|
||||||
#define JERRYX_MODULE_REGISTRATION_QUALIFIER static
|
|
||||||
#else /* !ENABLE_INIT_FINI */
|
#else /* !ENABLE_INIT_FINI */
|
||||||
#define JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE
|
#define JERRYX_MODULE_CONSTRUCTOR(f) \
|
||||||
#define JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE
|
void f (void); \
|
||||||
#define JERRYX_MODULE_REGISTRATION_QUALIFIER
|
void f (void)
|
||||||
|
|
||||||
|
#define JERRYX_MODULE_DESTRUCTOR(f) \
|
||||||
|
void f (void); \
|
||||||
|
void f (void)
|
||||||
#endif /* ENABLE_INIT_FINI */
|
#endif /* ENABLE_INIT_FINI */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,21 +99,19 @@ doesn't support library constructors and destructors."
|
|||||||
*/
|
*/
|
||||||
#define JERRYX_NATIVE_MODULE(module_name, on_resolve_cb) JERRYX_NATIVE_MODULE_IMPLEM (module_name, on_resolve_cb)
|
#define JERRYX_NATIVE_MODULE(module_name, on_resolve_cb) JERRYX_NATIVE_MODULE_IMPLEM (module_name, on_resolve_cb)
|
||||||
|
|
||||||
#define JERRYX_NATIVE_MODULE_IMPLEM(module_name, on_resolve_cb) \
|
#define JERRYX_NATIVE_MODULE_IMPLEM(module_name, on_resolve_cb) \
|
||||||
static jerryx_native_module_t _##module_name##_definition = { .name_p = (jerry_char_t *) #module_name, \
|
static jerryx_native_module_t _##module_name##_definition = { .name_p = (jerry_char_t *) #module_name, \
|
||||||
.on_resolve_p = (on_resolve_cb), \
|
.on_resolve_p = (on_resolve_cb), \
|
||||||
.next_p = NULL }; \
|
.next_p = NULL }; \
|
||||||
\
|
\
|
||||||
JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_register (void) JERRYX_MODULE_CONSTRUCTOR_ATTRIBUTE; \
|
JERRYX_MODULE_CONSTRUCTOR (module_name##_register) \
|
||||||
JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_register (void) \
|
{ \
|
||||||
{ \
|
jerryx_native_module_register (&_##module_name##_definition); \
|
||||||
jerryx_native_module_register (&_##module_name##_definition); \
|
} \
|
||||||
} \
|
\
|
||||||
\
|
JERRYX_MODULE_DESTRUCTOR (module_name##_unregister) \
|
||||||
JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_unregister (void) JERRYX_MODULE_DESTRUCTOR_ATTRIBUTE; \
|
{ \
|
||||||
JERRYX_MODULE_REGISTRATION_QUALIFIER void module_name##_unregister (void) \
|
jerryx_native_module_unregister (&_##module_name##_definition); \
|
||||||
{ \
|
|
||||||
jerryx_native_module_unregister (&_##module_name##_definition); \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+1
-4
@@ -68,10 +68,7 @@ JERRY_UNITTESTS_OPTIONS = [
|
|||||||
OPTIONS_COMMON + OPTIONS_DOCTESTS + OPTIONS_PROFILE_ES51),
|
OPTIONS_COMMON + OPTIONS_DOCTESTS + OPTIONS_PROFILE_ES51),
|
||||||
Options('unittests-es5.1-init-fini',
|
Options('unittests-es5.1-init-fini',
|
||||||
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
|
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
|
||||||
+ ['--cmake-param=-DFEATURE_INIT_FINI=ON'],
|
+ ['--cmake-param=-DFEATURE_INIT_FINI=ON']),
|
||||||
skip=skip_if((sys.platform == 'win32'), 'FEATURE_INIT_FINI build flag isn\'t supported on Windows,' +
|
|
||||||
' because Microsoft Visual C/C++ Compiler doesn\'t support' +
|
|
||||||
' library constructors and destructors.')),
|
|
||||||
Options('unittests-es5.1-math',
|
Options('unittests-es5.1-math',
|
||||||
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
|
OPTIONS_COMMON + OPTIONS_UNITTESTS + OPTIONS_PROFILE_ES51
|
||||||
+ ['--jerry-math=on']),
|
+ ['--jerry-math=on']),
|
||||||
|
|||||||
Reference in New Issue
Block a user