Skip to content

Commit ebf07cf

Browse files
author
Gabriel Schulhof
committed
Implement basic per-context module data
Given an expected number of modules (JERRY_CONTEXT_MODULE_COUNT) which can be defined at compile time, reserve two pointers in each context for module-specific data: one void * for the data, and a function pointer for the deleter to be called when the context is discarded. The modules receive an index into the data array when they register. They can later use the index to store data in the context. Re #1717 JerryScript-DCO-1.0-Signed-off-by: Gabriel Schulhof [email protected]
1 parent 574dff5 commit ebf07cf

File tree

6 files changed

+83
-0
lines changed

6 files changed

+83
-0
lines changed

jerry-core/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ set(FEATURE_SNAPSHOT_SAVE OFF CACHE BOOL "Enable saving snapshot files?
3232
set(FEATURE_SYSTEM_ALLOCATOR OFF CACHE BOOL "Enable system allocator?")
3333
set(FEATURE_VALGRIND OFF CACHE BOOL "Enable Valgrind support?")
3434
set(FEATURE_VALGRIND_FREYA OFF CACHE BOOL "Enable Valgrind-Freya support?")
35+
set(FEATURE_MODULE_REGISTER OFF CACHE BOOL "Enable module registration support?")
3536
set(MEM_HEAP_SIZE_KB "512" CACHE STRING "Size of memory heap, in kilobytes")
3637

3738
if(FEATURE_SYSTEM_ALLOCATOR)
@@ -54,6 +55,7 @@ message(STATUS "FEATURE_SNAPSHOT_SAVE " ${FEATURE_SNAPSHOT_SAVE})
5455
message(STATUS "FEATURE_SYSTEM_ALLOCATOR " ${FEATURE_SYSTEM_ALLOCATOR})
5556
message(STATUS "FEATURE_VALGRIND " ${FEATURE_VALGRIND})
5657
message(STATUS "FEATURE_VALGRIND_FREYA " ${FEATURE_VALGRIND_FREYA})
58+
message(STATUS "FEATURE_MODULE_REGISTER " ${FEATURE_MODULE_REGISTER})
5759
message(STATUS "MEM_HEAP_SIZE_KB " ${MEM_HEAP_SIZE_KB})
5860

5961
# Include directories
@@ -241,6 +243,11 @@ if(FEATURE_VALGRIND_FREYA)
241243
set(INCLUDE_CORE ${INCLUDE_CORE} ${INCLUDE_THIRD_PARTY_VALGRIND})
242244
endif()
243245

246+
# Module registration
247+
if(FEATURE_MODULE_REGISTER)
248+
set(DEFINES_JERRY ${DEFINES_JERRY} JERRY_MODULE_REGISTER)
249+
endif()
250+
244251
# Size of heap
245252
math(EXPR MEM_HEAP_AREA_SIZE "${MEM_HEAP_SIZE_KB} * 1024")
246253
set(DEFINES_JERRY ${DEFINES_JERRY} CONFIG_MEM_HEAP_AREA_SIZE=${MEM_HEAP_AREA_SIZE})

jerry-core/jcontext/jcontext.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@
3434
*/
3535
#define JERRY_CONTEXT_FIRST_MEMBER ecma_builtin_objects
3636

37+
#ifndef JERRY_CONTEXT_MODULE_COUNT
38+
#define JERRY_CONTEXT_MODULE_COUNT 8
39+
#endif /* ndef JERRY_CONTEXT_MODULE_COUNT */
40+
41+
typedef struct
42+
{
43+
void (*deleter)(void *);
44+
void *data;
45+
} jerry_module_data_t;
46+
3747
/**
3848
* JerryScript context
3949
*
@@ -103,6 +113,9 @@ typedef struct
103113
uint8_t valgrind_freya_mempool_request; /**< Tells whether a pool manager
104114
* allocator request is in progress */
105115
#endif /* JERRY_VALGRIND_FREYA */
116+
#ifdef JERRY_MODULE_REGISTER
117+
jerry_module_data_t module_data[JERRY_CONTEXT_MODULE_COUNT];
118+
#endif /* JERRY_MODULE_REGISTER */
106119
} jerry_context_t;
107120

108121
/**

jerry-core/jerry.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2087,3 +2087,55 @@ jerry_dispatch_object_free_callback (ecma_external_pointer_t freecb_p, /**< poin
20872087

20882088
jerry_make_api_available ();
20892089
} /* jerry_dispatch_object_free_callback */
2090+
2091+
#ifdef JERRY_MODULE_REGISTER
2092+
/**
2093+
* Reserve a slot in the context for a module
2094+
*
2095+
* Returns: 0 or positive on success, -1 on failure.
2096+
*/
2097+
2098+
/* This value is context-independent */
2099+
static int module_index = -1;
2100+
int
2101+
jerry_register_module (void)
2102+
{
2103+
if (module_index == JERRY_CONTEXT_MODULE_COUNT - 1)
2104+
{
2105+
return -1;
2106+
}
2107+
return (++module_index);
2108+
} /* jerry_register_module */
2109+
2110+
/**
2111+
* Retrieve the module's data from the context
2112+
*
2113+
* Returns: The module's data on success, NULL of failure.
2114+
*/
2115+
void *
2116+
jerry_get_module_data (int index)
2117+
{
2118+
void *return_value = NULL;
2119+
2120+
if (index >= 0 && index < JERRY_CONTEXT_MODULE_COUNT)
2121+
{
2122+
return_value = (JERRY_CONTEXT (module_data)[index]).data;
2123+
}
2124+
2125+
return return_value;
2126+
} /* jerry_get_module_data */
2127+
2128+
/**
2129+
* Set the module's data for the context
2130+
*/
2131+
void
2132+
jerry_set_module_data (int index, void *data, void (*deleter)(void *))
2133+
{
2134+
if (index >= 0 && index < JERRY_CONTEXT_MODULE_COUNT)
2135+
{
2136+
(JERRY_CONTEXT (module_data)[index]).data = data;
2137+
(JERRY_CONTEXT (module_data)[index]).deleter = deleter;
2138+
}
2139+
} /* jerry_set_module_data */
2140+
2141+
#endif /* JERRY_MODULE_REGISTER */

jerry-core/jerryscript.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,13 @@ jerry_value_t jerry_exec_snapshot (const uint32_t *snapshot_p, size_t snapshot_s
343343
size_t jerry_parse_and_save_literals (const jerry_char_t *source_p, size_t source_size, bool is_strict,
344344
uint32_t *buffer_p, size_t buffer_size, bool is_c_format);
345345

346+
/**
347+
* Module management
348+
*/
349+
int jerry_register_module (void);
350+
void *jerry_get_module_data (int index);
351+
void jerry_set_module_data (int index, void *data, void (*deleter)(void *));
352+
346353
/**
347354
* @}
348355
*/

targets/particle/Makefile.particle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ jerrycore:
5656
-DFEATURE_ERROR_MESSAGES=OFF \
5757
-DFEATURE_VALGRIND=OFF \
5858
-DFEATURE_VALGRIND_FREYA=OFF \
59+
-DFEATURE_MODULE_REGISTER=OFF \
5960
-DFEATURE_CPOINTER_32_BIT=OFF \
6061
-DFEATURE_MEM_STRESS_TEST=OFF \
6162
-DFEATURE_MEM_STATS=OFF \

tools/build.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def devhelp(helpstring):
126126
help=devhelp('enable Valgrind support (%(choices)s; default: %(default)s)'))
127127
devgroup.add_argument('--valgrind-freya', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper,
128128
help=devhelp('enable Valgrind-Freya support (%(choices)s; default: %(default)s)'))
129+
devgroup.add_argument('--module-registration', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper,
130+
help=devhelp('enable module registration support (%(choices)s; default: %(default)s)'))
129131

130132
arguments = parser.parse_args(args)
131133
if arguments.devhelp:
@@ -177,6 +179,7 @@ def generate_build_options(arguments):
177179
build_options.append('-DFEATURE_REGEXP_DUMP=%s' % arguments.show_regexp_opcodes)
178180
build_options.append('-DFEATURE_VALGRIND=%s' % arguments.valgrind)
179181
build_options.append('-DFEATURE_VALGRIND_FREYA=%s' % arguments.valgrind_freya)
182+
build_options.append('-DFEATURE_MODULE_REGISTER=%s' % arguments.module_registration)
180183

181184
return build_options
182185

0 commit comments

Comments
 (0)