diff --git a/lib/ruby_wasm/build/product/crossruby.rb b/lib/ruby_wasm/build/product/crossruby.rb index 3671faefb5..e6dd12d3a6 100644 --- a/lib/ruby_wasm/build/product/crossruby.rb +++ b/lib/ruby_wasm/build/product/crossruby.rb @@ -5,11 +5,12 @@ module RubyWasm class CrossRubyExtProduct < BuildProduct attr_reader :name - def initialize(srcdir, toolchain, ext_relative_path: nil) + def initialize(srcdir, toolchain, features:, ext_relative_path: nil) @srcdir, @toolchain = srcdir, toolchain # ext_relative_path is relative path from build dir # e.g. cgi-0.3.6/ext/cgi/escape @ext_relative_path = ext_relative_path || File.basename(srcdir) + @features = features @name = @ext_relative_path end @@ -76,6 +77,7 @@ def do_extconf(executor, crossruby) "#{@srcdir}/extconf.rb", "--target-rbconfig=#{rbconfig_rb}", ] + extconf_args << "--enable-component-model" if @features.support_component_model? executor.system Gem.ruby, *extconf_args end @@ -105,8 +107,10 @@ def do_legacy_extconf(executor, crossruby) # like "cgi/escape" instead of "escape" "-e", %Q(require "json"; File.write("#{metadata_json(crossruby)}", JSON.dump({target: $target}))), - "-I#{crossruby.build_dir}" + "-I#{crossruby.build_dir}", + "--", ] + extconf_args << "--enable-component-model" if @features.support_component_model? # Clear RUBYOPT to avoid loading unrelated bundle setup executor.system crossruby.baseruby_path, *extconf_args, diff --git a/lib/ruby_wasm/build/toolchain/wit_bindgen.rb b/lib/ruby_wasm/build/toolchain/wit_bindgen.rb index e444af6fa1..74b1fccc97 100644 --- a/lib/ruby_wasm/build/toolchain/wit_bindgen.rb +++ b/lib/ruby_wasm/build/toolchain/wit_bindgen.rb @@ -4,10 +4,10 @@ class WitBindgen def initialize( build_dir:, - revision: "251e84b89121751f79ac268629e9285082b2596d" + revision: "v0.24.0" ) @build_dir = build_dir - @tool_dir = File.join(@build_dir, "toolchain", "wit-bindgen") + @tool_dir = File.join(@build_dir, "toolchain", "wit-bindgen-#{revision}") @bin_path = File.join(@tool_dir, "bin", "wit-bindgen") @revision = revision end diff --git a/lib/ruby_wasm/packager/core.rb b/lib/ruby_wasm/packager/core.rb index 2fe65388b6..3ff713360a 100644 --- a/lib/ruby_wasm/packager/core.rb +++ b/lib/ruby_wasm/packager/core.rb @@ -162,6 +162,7 @@ def build_exts(executor, build) RubyWasm::CrossRubyExtProduct.new( ext_srcdir, build.toolchain, + features: @packager.features, ext_relative_path: ext_relative_path ) end @@ -323,6 +324,7 @@ def user_exts(build) RubyWasm::CrossRubyExtProduct.new( ext_srcdir, build.toolchain, + features: @packager.features, ext_relative_path: ext_relative_path ) end diff --git a/packages/gems/js/ext/js/bindgen/ext.c b/packages/gems/js/ext/js/bindgen/ext.c new file mode 100644 index 0000000000..2c05b5f5f3 --- /dev/null +++ b/packages/gems/js/ext/js/bindgen/ext.c @@ -0,0 +1,566 @@ +// Generated by `wit-bindgen` 0.24.0. DO NOT EDIT! +#include "ext.h" +#include +#include + +// Imported Functions from `ruby:js/js-runtime` + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("eval-js"))) +extern void __wasm_import_ruby_js_js_runtime_eval_js(uint8_t *, size_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("is-js"))) +extern int32_t __wasm_import_ruby_js_js_runtime_is_js(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("instance-of"))) +extern int32_t __wasm_import_ruby_js_js_runtime_instance_of(int32_t, int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("global-this"))) +extern int32_t __wasm_import_ruby_js_js_runtime_global_this(void); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("int-to-js-number"))) +extern int32_t __wasm_import_ruby_js_js_runtime_int_to_js_number(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("float-to-js-number"))) +extern int32_t __wasm_import_ruby_js_js_runtime_float_to_js_number(double); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("string-to-js-string"))) +extern int32_t __wasm_import_ruby_js_js_runtime_string_to_js_string(uint8_t *, size_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("bool-to-js-bool"))) +extern int32_t __wasm_import_ruby_js_js_runtime_bool_to_js_bool(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("proc-to-js-function"))) +extern int32_t __wasm_import_ruby_js_js_runtime_proc_to_js_function(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("rb-object-to-js-rb-value"))) +extern int32_t __wasm_import_ruby_js_js_runtime_rb_object_to_js_rb_value(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("js-value-to-string"))) +extern void __wasm_import_ruby_js_js_runtime_js_value_to_string(int32_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("js-value-to-integer"))) +extern void __wasm_import_ruby_js_js_runtime_js_value_to_integer(int32_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("export-js-value-to-host"))) +extern void __wasm_import_ruby_js_js_runtime_export_js_value_to_host(int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("import-js-value-from-host"))) +extern int32_t __wasm_import_ruby_js_js_runtime_import_js_value_from_host(void); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("js-value-typeof"))) +extern void __wasm_import_ruby_js_js_runtime_js_value_typeof(int32_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("js-value-equal"))) +extern int32_t __wasm_import_ruby_js_js_runtime_js_value_equal(int32_t, int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("js-value-strictly-equal"))) +extern int32_t __wasm_import_ruby_js_js_runtime_js_value_strictly_equal(int32_t, int32_t); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("reflect-apply"))) +extern void __wasm_import_ruby_js_js_runtime_reflect_apply(int32_t, int32_t, uint8_t *, size_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("reflect-get"))) +extern void __wasm_import_ruby_js_js_runtime_reflect_get(int32_t, uint8_t *, size_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("reflect-set"))) +extern void __wasm_import_ruby_js_js_runtime_reflect_set(int32_t, uint8_t *, size_t, int32_t, uint8_t *); + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("throw-prohibit-rewind-exception"))) +extern void __wasm_import_ruby_js_js_runtime_throw_prohibit_rewind_exception(uint8_t *, size_t); + +// Exported Functions from `ruby:js/ruby-runtime` + + + + + + + + + + + + + +__attribute__((__weak__, __export_name__("cabi_post_ruby:js/ruby-runtime#rstring-ptr"))) +void __wasm_export_exports_ruby_js_ruby_runtime_rstring_ptr_post_return(uint8_t * arg0) { + if ((*((size_t*) (arg0 + 4))) > 0) { + free(*((uint8_t **) (arg0 + 0))); + } +} + + + + + + + +// Canonical ABI intrinsics + +__attribute__((__weak__, __export_name__("cabi_realloc"))) +void *cabi_realloc(void *ptr, size_t old_size, size_t align, size_t new_size) { + (void) old_size; + if (new_size == 0) return (void*) align; + void *ret = realloc(ptr, new_size); + if (!ret) abort(); + return ret; +} + +// Helper Functions + +__attribute__((__import_module__("ruby:js/js-runtime"), __import_name__("[resource-drop]js-abi-value"))) +extern void __wasm_import_ruby_js_js_runtime_js_abi_value_drop(int32_t handle); + +void ruby_js_js_runtime_js_abi_value_drop_own(ruby_js_js_runtime_own_js_abi_value_t handle) { + __wasm_import_ruby_js_js_runtime_js_abi_value_drop(handle.__handle); +} + +ruby_js_js_runtime_borrow_js_abi_value_t ruby_js_js_runtime_borrow_js_abi_value(ruby_js_js_runtime_own_js_abi_value_t arg) { + return (ruby_js_js_runtime_borrow_js_abi_value_t) { arg.__handle }; +} + +void ruby_js_js_runtime_js_abi_result_free(ruby_js_js_runtime_js_abi_result_t *ptr) { + switch ((int32_t) ptr->tag) { + case 0: { + break; + } + case 1: { + break; + } + } +} + +void ruby_js_js_runtime_raw_integer_free(ruby_js_js_runtime_raw_integer_t *ptr) { + switch ((int32_t) ptr->tag) { + case 0: { + break; + } + case 1: { + ext_string_free(&ptr->val.bignum); + break; + } + } +} + +void ruby_js_js_runtime_list_borrow_js_abi_value_free(ruby_js_js_runtime_list_borrow_js_abi_value_t *ptr) { + size_t list_len = ptr->len; + if (list_len > 0) { + ruby_js_js_runtime_borrow_js_abi_value_t *list_ptr = ptr->ptr; + for (size_t i = 0; i < list_len; i++) { + } + free(list_ptr); + } +} + +__attribute__((__import_module__("ruby:js/ruby-runtime"), __import_name__("[resource-drop]rb-iseq"))) +extern void __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_drop(int32_t handle); + +void exports_ruby_js_ruby_runtime_rb_iseq_drop_own(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle) { + __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_drop(handle.__handle); +} + +__attribute__(( __import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-new]rb-iseq"))) +extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_new(int32_t); + +__attribute__((__import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-rep]rb-iseq"))) +extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_rep(int32_t); + +exports_ruby_js_ruby_runtime_own_rb_iseq_t exports_ruby_js_ruby_runtime_rb_iseq_new(exports_ruby_js_ruby_runtime_rb_iseq_t *rep) { + return (exports_ruby_js_ruby_runtime_own_rb_iseq_t) { __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_new((int32_t) rep) }; +} + +exports_ruby_js_ruby_runtime_rb_iseq_t* exports_ruby_js_ruby_runtime_rb_iseq_rep(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle) { + return (exports_ruby_js_ruby_runtime_rb_iseq_t*) __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_rep(handle.__handle); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#[dtor]rb_iseq"))) +void __wasm_export_exports_ruby_js_ruby_runtime_rb_iseq_dtor(exports_ruby_js_ruby_runtime_rb_iseq_t* arg) { + exports_ruby_js_ruby_runtime_rb_iseq_destructor(arg); +} + +__attribute__((__import_module__("ruby:js/ruby-runtime"), __import_name__("[resource-drop]rb-abi-value"))) +extern void __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_drop(int32_t handle); + +void exports_ruby_js_ruby_runtime_rb_abi_value_drop_own(exports_ruby_js_ruby_runtime_own_rb_abi_value_t handle) { + __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_drop(handle.__handle); +} + +__attribute__(( __import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-new]rb-abi-value"))) +extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_new(int32_t); + +__attribute__((__import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-rep]rb-abi-value"))) +extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_rep(int32_t); + +exports_ruby_js_ruby_runtime_own_rb_abi_value_t exports_ruby_js_ruby_runtime_rb_abi_value_new(exports_ruby_js_ruby_runtime_rb_abi_value_t *rep) { + return (exports_ruby_js_ruby_runtime_own_rb_abi_value_t) { __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_new((int32_t) rep) }; +} + +exports_ruby_js_ruby_runtime_rb_abi_value_t* exports_ruby_js_ruby_runtime_rb_abi_value_rep(exports_ruby_js_ruby_runtime_own_rb_abi_value_t handle) { + return (exports_ruby_js_ruby_runtime_rb_abi_value_t*) __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_rep(handle.__handle); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#[dtor]rb_abi_value"))) +void __wasm_export_exports_ruby_js_ruby_runtime_rb_abi_value_dtor(exports_ruby_js_ruby_runtime_rb_abi_value_t* arg) { + exports_ruby_js_ruby_runtime_rb_abi_value_destructor(arg); +} + +void ext_list_string_free(ext_list_string_t *ptr) { + size_t list_len = ptr->len; + if (list_len > 0) { + ext_string_t *list_ptr = ptr->ptr; + for (size_t i = 0; i < list_len; i++) { + ext_string_free(&list_ptr[i]); + } + free(list_ptr); + } +} + +void exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_free(exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t *ptr) { + size_t list_len = ptr->len; + if (list_len > 0) { + exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t *list_ptr = ptr->ptr; + for (size_t i = 0; i < list_len; i++) { + } + free(list_ptr); + } +} + +void ext_string_set(ext_string_t *ret, const char*s) { + ret->ptr = (uint8_t*) s; + ret->len = strlen(s); +} + +void ext_string_dup(ext_string_t *ret, const char*s) { + ret->len = strlen(s); + ret->ptr = (uint8_t*) cabi_realloc(NULL, 0, 1, ret->len * 1); + memcpy(ret->ptr, s, ret->len * 1); +} + +void ext_string_free(ext_string_t *ret) { + if (ret->len > 0) { + free(ret->ptr); + } + ret->ptr = NULL; + ret->len = 0; +} + +// Component Adapters + +__attribute__((__aligned__(4))) +static uint8_t RET_AREA[8]; + +void ruby_js_js_runtime_eval_js(ext_string_t *code, ruby_js_js_runtime_js_abi_result_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_eval_js((uint8_t *) (*code).ptr, (*code).len, ptr); + ruby_js_js_runtime_js_abi_result_t variant; + variant.tag = (int32_t) *((uint8_t*) (ptr + 0)); + switch ((int32_t) variant.tag) { + case 0: { + variant.val.success = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + case 1: { + variant.val.failure = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + } + *ret = variant; +} + +bool ruby_js_js_runtime_is_js(ruby_js_js_runtime_borrow_js_abi_value_t value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_is_js((value).__handle); + return ret; +} + +bool ruby_js_js_runtime_instance_of(ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_borrow_js_abi_value_t klass) { + int32_t ret = __wasm_import_ruby_js_js_runtime_instance_of((value).__handle, (klass).__handle); + return ret; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_global_this(void) { + int32_t ret = __wasm_import_ruby_js_js_runtime_global_this(); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_int_to_js_number(int32_t value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_int_to_js_number(value); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_float_to_js_number(double value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_float_to_js_number(value); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_string_to_js_string(ext_string_t *value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_string_to_js_string((uint8_t *) (*value).ptr, (*value).len); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_bool_to_js_bool(bool value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_bool_to_js_bool(value); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_proc_to_js_function(uint32_t value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_proc_to_js_function((int32_t) (value)); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_rb_object_to_js_rb_value(uint32_t raw_rb_abi_value) { + int32_t ret = __wasm_import_ruby_js_js_runtime_rb_object_to_js_rb_value((int32_t) (raw_rb_abi_value)); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +void ruby_js_js_runtime_js_value_to_string(ruby_js_js_runtime_borrow_js_abi_value_t value, ext_string_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_js_value_to_string((value).__handle, ptr); + *ret = (ext_string_t) { (uint8_t*)(*((uint8_t **) (ptr + 0))), (*((size_t*) (ptr + 4))) }; +} + +void ruby_js_js_runtime_js_value_to_integer(ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_raw_integer_t *ret) { + __attribute__((__aligned__(8))) + uint8_t ret_area[16]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_js_value_to_integer((value).__handle, ptr); + ruby_js_js_runtime_raw_integer_t variant; + variant.tag = (int32_t) *((uint8_t*) (ptr + 0)); + switch ((int32_t) variant.tag) { + case 0: { + variant.val.float_ = *((double*) (ptr + 8)); + break; + } + case 1: { + variant.val.bignum = (ext_string_t) { (uint8_t*)(*((uint8_t **) (ptr + 8))), (*((size_t*) (ptr + 12))) }; + break; + } + } + *ret = variant; +} + +void ruby_js_js_runtime_export_js_value_to_host(ruby_js_js_runtime_borrow_js_abi_value_t value) { + __wasm_import_ruby_js_js_runtime_export_js_value_to_host((value).__handle); +} + +ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_import_js_value_from_host(void) { + int32_t ret = __wasm_import_ruby_js_js_runtime_import_js_value_from_host(); + return (ruby_js_js_runtime_own_js_abi_value_t) { ret }; +} + +void ruby_js_js_runtime_js_value_typeof(ruby_js_js_runtime_borrow_js_abi_value_t value, ext_string_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_js_value_typeof((value).__handle, ptr); + *ret = (ext_string_t) { (uint8_t*)(*((uint8_t **) (ptr + 0))), (*((size_t*) (ptr + 4))) }; +} + +bool ruby_js_js_runtime_js_value_equal(ruby_js_js_runtime_borrow_js_abi_value_t lhs, ruby_js_js_runtime_borrow_js_abi_value_t rhs) { + int32_t ret = __wasm_import_ruby_js_js_runtime_js_value_equal((lhs).__handle, (rhs).__handle); + return ret; +} + +bool ruby_js_js_runtime_js_value_strictly_equal(ruby_js_js_runtime_borrow_js_abi_value_t lhs, ruby_js_js_runtime_borrow_js_abi_value_t rhs) { + int32_t ret = __wasm_import_ruby_js_js_runtime_js_value_strictly_equal((lhs).__handle, (rhs).__handle); + return ret; +} + +void ruby_js_js_runtime_reflect_apply(ruby_js_js_runtime_borrow_js_abi_value_t target, ruby_js_js_runtime_borrow_js_abi_value_t this_argument, ruby_js_js_runtime_list_borrow_js_abi_value_t *arguments, ruby_js_js_runtime_js_abi_result_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_reflect_apply((target).__handle, (this_argument).__handle, (uint8_t *) (*arguments).ptr, (*arguments).len, ptr); + ruby_js_js_runtime_js_abi_result_t variant; + variant.tag = (int32_t) *((uint8_t*) (ptr + 0)); + switch ((int32_t) variant.tag) { + case 0: { + variant.val.success = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + case 1: { + variant.val.failure = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + } + *ret = variant; +} + +void ruby_js_js_runtime_reflect_get(ruby_js_js_runtime_borrow_js_abi_value_t target, ext_string_t *property_key, ruby_js_js_runtime_js_abi_result_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_reflect_get((target).__handle, (uint8_t *) (*property_key).ptr, (*property_key).len, ptr); + ruby_js_js_runtime_js_abi_result_t variant; + variant.tag = (int32_t) *((uint8_t*) (ptr + 0)); + switch ((int32_t) variant.tag) { + case 0: { + variant.val.success = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + case 1: { + variant.val.failure = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + } + *ret = variant; +} + +void ruby_js_js_runtime_reflect_set(ruby_js_js_runtime_borrow_js_abi_value_t target, ext_string_t *property_key, ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_js_abi_result_t *ret) { + __attribute__((__aligned__(4))) + uint8_t ret_area[8]; + uint8_t *ptr = (uint8_t *) &ret_area; + __wasm_import_ruby_js_js_runtime_reflect_set((target).__handle, (uint8_t *) (*property_key).ptr, (*property_key).len, (value).__handle, ptr); + ruby_js_js_runtime_js_abi_result_t variant; + variant.tag = (int32_t) *((uint8_t*) (ptr + 0)); + switch ((int32_t) variant.tag) { + case 0: { + variant.val.success = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + case 1: { + variant.val.failure = (ruby_js_js_runtime_own_js_abi_value_t) { *((int32_t*) (ptr + 4)) }; + break; + } + } + *ret = variant; +} + +void ruby_js_js_runtime_throw_prohibit_rewind_exception(ext_string_t *message) { + __wasm_import_ruby_js_js_runtime_throw_prohibit_rewind_exception((uint8_t *) (*message).ptr, (*message).len); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#[constructor]rb-abi-value"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_constructor_rb_abi_value(void) { + exports_ruby_js_ruby_runtime_own_rb_abi_value_t ret = exports_ruby_js_ruby_runtime_constructor_rb_abi_value(); + return (ret).__handle; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-show-version"))) +void __wasm_export_exports_ruby_js_ruby_runtime_ruby_show_version(void) { + exports_ruby_js_ruby_runtime_ruby_show_version(); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-init"))) +void __wasm_export_exports_ruby_js_ruby_runtime_ruby_init(void) { + exports_ruby_js_ruby_runtime_ruby_init(); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-sysinit"))) +void __wasm_export_exports_ruby_js_ruby_runtime_ruby_sysinit(uint8_t * arg, size_t arg0) { + ext_list_string_t arg1 = (ext_list_string_t) { (ext_string_t*)(arg), (arg0) }; + exports_ruby_js_ruby_runtime_ruby_sysinit(&arg1); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-options"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_ruby_options(uint8_t * arg, size_t arg0) { + ext_list_string_t arg1 = (ext_list_string_t) { (ext_string_t*)(arg), (arg0) }; + exports_ruby_js_ruby_runtime_own_rb_iseq_t ret = exports_ruby_js_ruby_runtime_ruby_options(&arg1); + return (ret).__handle; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-script"))) +void __wasm_export_exports_ruby_js_ruby_runtime_ruby_script(uint8_t * arg, size_t arg0) { + ext_string_t arg1 = (ext_string_t) { (uint8_t*)(arg), (arg0) }; + exports_ruby_js_ruby_runtime_ruby_script(&arg1); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#ruby-init-loadpath"))) +void __wasm_export_exports_ruby_js_ruby_runtime_ruby_init_loadpath(void) { + exports_ruby_js_ruby_runtime_ruby_init_loadpath(); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-eval-string-protect"))) +uint8_t * __wasm_export_exports_ruby_js_ruby_runtime_rb_eval_string_protect(uint8_t * arg, size_t arg0) { + ext_string_t arg1 = (ext_string_t) { (uint8_t*)(arg), (arg0) }; + exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t ret; + exports_ruby_js_ruby_runtime_rb_eval_string_protect(&arg1, &ret); + uint8_t *ptr = (uint8_t *) &RET_AREA; + *((int32_t*)(ptr + 0)) = ((ret).f0).__handle; + *((int32_t*)(ptr + 4)) = (ret).f1; + return ptr; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-funcallv-protect"))) +uint8_t * __wasm_export_exports_ruby_js_ruby_runtime_rb_funcallv_protect(int32_t arg, int32_t arg0, uint8_t * arg1, size_t arg2) { + exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t arg3 = (exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t) { (exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t*)(arg1), (arg2) }; + exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t ret; + exports_ruby_js_ruby_runtime_rb_funcallv_protect(((exports_ruby_js_ruby_runtime_rb_abi_value_t*) arg), (uint32_t) (arg0), &arg3, &ret); + uint8_t *ptr = (uint8_t *) &RET_AREA; + *((int32_t*)(ptr + 0)) = ((ret).f0).__handle; + *((int32_t*)(ptr + 4)) = (ret).f1; + return ptr; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-intern"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_rb_intern(uint8_t * arg, size_t arg0) { + ext_string_t arg1 = (ext_string_t) { (uint8_t*)(arg), (arg0) }; + exports_ruby_js_ruby_runtime_rb_id_t ret = exports_ruby_js_ruby_runtime_rb_intern(&arg1); + return (int32_t) (ret); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-errinfo"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_rb_errinfo(void) { + exports_ruby_js_ruby_runtime_own_rb_abi_value_t ret = exports_ruby_js_ruby_runtime_rb_errinfo(); + return (ret).__handle; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-clear-errinfo"))) +void __wasm_export_exports_ruby_js_ruby_runtime_rb_clear_errinfo(void) { + exports_ruby_js_ruby_runtime_rb_clear_errinfo(); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rstring-ptr"))) +uint8_t * __wasm_export_exports_ruby_js_ruby_runtime_rstring_ptr(int32_t arg) { + ext_string_t ret; + exports_ruby_js_ruby_runtime_rstring_ptr(((exports_ruby_js_ruby_runtime_rb_abi_value_t*) arg), &ret); + uint8_t *ptr = (uint8_t *) &RET_AREA; + *((size_t*)(ptr + 4)) = (ret).len; + *((uint8_t **)(ptr + 0)) = (uint8_t *) (ret).ptr; + return ptr; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-vm-bugreport"))) +void __wasm_export_exports_ruby_js_ruby_runtime_rb_vm_bugreport(void) { + exports_ruby_js_ruby_runtime_rb_vm_bugreport(); +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-gc-enable"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_rb_gc_enable(void) { + bool ret = exports_ruby_js_ruby_runtime_rb_gc_enable(); + return ret; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-gc-disable"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_rb_gc_disable(void) { + bool ret = exports_ruby_js_ruby_runtime_rb_gc_disable(); + return ret; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#rb-set-should-prohibit-rewind"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_rb_set_should_prohibit_rewind(int32_t arg) { + bool ret = exports_ruby_js_ruby_runtime_rb_set_should_prohibit_rewind(arg); + return ret; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#wrap-js-value"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_wrap_js_value(int32_t arg) { + exports_ruby_js_ruby_runtime_own_rb_abi_value_t ret = exports_ruby_js_ruby_runtime_wrap_js_value((exports_ruby_js_ruby_runtime_own_js_abi_value_t) { arg }); + return (ret).__handle; +} + +__attribute__((__export_name__("ruby:js/ruby-runtime#to-js-value"))) +int32_t __wasm_export_exports_ruby_js_ruby_runtime_to_js_value(int32_t arg) { + exports_ruby_js_ruby_runtime_own_js_abi_value_t ret = exports_ruby_js_ruby_runtime_to_js_value(((exports_ruby_js_ruby_runtime_rb_abi_value_t*) arg)); + return (ret).__handle; +} + +// Ensure that the *_component_type.o object is linked in + +extern void __component_type_object_force_link_ext(void); +void __component_type_object_force_link_ext_public_use_in_this_compilation_unit(void) { + __component_type_object_force_link_ext(); +} diff --git a/packages/gems/js/ext/js/bindgen/ext.h b/packages/gems/js/ext/js/bindgen/ext.h new file mode 100644 index 0000000000..2a71c53a06 --- /dev/null +++ b/packages/gems/js/ext/js/bindgen/ext.h @@ -0,0 +1,174 @@ +// Generated by `wit-bindgen` 0.24.0. DO NOT EDIT! +#ifndef __BINDINGS_EXT_H +#define __BINDINGS_EXT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef struct ext_string_t { + uint8_t*ptr; + size_t len; +} ext_string_t; + +typedef struct ruby_js_js_runtime_own_js_abi_value_t { + int32_t __handle; +} ruby_js_js_runtime_own_js_abi_value_t; + +typedef struct ruby_js_js_runtime_borrow_js_abi_value_t { + int32_t __handle; +} ruby_js_js_runtime_borrow_js_abi_value_t; + +typedef struct ruby_js_js_runtime_js_abi_result_t { + uint8_t tag; + union { + ruby_js_js_runtime_own_js_abi_value_t success; + ruby_js_js_runtime_own_js_abi_value_t failure; + } val; +} ruby_js_js_runtime_js_abi_result_t; + +#define RUBY_JS_JS_RUNTIME_JS_ABI_RESULT_SUCCESS 0 +#define RUBY_JS_JS_RUNTIME_JS_ABI_RESULT_FAILURE 1 + +typedef struct ruby_js_js_runtime_raw_integer_t { + uint8_t tag; + union { + double float_; + ext_string_t bignum; + } val; +} ruby_js_js_runtime_raw_integer_t; + +#define RUBY_JS_JS_RUNTIME_RAW_INTEGER_FLOAT 0 +#define RUBY_JS_JS_RUNTIME_RAW_INTEGER_BIGNUM 1 + +typedef struct ruby_js_js_runtime_list_borrow_js_abi_value_t { + ruby_js_js_runtime_borrow_js_abi_value_t *ptr; + size_t len; +} ruby_js_js_runtime_list_borrow_js_abi_value_t; + +typedef struct exports_ruby_js_ruby_runtime_own_rb_iseq_t { + int32_t __handle; +} exports_ruby_js_ruby_runtime_own_rb_iseq_t; + +typedef struct exports_ruby_js_ruby_runtime_rb_iseq_t exports_ruby_js_ruby_runtime_rb_iseq_t; + +typedef exports_ruby_js_ruby_runtime_rb_iseq_t* exports_ruby_js_ruby_runtime_borrow_rb_iseq_t; + +typedef struct exports_ruby_js_ruby_runtime_own_rb_abi_value_t { + int32_t __handle; +} exports_ruby_js_ruby_runtime_own_rb_abi_value_t; + +typedef struct exports_ruby_js_ruby_runtime_rb_abi_value_t exports_ruby_js_ruby_runtime_rb_abi_value_t; + +typedef exports_ruby_js_ruby_runtime_rb_abi_value_t* exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t; + +typedef int32_t exports_ruby_js_ruby_runtime_rb_errno_t; + +typedef uint32_t exports_ruby_js_ruby_runtime_rb_id_t; + +typedef struct ext_list_string_t { + ext_string_t *ptr; + size_t len; +} ext_list_string_t; + +typedef struct exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t { + exports_ruby_js_ruby_runtime_own_rb_abi_value_t f0; + int32_t f1; +} exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t; + +typedef struct exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t { + exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t *ptr; + size_t len; +} exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t; + +typedef ruby_js_js_runtime_own_js_abi_value_t exports_ruby_js_ruby_runtime_own_js_abi_value_t; + +// Imported Functions from `ruby:js/js-runtime` +extern void ruby_js_js_runtime_eval_js(ext_string_t *code, ruby_js_js_runtime_js_abi_result_t *ret); +extern bool ruby_js_js_runtime_is_js(ruby_js_js_runtime_borrow_js_abi_value_t value); +extern bool ruby_js_js_runtime_instance_of(ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_borrow_js_abi_value_t klass); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_global_this(void); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_int_to_js_number(int32_t value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_float_to_js_number(double value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_string_to_js_string(ext_string_t *value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_bool_to_js_bool(bool value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_proc_to_js_function(uint32_t value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_rb_object_to_js_rb_value(uint32_t raw_rb_abi_value); +extern void ruby_js_js_runtime_js_value_to_string(ruby_js_js_runtime_borrow_js_abi_value_t value, ext_string_t *ret); +extern void ruby_js_js_runtime_js_value_to_integer(ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_raw_integer_t *ret); +extern void ruby_js_js_runtime_export_js_value_to_host(ruby_js_js_runtime_borrow_js_abi_value_t value); +extern ruby_js_js_runtime_own_js_abi_value_t ruby_js_js_runtime_import_js_value_from_host(void); +extern void ruby_js_js_runtime_js_value_typeof(ruby_js_js_runtime_borrow_js_abi_value_t value, ext_string_t *ret); +extern bool ruby_js_js_runtime_js_value_equal(ruby_js_js_runtime_borrow_js_abi_value_t lhs, ruby_js_js_runtime_borrow_js_abi_value_t rhs); +extern bool ruby_js_js_runtime_js_value_strictly_equal(ruby_js_js_runtime_borrow_js_abi_value_t lhs, ruby_js_js_runtime_borrow_js_abi_value_t rhs); +extern void ruby_js_js_runtime_reflect_apply(ruby_js_js_runtime_borrow_js_abi_value_t target, ruby_js_js_runtime_borrow_js_abi_value_t this_argument, ruby_js_js_runtime_list_borrow_js_abi_value_t *arguments, ruby_js_js_runtime_js_abi_result_t *ret); +extern void ruby_js_js_runtime_reflect_get(ruby_js_js_runtime_borrow_js_abi_value_t target, ext_string_t *property_key, ruby_js_js_runtime_js_abi_result_t *ret); +extern void ruby_js_js_runtime_reflect_set(ruby_js_js_runtime_borrow_js_abi_value_t target, ext_string_t *property_key, ruby_js_js_runtime_borrow_js_abi_value_t value, ruby_js_js_runtime_js_abi_result_t *ret); +extern void ruby_js_js_runtime_throw_prohibit_rewind_exception(ext_string_t *message); + +// Exported Functions from `ruby:js/ruby-runtime` +exports_ruby_js_ruby_runtime_own_rb_abi_value_t exports_ruby_js_ruby_runtime_constructor_rb_abi_value(void); +void exports_ruby_js_ruby_runtime_ruby_show_version(void); +void exports_ruby_js_ruby_runtime_ruby_init(void); +void exports_ruby_js_ruby_runtime_ruby_sysinit(ext_list_string_t *args); +exports_ruby_js_ruby_runtime_own_rb_iseq_t exports_ruby_js_ruby_runtime_ruby_options(ext_list_string_t *args); +void exports_ruby_js_ruby_runtime_ruby_script(ext_string_t *name); +void exports_ruby_js_ruby_runtime_ruby_init_loadpath(void); +void exports_ruby_js_ruby_runtime_rb_eval_string_protect(ext_string_t *str, exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t *ret); +void exports_ruby_js_ruby_runtime_rb_funcallv_protect(exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t recv, exports_ruby_js_ruby_runtime_rb_id_t mid, exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t *args, exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t *ret); +exports_ruby_js_ruby_runtime_rb_id_t exports_ruby_js_ruby_runtime_rb_intern(ext_string_t *name); +exports_ruby_js_ruby_runtime_own_rb_abi_value_t exports_ruby_js_ruby_runtime_rb_errinfo(void); +void exports_ruby_js_ruby_runtime_rb_clear_errinfo(void); +void exports_ruby_js_ruby_runtime_rstring_ptr(exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t value, ext_string_t *ret); +void exports_ruby_js_ruby_runtime_rb_vm_bugreport(void); +bool exports_ruby_js_ruby_runtime_rb_gc_enable(void); +bool exports_ruby_js_ruby_runtime_rb_gc_disable(void); +bool exports_ruby_js_ruby_runtime_rb_set_should_prohibit_rewind(bool new_value); +exports_ruby_js_ruby_runtime_own_rb_abi_value_t exports_ruby_js_ruby_runtime_wrap_js_value(exports_ruby_js_ruby_runtime_own_js_abi_value_t value); +exports_ruby_js_ruby_runtime_own_js_abi_value_t exports_ruby_js_ruby_runtime_to_js_value(exports_ruby_js_ruby_runtime_borrow_rb_abi_value_t value); + +// Helper Functions + +extern void ruby_js_js_runtime_js_abi_value_drop_own(ruby_js_js_runtime_own_js_abi_value_t handle); + +extern ruby_js_js_runtime_borrow_js_abi_value_t ruby_js_js_runtime_borrow_js_abi_value(ruby_js_js_runtime_own_js_abi_value_t handle); + +void ruby_js_js_runtime_js_abi_result_free(ruby_js_js_runtime_js_abi_result_t *ptr); + +void ruby_js_js_runtime_raw_integer_free(ruby_js_js_runtime_raw_integer_t *ptr); + +void ruby_js_js_runtime_list_borrow_js_abi_value_free(ruby_js_js_runtime_list_borrow_js_abi_value_t *ptr); + +extern void exports_ruby_js_ruby_runtime_rb_iseq_drop_own(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle); + +extern exports_ruby_js_ruby_runtime_own_rb_iseq_t exports_ruby_js_ruby_runtime_rb_iseq_new(exports_ruby_js_ruby_runtime_rb_iseq_t *rep); +extern exports_ruby_js_ruby_runtime_rb_iseq_t* exports_ruby_js_ruby_runtime_rb_iseq_rep(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle); +void exports_ruby_js_ruby_runtime_rb_iseq_destructor(exports_ruby_js_ruby_runtime_rb_iseq_t *rep); + +extern void exports_ruby_js_ruby_runtime_rb_abi_value_drop_own(exports_ruby_js_ruby_runtime_own_rb_abi_value_t handle); + +extern exports_ruby_js_ruby_runtime_own_rb_abi_value_t exports_ruby_js_ruby_runtime_rb_abi_value_new(exports_ruby_js_ruby_runtime_rb_abi_value_t *rep); +extern exports_ruby_js_ruby_runtime_rb_abi_value_t* exports_ruby_js_ruby_runtime_rb_abi_value_rep(exports_ruby_js_ruby_runtime_own_rb_abi_value_t handle); +void exports_ruby_js_ruby_runtime_rb_abi_value_destructor(exports_ruby_js_ruby_runtime_rb_abi_value_t *rep); + +void ext_list_string_free(ext_list_string_t *ptr); + +void exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_free(exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t *ptr); + +// Transfers ownership of `s` into the string `ret` +void ext_string_set(ext_string_t *ret, const char*s); + +// Creates a copy of the input nul-terminate string `s` and +// stores it into the component model string `ret`. +void ext_string_dup(ext_string_t *ret, const char*s); + +// Deallocates the string pointed to by `ret`, deallocating +// the memory behind the string. +void ext_string_free(ext_string_t *ret); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/packages/gems/js/ext/js/bindgen/ext_component_type.o b/packages/gems/js/ext/js/bindgen/ext_component_type.o new file mode 100644 index 0000000000..c48b62f0c1 Binary files /dev/null and b/packages/gems/js/ext/js/bindgen/ext_component_type.o differ diff --git a/packages/gems/js/ext/js/depend b/packages/gems/js/ext/js/depend index be6a5059e8..4166bd828f 100644 --- a/packages/gems/js/ext/js/depend +++ b/packages/gems/js/ext/js/depend @@ -1,5 +1,6 @@ link.filelist: echo $(foreach obj,$(OBJS),$(abspath $(obj))) > $@ + echo $(EXTRA_OBJS) >> $@ echo -mexec-model=reactor >> $@ js.a: link.filelist @@ -9,3 +10,7 @@ js-core.o: $(srcdir)/bindgen/legacy/rb-js-abi-host.h bindgen/legacy/%.o: $(srcdir)/bindgen/legacy/%.c @mkdir -p "$(@D)" $(CC) -c -I$(srcdir)/bindgen/legacy -o $@ $< + +bindgen/ext.o: $(srcdir)/bindgen/ext.c + @mkdir -p "$(@D)" + $(CC) -c -o $@ $< diff --git a/packages/gems/js/ext/js/extconf.rb b/packages/gems/js/ext/js/extconf.rb index 86a2b7fbf6..fb8ed2fb47 100644 --- a/packages/gems/js/ext/js/extconf.rb +++ b/packages/gems/js/ext/js/extconf.rb @@ -1,3 +1,16 @@ require "mkmf" -$objs = %w[js-core.o witapi-core.o bindgen/legacy/rb-js-abi-host.o bindgen/legacy/rb-abi-guest.o] -create_makefile("js") +$objs = %w[js-core.o witapi-core.o] + +use_component_model = enable_config("component-model", false) +$stderr.print "Building with component model: " +$stderr.puts use_component_model ? "\e[1;32myes\e[0m" : "\e[1;31mno\e[0m" +if use_component_model + $defs << "-DJS_ENABLE_COMPONENT_MODEL=1" + $objs << "bindgen/ext.o" +else + $objs << "bindgen/legacy/rb-js-abi-host.o" + $objs << "bindgen/legacy/rb-abi-guest.o" +end +create_makefile("js") do |mk| + mk << "EXTRA_OBJS = $(srcdir)/bindgen/ext_component_type.o\n" if use_component_model +end diff --git a/packages/gems/js/wit/js-runtime.wit b/packages/gems/js/wit/js-runtime.wit new file mode 100644 index 0000000000..5ea8c974ee --- /dev/null +++ b/packages/gems/js/wit/js-runtime.wit @@ -0,0 +1,45 @@ +package ruby:js; + +interface js-runtime { + + resource js-abi-value {} + + variant js-abi-result { + success(js-abi-value), + failure(js-abi-value), + } + + eval-js: func(code: string) -> js-abi-result; + is-js: func(value: borrow) -> bool; + instance-of: func(value: borrow, klass: borrow) -> bool; + global-this: func() -> js-abi-value; + int-to-js-number: func(value: s32) -> js-abi-value; + float-to-js-number: func(value: float64) -> js-abi-value; + string-to-js-string: func(value: string) -> js-abi-value; + bool-to-js-bool: func(value: bool) -> js-abi-value; + proc-to-js-function: func(value: u32) -> js-abi-value; + rb-object-to-js-rb-value: func(raw-rb-abi-value: u32) -> js-abi-value; + + js-value-to-string: func(value: borrow) -> string; + + variant raw-integer { + float(float64), + bignum(string), + } + + js-value-to-integer: func(value: borrow) -> raw-integer; + + export-js-value-to-host: func(value: borrow); + import-js-value-from-host: func() -> js-abi-value; + + js-value-typeof: func(value: borrow) -> string; + + js-value-equal: func(lhs: borrow, rhs: borrow) -> bool; + js-value-strictly-equal: func(lhs: borrow, rhs: borrow) -> bool; + + reflect-apply: func(target: borrow, this-argument: borrow, arguments: list>) -> js-abi-result; + reflect-get: func(target: borrow, property-key: string) -> js-abi-result; + reflect-set: func(target: borrow, property-key: string, value: borrow) -> js-abi-result; + + throw-prohibit-rewind-exception: func(message: string); +} diff --git a/packages/gems/js/wit/ruby-runtime.wit b/packages/gems/js/wit/ruby-runtime.wit new file mode 100644 index 0000000000..d7259ebfe4 --- /dev/null +++ b/packages/gems/js/wit/ruby-runtime.wit @@ -0,0 +1,36 @@ +package ruby:js; + +interface ruby-runtime { + use js-runtime.{js-abi-value}; + + resource rb-iseq {} + resource rb-abi-value { + constructor(); + } + + type rb-errno = s32; + type rb-id = u32; + + ruby-show-version: func(); + ruby-init: func(); + ruby-sysinit: func(args: list); + ruby-options: func(args: list) -> rb-iseq; + ruby-script: func(name: string); + ruby-init-loadpath: func(); + rb-eval-string-protect: func(str: string) -> tuple; + rb-funcallv-protect: func(recv: borrow, mid: rb-id, args: list>) -> tuple; + rb-intern: func(name: string) -> rb-id; + rb-errinfo: func() -> rb-abi-value; + rb-clear-errinfo: func(); + + rstring-ptr: func(value: borrow) -> string; + + rb-vm-bugreport: func(); + + rb-gc-enable: func() -> bool; + rb-gc-disable: func() -> bool; + + rb-set-should-prohibit-rewind: func(new-value: bool) -> bool; + wrap-js-value: func(value: js-abi-value) -> rb-abi-value; + to-js-value: func(value: borrow) -> js-abi-value; +} diff --git a/packages/gems/js/wit/world.wit b/packages/gems/js/wit/world.wit new file mode 100644 index 0000000000..b9b2aecd21 --- /dev/null +++ b/packages/gems/js/wit/world.wit @@ -0,0 +1,6 @@ +package ruby:js; + +world ext { + import js-runtime; + export ruby-runtime; +} diff --git a/rakelib/check.rake b/rakelib/check.rake index 3d06c8e2f8..cb68b5795e 100644 --- a/rakelib/check.rake +++ b/rakelib/check.rake @@ -1,22 +1,24 @@ namespace :check do + legacy_wit_bindgen = RubyWasm::WitBindgen.new(build_dir: "build", revision: "251e84b89121751f79ac268629e9285082b2596d") wit_bindgen = RubyWasm::WitBindgen.new(build_dir: "build") task :install_wit_bindgen do + legacy_wit_bindgen.install wit_bindgen.install end - task bindgen_c: :install_wit_bindgen do + task legacy_bindgen_c: :install_wit_bindgen do wits = [ %w[packages/gems/js/ext/js/bindgen/legacy/rb-abi-guest.wit --export], %w[packages/gems/js/ext/js/bindgen/legacy/rb-js-abi-host.wit --import] ] wits.each do |wit| path, mode = wit - sh "#{wit_bindgen.bin_path} guest c #{mode} #{path} --out-dir #{File.dirname(path)}" + sh "#{legacy_wit_bindgen.bin_path} guest c #{mode} #{path} --out-dir #{File.dirname(path)}" end end - task bindgen_js: :install_wit_bindgen do + task legacy_bindgen_js: :install_wit_bindgen do sh *[ - wit_bindgen.bin_path, + legacy_wit_bindgen.bin_path, "host", "js", "--import", @@ -28,8 +30,19 @@ namespace :check do ] end + task bindgen_c: :install_wit_bindgen do + js_pkg_dir = "packages/gems/js" + sh( + wit_bindgen.bin_path, + "c", + File.join(js_pkg_dir, "wit"), + "--out-dir", + File.join(js_pkg_dir, "ext", "js", "bindgen") + ) + end + desc "Check wit-bindgen'ed sources are up-to-date" - task bindgen: %i[bindgen_c bindgen_js] + task bindgen: %i[bindgen_c legacy_bindgen_c legacy_bindgen_js] task :type do sh "bundle exec steep check" diff --git a/sig/ruby_wasm/build.rbs b/sig/ruby_wasm/build.rbs index c20f3aa36d..5f1b714d6b 100644 --- a/sig/ruby_wasm/build.rbs +++ b/sig/ruby_wasm/build.rbs @@ -158,9 +158,10 @@ module RubyWasm @toolchain: Toolchain @srcdir: String @ext_relative_path: String + @features: RubyWasm::FeatureSet attr_reader name: String - def initialize: (String srcdir, Toolchain toolchain, ?ext_relative_path: String?) -> void + def initialize: (String srcdir, Toolchain toolchain, features: RubyWasm::FeatureSet, ?ext_relative_path: String?) -> void def product_build_dir: (CrossRubyProduct crossruby) -> String def linklist: (CrossRubyProduct crossruby) -> String def metadata_json: (CrossRubyProduct crossruby) -> String