summaryrefslogtreecommitdiff
path: root/wasm/setjmp.c
diff options
context:
space:
mode:
authorYuta Saito <kateinoigakukun@gmail.com>2022-09-04 14:34:24 +0000
committerYuta Saito <kateinoigakukun@gmail.com>2023-05-16 03:52:59 +0900
commit8945143464de77ca43eba000f77c5d04a1cdabb8 (patch)
treec37218b4dd1b8b422d1be60fe7a19156e1f16921 /wasm/setjmp.c
parentab7bb38aca0d2b5c2b81142a8e67fbff0f1a4a8a (diff)
[wasm] Allocate asyncify buffer on heap to save stack usage
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/7818
Diffstat (limited to 'wasm/setjmp.c')
-rw-r--r--wasm/setjmp.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/wasm/setjmp.c b/wasm/setjmp.c
index 90420877a8..c782987454 100644
--- a/wasm/setjmp.c
+++ b/wasm/setjmp.c
@@ -84,6 +84,7 @@ _rb_wasm_setjmp_internal(rb_wasm_jmp_buf *env)
RB_WASM_DEBUG_LOG(" JMP_BUF_STATE_INITIALIZED");
env->state = JMP_BUF_STATE_CAPTURING;
env->payload = 0;
+ env->longjmp_buf_ptr = NULL;
_rb_wasm_active_jmpbuf = env;
async_buf_init(&env->setjmp_buf);
asyncify_start_unwind(&env->setjmp_buf);
@@ -100,6 +101,7 @@ _rb_wasm_setjmp_internal(rb_wasm_jmp_buf *env)
asyncify_stop_rewind();
RB_WASM_DEBUG_LOG(" JMP_BUF_STATE_RETURNING");
env->state = JMP_BUF_STATE_CAPTURED;
+ free(env->longjmp_buf_ptr);
_rb_wasm_active_jmpbuf = NULL;
return env->payload;
}
@@ -117,9 +119,10 @@ _rb_wasm_longjmp(rb_wasm_jmp_buf* env, int value)
assert(value != 0);
env->state = JMP_BUF_STATE_RETURNING;
env->payload = value;
+ env->longjmp_buf_ptr = malloc(sizeof(struct __rb_wasm_asyncify_jmp_buf));
_rb_wasm_active_jmpbuf = env;
- async_buf_init(&env->longjmp_buf);
- asyncify_start_unwind(&env->longjmp_buf);
+ async_buf_init(env->longjmp_buf_ptr);
+ asyncify_start_unwind(env->longjmp_buf_ptr);
}