Skip to content

Commit 0467534

Browse files
Call __wasm_call_ctors before calling any exported functions
This should be done by wit-bindgen, but it only does it for the Rust code generation. https://github.com/bytecodealliance/wit-bindgen/blob/c6dc35fb6966572cae64f2720dd08cc1bcfd0f9e/crates/guest-rust/src/lib.rs#L46 This is a workaround to make sure that the constructors are called before calling any exported functions manually.
1 parent 9881a46 commit 0467534

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

packages/gems/js/ext/js/witapi-core.c

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,63 +341,91 @@ bool rb_abi_guest_rb_set_should_prohibit_rewind(bool value) {
341341
}
342342

343343
#ifdef JS_ENABLE_COMPONENT_MODEL
344+
345+
extern void __wasm_call_ctors(void);
346+
static inline void __wasm_call_ctors_if_needed(void) {
347+
static bool __wasm_call_ctors_done = false;
348+
if (!__wasm_call_ctors_done) {
349+
__wasm_call_ctors_done = true;
350+
__wasm_call_ctors();
351+
}
352+
}
353+
344354
// Exported Functions from `ruby:js/ruby-runtime`
345355
void exports_ruby_js_ruby_runtime_ruby_show_version(void) {
356+
__wasm_call_ctors_if_needed();
346357
rb_abi_guest_ruby_show_version();
347358
}
348-
void exports_ruby_js_ruby_runtime_ruby_init(void) { rb_abi_guest_ruby_init(); }
359+
void exports_ruby_js_ruby_runtime_ruby_init(void) {
360+
__wasm_call_ctors_if_needed();
361+
rb_abi_guest_ruby_init();
362+
}
349363
void exports_ruby_js_ruby_runtime_ruby_sysinit(ext_list_string_t *args) {
364+
__wasm_call_ctors_if_needed();
350365
rb_abi_guest_ruby_sysinit(args);
351366
}
352367
exports_ruby_js_ruby_runtime_own_rb_iseq_t
353368
exports_ruby_js_ruby_runtime_ruby_options(ext_list_string_t *args) {
369+
__wasm_call_ctors_if_needed();
354370
return rb_abi_guest_ruby_options(args);
355371
}
356372
void exports_ruby_js_ruby_runtime_ruby_script(ext_string_t *name) {
373+
__wasm_call_ctors_if_needed();
357374
rb_abi_guest_ruby_script(name);
358375
}
359376
void exports_ruby_js_ruby_runtime_ruby_init_loadpath(void) {
377+
__wasm_call_ctors_if_needed();
360378
rb_abi_guest_ruby_init_loadpath();
361379
}
362380
void exports_ruby_js_ruby_runtime_rb_eval_string_protect(
363381
ext_string_t *str,
364382
exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t *ret) {
383+
__wasm_call_ctors_if_needed();
365384
rb_abi_guest_rb_eval_string_protect(str, ret);
366385
}
367386
void exports_ruby_js_ruby_runtime_rb_funcallv_protect(
368387
exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t recv,
369388
exports_ruby_js_ruby_runtime_rb_id_t mid,
370389
exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t *args,
371390
exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t *ret) {
391+
__wasm_call_ctors_if_needed();
372392
rb_abi_guest_rb_funcallv_protect(recv, mid, args, ret);
373393
}
374394
exports_ruby_js_ruby_runtime_rb_id_t
375395
exports_ruby_js_ruby_runtime_rb_intern(ext_string_t *name) {
396+
__wasm_call_ctors_if_needed();
376397
return rb_abi_guest_rb_intern(name);
377398
}
378399
exports_ruby_js_ruby_runtime_own_rb_abi_value_t
379400
exports_ruby_js_ruby_runtime_rb_errinfo(void) {
401+
__wasm_call_ctors_if_needed();
380402
return rb_abi_guest_rb_errinfo();
381403
}
382404
void exports_ruby_js_ruby_runtime_rb_clear_errinfo(void) {
405+
__wasm_call_ctors_if_needed();
383406
rb_abi_guest_rb_clear_errinfo();
384407
}
385408
void exports_ruby_js_ruby_runtime_rstring_ptr(
386409
exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t value,
387410
ext_string_t *ret) {
411+
__wasm_call_ctors_if_needed();
388412
rb_abi_guest_rstring_ptr(value, ret);
389413
}
390414
void exports_ruby_js_ruby_runtime_rb_vm_bugreport(void) {
415+
__wasm_call_ctors_if_needed();
391416
rb_abi_guest_rb_vm_bugreport();
392417
}
393418
bool exports_ruby_js_ruby_runtime_rb_gc_enable(void) {
419+
__wasm_call_ctors_if_needed();
394420
return rb_abi_guest_rb_gc_enable();
395421
}
396422
bool exports_ruby_js_ruby_runtime_rb_gc_disable(void) {
423+
__wasm_call_ctors_if_needed();
397424
return rb_abi_guest_rb_gc_disable();
398425
}
399426
bool exports_ruby_js_ruby_runtime_rb_set_should_prohibit_rewind(
400427
bool new_value) {
428+
__wasm_call_ctors_if_needed();
401429
return rb_abi_guest_rb_set_should_prohibit_rewind(new_value);
402430
}
403431

0 commit comments

Comments
 (0)