Skip to content

Commit 9d6c94a

Browse files
committed
Expose a function to set the max stack size.
The max stack size should be set to zero when the runtime is used by different threads to avoid JS_ThrowStackOverflow errors caused by js_get_stack_pointer() values that falls outside the rt->stack_limit calculated in another thread.
1 parent b0c1e5e commit 9d6c94a

File tree

1 file changed

+10
-3
lines changed

1 file changed

+10
-3
lines changed

src/sqlitejs.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1081,6 +1081,13 @@ void js_init_table0 (sqlite3_context *context, int argc, sqlite3_value **argv) {
10811081
js_init_table(context, false);
10821082
}
10831083

1084+
void js_set_max_stack_size (sqlite3_context *context, int argc, sqlite3_value **argv) {
1085+
globaljs_context *js = (globaljs_context *)sqlite3_user_data(context);
1086+
1087+
int stack_size = sqlite3_value_int(argv[0]);
1088+
JS_SetMaxStackSize(js->runtime, stack_size);
1089+
}
1090+
10841091
// MARK: -
10851092

10861093
const char *sqlitejs_version (void) {
@@ -1099,9 +1106,9 @@ APIEXPORT int sqlite3_js_init (sqlite3 *db, char **pzErrMsg, const sqlite3_api_r
10991106
globaljs_context *js = globaljs_init(db);
11001107
if (!js) return SQLITE_NOMEM;
11011108

1102-
const char *f_name[] = {"js_version", "js_version", "js_create_scalar", "js_create_aggregate", "js_create_window", "js_create_collation", "js_eval", "js_load_text", "js_load_blob", "js_init_table", "js_init_table"};
1103-
const void *f_ptr[] = {js_version0, js_version1, js_create_scalar, js_create_aggregate, js_create_window, js_create_collation, js_eval, js_load_text, js_load_blob, js_init_table0, js_init_table1};
1104-
int f_arg[] = {0, 1, 2, 4, 6, 2, 1, 1, 1, 0, 1};
1109+
const char *f_name[] = {"js_version", "js_version", "js_create_scalar", "js_create_aggregate", "js_create_window", "js_create_collation", "js_eval", "js_load_text", "js_load_blob", "js_init_table", "js_init_table", "js_set_max_stack_size"};
1110+
const void *f_ptr[] = {js_version0, js_version1, js_create_scalar, js_create_aggregate, js_create_window, js_create_collation, js_eval, js_load_text, js_load_blob, js_init_table0, js_init_table1, js_set_max_stack_size};
1111+
int f_arg[] = {0, 1, 2, 4, 6, 2, 1, 1, 1, 0, 1, 1};
11051112

11061113
size_t f_count = sizeof(f_name) / sizeof(const char *);
11071114
for (size_t i=0; i<f_count; ++i) {

0 commit comments

Comments
 (0)