Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ jobs:
with:
fetch-depth: 0
- run: sudo apt-get install clang-format
- uses: ruby/setup-ruby@v1
- run: ./bin/setup
- run: ./tools/clang-format-diff.sh
- run: rake check:bindgen
- run: git diff --exit-code
- run: git diff --exit-code || (echo "Please run \`rake format\` and commit the changes" && exit 1)

build-builder-image:
strategy:
Expand Down
170 changes: 73 additions & 97 deletions ext/js/bindgen/rb-js-abi-host.c

Large diffs are not rendered by default.

12 changes: 5 additions & 7 deletions ext/js/bindgen/rb-js-abi-host.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ extern "C"
#include <stdint.h>
#include <stdbool.h>

typedef struct {
uint32_t idx;
} rb_js_abi_host_js_abi_value_t;
void rb_js_abi_host_js_abi_value_free(rb_js_abi_host_js_abi_value_t *ptr);
rb_js_abi_host_js_abi_value_t rb_js_abi_host_js_abi_value_clone(rb_js_abi_host_js_abi_value_t *ptr);

typedef struct {
char *ptr;
size_t len;
Expand All @@ -22,6 +16,10 @@ extern "C"
void rb_js_abi_host_string_set(rb_js_abi_host_string_t *ret, const char *s);
void rb_js_abi_host_string_dup(rb_js_abi_host_string_t *ret, const char *s);
void rb_js_abi_host_string_free(rb_js_abi_host_string_t *ret);
// A JavaScript value. In the future, this will be replaced by handle types.
// The underlying value should be owned by the JavaScript host environment
// and should live at least until all handles to it are dropped.
typedef uint32_t rb_js_abi_host_js_abi_value_t;
typedef struct {
uint8_t tag;
union {
Expand All @@ -31,7 +29,6 @@ extern "C"
} rb_js_abi_host_js_abi_result_t;
#define RB_JS_ABI_HOST_JS_ABI_RESULT_SUCCESS 0
#define RB_JS_ABI_HOST_JS_ABI_RESULT_FAILURE 1
void rb_js_abi_host_js_abi_result_free(rb_js_abi_host_js_abi_result_t *ptr);
typedef struct {
uint8_t tag;
union {
Expand All @@ -47,6 +44,7 @@ extern "C"
size_t len;
} rb_js_abi_host_list_js_abi_value_t;
void rb_js_abi_host_list_js_abi_value_free(rb_js_abi_host_list_js_abi_value_t *ptr);
void rb_js_abi_host_drop_js_value(rb_js_abi_host_js_abi_value_t value);
void rb_js_abi_host_eval_js(rb_js_abi_host_string_t *code, rb_js_abi_host_js_abi_result_t *ret0);
bool rb_js_abi_host_is_js(rb_js_abi_host_js_abi_value_t value);
bool rb_js_abi_host_instance_of(rb_js_abi_host_js_abi_value_t value, rb_js_abi_host_js_abi_value_t klass);
Expand Down
9 changes: 8 additions & 1 deletion ext/js/bindgen/rb-js-abi-host.wit
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
resource js-abi-value
/// A JavaScript value. In the future, this will be replaced by handle types.
/// The underlying value should be owned by the JavaScript host environment
/// and should live at least until all handles to it are dropped.
type js-abi-value = u32

/// Dispose of a JavaScript value. This should be called when a handle to a
/// JavaScript value is no longer needed by the Ruby program.
drop-js-value: func(value: js-abi-value)

variant js-abi-result {
success(js-abi-value),
Expand Down
4 changes: 2 additions & 2 deletions ext/js/js-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ static void jsvalue_mark(void *p) {}

static void jsvalue_free(void *p) {
struct jsvalue *ptr = p;
rb_js_abi_host_js_abi_value_free(&ptr->abi);
rb_js_abi_host_drop_js_value(ptr->abi);
ruby_xfree(ptr);
}

Expand Down Expand Up @@ -207,7 +207,7 @@ static VALUE _rb_js_obj_aset(VALUE obj, VALUE key, VALUE val) {
rb_js_abi_host_js_abi_result_t ret;
rb_js_abi_host_reflect_set(p->abi, &key_abi_str, v->abi, &ret);
raise_js_error_if_failure(&ret);
rb_js_abi_host_js_abi_value_free(&ret.val.success);
rb_js_abi_host_drop_js_value(ret.val.success);
RB_GC_GUARD(rv);
return val;
}
Expand Down
11 changes: 6 additions & 5 deletions ext/js/lib/js.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,12 @@ def await(promise)
->(value) { current.transfer(value, :failure) }
)
if @loop == current
raise ("JS::Object#await can be called only from RubyVM#evalAsync JS API\n" +
"If you are using browser.script.iife.js, please ensure that you specify `data-eval=\"async\"` in your script tag\n" +
"e.g. <script type=\"text/ruby\" data-eval=\"async\">puts :hello</script>\n" +
"Or <script type=\"text/ruby\" data-eval=\"async\" src=\"path/to/script.rb\"></script>")

raise (
"JS::Object#await can be called only from RubyVM#evalAsync JS API\n" +
"If you are using browser.script.iife.js, please ensure that you specify `data-eval=\"async\"` in your script tag\n" +
"e.g. <script type=\"text/ruby\" data-eval=\"async\">puts :hello</script>\n" +
"Or <script type=\"text/ruby\" data-eval=\"async\" src=\"path/to/script.rb\"></script>"
)
end
value, status = @loop.transfer
raise JS::Error.new(value) if status == :failure
Expand Down
102 changes: 16 additions & 86 deletions ext/witapi/bindgen/rb-abi-guest.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,74 +13,6 @@ size_t new_size
abort();
return ret;
}

__attribute__((import_module("canonical_abi"), import_name("resource_drop_rb-iseq")))
void __resource_rb_iseq_drop(uint32_t idx);

void rb_abi_guest_rb_iseq_free(rb_abi_guest_rb_iseq_t *ptr) {
__resource_rb_iseq_drop(ptr->idx);
}

__attribute__((import_module("canonical_abi"), import_name("resource_clone_rb-iseq")))
uint32_t __resource_rb_iseq_clone(uint32_t idx);

rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_clone(rb_abi_guest_rb_iseq_t *ptr) {
return (rb_abi_guest_rb_iseq_t){__resource_rb_iseq_clone(ptr->idx)};
}

__attribute__((import_module("canonical_abi"), import_name("resource_new_rb-iseq")))
uint32_t __resource_rb_iseq_new(uint32_t val);

rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_new(void *data) {
return (rb_abi_guest_rb_iseq_t){__resource_rb_iseq_new((uint32_t) data)};
}

__attribute__((import_module("canonical_abi"), import_name("resource_get_rb-iseq")))
uint32_t __resource_rb_iseq_get(uint32_t idx);

void* rb_abi_guest_rb_iseq_get(rb_abi_guest_rb_iseq_t *ptr) {
return (void*) __resource_rb_iseq_get(ptr->idx);
}

__attribute__((export_name("canonical_abi_drop_rb-iseq")))
void __resource_rb_iseq_dtor(uint32_t val) {
if (rb_abi_guest_rb_iseq_dtor)
rb_abi_guest_rb_iseq_dtor((void*) val);
}

__attribute__((import_module("canonical_abi"), import_name("resource_drop_rb-abi-value")))
void __resource_rb_abi_value_drop(uint32_t idx);

void rb_abi_guest_rb_abi_value_free(rb_abi_guest_rb_abi_value_t *ptr) {
__resource_rb_abi_value_drop(ptr->idx);
}

__attribute__((import_module("canonical_abi"), import_name("resource_clone_rb-abi-value")))
uint32_t __resource_rb_abi_value_clone(uint32_t idx);

rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_clone(rb_abi_guest_rb_abi_value_t *ptr) {
return (rb_abi_guest_rb_abi_value_t){__resource_rb_abi_value_clone(ptr->idx)};
}

__attribute__((import_module("canonical_abi"), import_name("resource_new_rb-abi-value")))
uint32_t __resource_rb_abi_value_new(uint32_t val);

rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_new(void *data) {
return (rb_abi_guest_rb_abi_value_t){__resource_rb_abi_value_new((uint32_t) data)};
}

__attribute__((import_module("canonical_abi"), import_name("resource_get_rb-abi-value")))
uint32_t __resource_rb_abi_value_get(uint32_t idx);

void* rb_abi_guest_rb_abi_value_get(rb_abi_guest_rb_abi_value_t *ptr) {
return (void*) __resource_rb_abi_value_get(ptr->idx);
}

__attribute__((export_name("canonical_abi_drop_rb-abi-value")))
void __resource_rb_abi_value_dtor(uint32_t val) {
if (rb_abi_guest_rb_abi_value_dtor)
rb_abi_guest_rb_abi_value_dtor((void*) val);
}
#include <string.h>

void rb_abi_guest_string_set(rb_abi_guest_string_t *ret, const char *s) {
Expand Down Expand Up @@ -109,20 +41,18 @@ void rb_abi_guest_list_string_free(rb_abi_guest_list_string_t *ptr) {
free(ptr->ptr);
}
}
void rb_abi_guest_tuple2_rb_abi_value_s32_free(rb_abi_guest_tuple2_rb_abi_value_s32_t *ptr) {
rb_abi_guest_rb_abi_value_free(&ptr->f0);
}
void rb_abi_guest_list_rb_abi_value_free(rb_abi_guest_list_rb_abi_value_t *ptr) {
for (size_t i = 0; i < ptr->len; i++) {
rb_abi_guest_rb_abi_value_free(&ptr->ptr[i]);
}
if (ptr->len > 0) {
free(ptr->ptr);
}
}

__attribute__((aligned(4)))
static uint8_t RET_AREA[8];
__attribute__((export_name("drop-rb-value: func(value: u32) -> ()")))
void __wasm_export_rb_abi_guest_drop_rb_value(int32_t arg) {
rb_abi_guest_drop_rb_value((uint32_t) (arg));
}
__attribute__((export_name("ruby-show-version: func() -> ()")))
void __wasm_export_rb_abi_guest_ruby_show_version(void) {
rb_abi_guest_ruby_show_version();
Expand All @@ -136,11 +66,11 @@ void __wasm_export_rb_abi_guest_ruby_sysinit(int32_t arg, int32_t arg0) {
rb_abi_guest_list_string_t arg1 = (rb_abi_guest_list_string_t) { (rb_abi_guest_string_t*)(arg), (size_t)(arg0) };
rb_abi_guest_ruby_sysinit(&arg1);
}
__attribute__((export_name("ruby-options: func(args: list<string>) -> handle<rb-iseq>")))
__attribute__((export_name("ruby-options: func(args: list<string>) -> u32")))
int32_t __wasm_export_rb_abi_guest_ruby_options(int32_t arg, int32_t arg0) {
rb_abi_guest_list_string_t arg1 = (rb_abi_guest_list_string_t) { (rb_abi_guest_string_t*)(arg), (size_t)(arg0) };
rb_abi_guest_rb_iseq_t ret = rb_abi_guest_ruby_options(&arg1);
return (ret).idx;
rb_abi_guest_rb_abi_value_t ret = rb_abi_guest_ruby_options(&arg1);
return (int32_t) (ret);
}
__attribute__((export_name("ruby-script: func(name: string) -> ()")))
void __wasm_export_rb_abi_guest_ruby_script(int32_t arg, int32_t arg0) {
Expand All @@ -151,23 +81,23 @@ __attribute__((export_name("ruby-init-loadpath: func() -> ()")))
void __wasm_export_rb_abi_guest_ruby_init_loadpath(void) {
rb_abi_guest_ruby_init_loadpath();
}
__attribute__((export_name("rb-eval-string-protect: func(str: string) -> tuple<handle<rb-abi-value>, s32>")))
__attribute__((export_name("rb-eval-string-protect: func(str: string) -> tuple<u32, s32>")))
int32_t __wasm_export_rb_abi_guest_rb_eval_string_protect(int32_t arg, int32_t arg0) {
rb_abi_guest_string_t arg1 = (rb_abi_guest_string_t) { (char*)(arg), (size_t)(arg0) };
rb_abi_guest_tuple2_rb_abi_value_s32_t ret;
rb_abi_guest_rb_eval_string_protect(&arg1, &ret);
int32_t ptr = (int32_t) &RET_AREA;
*((int32_t*)(ptr + 0)) = ((ret).f0).idx;
*((int32_t*)(ptr + 0)) = (int32_t) ((ret).f0);
*((int32_t*)(ptr + 4)) = (ret).f1;
return ptr;
}
__attribute__((export_name("rb-funcallv-protect: func(recv: handle<rb-abi-value>, mid: u32, args: list<handle<rb-abi-value>>) -> tuple<handle<rb-abi-value>, s32>")))
__attribute__((export_name("rb-funcallv-protect: func(recv: u32, mid: u32, args: list<u32>) -> tuple<u32, s32>")))
int32_t __wasm_export_rb_abi_guest_rb_funcallv_protect(int32_t arg, int32_t arg0, int32_t arg1, int32_t arg2) {
rb_abi_guest_list_rb_abi_value_t arg3 = (rb_abi_guest_list_rb_abi_value_t) { (rb_abi_guest_rb_abi_value_t*)(arg1), (size_t)(arg2) };
rb_abi_guest_tuple2_rb_abi_value_s32_t ret;
rb_abi_guest_rb_funcallv_protect((rb_abi_guest_rb_abi_value_t){ arg }, (uint32_t) (arg0), &arg3, &ret);
rb_abi_guest_rb_funcallv_protect((uint32_t) (arg), (uint32_t) (arg0), &arg3, &ret);
int32_t ptr = (int32_t) &RET_AREA;
*((int32_t*)(ptr + 0)) = ((ret).f0).idx;
*((int32_t*)(ptr + 0)) = (int32_t) ((ret).f0);
*((int32_t*)(ptr + 4)) = (ret).f1;
return ptr;
}
Expand All @@ -177,19 +107,19 @@ int32_t __wasm_export_rb_abi_guest_rb_intern(int32_t arg, int32_t arg0) {
rb_abi_guest_rb_id_t ret = rb_abi_guest_rb_intern(&arg1);
return (int32_t) (ret);
}
__attribute__((export_name("rb-errinfo: func() -> handle<rb-abi-value>")))
__attribute__((export_name("rb-errinfo: func() -> u32")))
int32_t __wasm_export_rb_abi_guest_rb_errinfo(void) {
rb_abi_guest_rb_abi_value_t ret = rb_abi_guest_rb_errinfo();
return (ret).idx;
return (int32_t) (ret);
}
__attribute__((export_name("rb-clear-errinfo: func() -> ()")))
void __wasm_export_rb_abi_guest_rb_clear_errinfo(void) {
rb_abi_guest_rb_clear_errinfo();
}
__attribute__((export_name("rstring-ptr: func(value: handle<rb-abi-value>) -> string")))
__attribute__((export_name("rstring-ptr: func(value: u32) -> string")))
int32_t __wasm_export_rb_abi_guest_rstring_ptr(int32_t arg) {
rb_abi_guest_string_t ret;
rb_abi_guest_rstring_ptr((rb_abi_guest_rb_abi_value_t){ arg }, &ret);
rb_abi_guest_rstring_ptr((uint32_t) (arg), &ret);
int32_t ptr = (int32_t) &RET_AREA;
*((int32_t*)(ptr + 4)) = (int32_t) (ret).len;
*((int32_t*)(ptr + 0)) = (int32_t) (ret).ptr;
Expand Down
29 changes: 5 additions & 24 deletions ext/witapi/bindgen/rb-abi-guest.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,6 @@ extern "C"
#include <stdint.h>
#include <stdbool.h>

typedef struct {
uint32_t idx;
} rb_abi_guest_rb_iseq_t;
void rb_abi_guest_rb_iseq_free(rb_abi_guest_rb_iseq_t *ptr);
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_clone(rb_abi_guest_rb_iseq_t *ptr);
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_new(void *data);
void* rb_abi_guest_rb_iseq_get(rb_abi_guest_rb_iseq_t *ptr);

__attribute__((weak))
void rb_abi_guest_rb_iseq_dtor(void *data);

typedef struct {
uint32_t idx;
} rb_abi_guest_rb_abi_value_t;
void rb_abi_guest_rb_abi_value_free(rb_abi_guest_rb_abi_value_t *ptr);
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_clone(rb_abi_guest_rb_abi_value_t *ptr);
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_new(void *data);
void* rb_abi_guest_rb_abi_value_get(rb_abi_guest_rb_abi_value_t *ptr);

__attribute__((weak))
void rb_abi_guest_rb_abi_value_dtor(void *data);

typedef struct {
char *ptr;
size_t len;
Expand All @@ -38,6 +16,9 @@ extern "C"
void rb_abi_guest_string_set(rb_abi_guest_string_t *ret, const char *s);
void rb_abi_guest_string_dup(rb_abi_guest_string_t *ret, const char *s);
void rb_abi_guest_string_free(rb_abi_guest_string_t *ret);
// A Ruby value, which is as known as a VALUE in the Ruby C API.
// This represents a handle owned by the Ruby guest environment.
typedef uint32_t rb_abi_guest_rb_abi_value_t;
typedef int32_t rb_abi_guest_rb_errno_t;
typedef uint32_t rb_abi_guest_rb_id_t;
typedef struct {
Expand All @@ -49,16 +30,16 @@ extern "C"
rb_abi_guest_rb_abi_value_t f0;
int32_t f1;
} rb_abi_guest_tuple2_rb_abi_value_s32_t;
void rb_abi_guest_tuple2_rb_abi_value_s32_free(rb_abi_guest_tuple2_rb_abi_value_s32_t *ptr);
typedef struct {
rb_abi_guest_rb_abi_value_t *ptr;
size_t len;
} rb_abi_guest_list_rb_abi_value_t;
void rb_abi_guest_list_rb_abi_value_free(rb_abi_guest_list_rb_abi_value_t *ptr);
void rb_abi_guest_drop_rb_value(rb_abi_guest_rb_abi_value_t value);
void rb_abi_guest_ruby_show_version(void);
void rb_abi_guest_ruby_init(void);
void rb_abi_guest_ruby_sysinit(rb_abi_guest_list_string_t *args);
rb_abi_guest_rb_iseq_t rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args);
rb_abi_guest_rb_abi_value_t rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args);
void rb_abi_guest_ruby_script(rb_abi_guest_string_t *name);
void rb_abi_guest_ruby_init_loadpath(void);
void rb_abi_guest_rb_eval_string_protect(rb_abi_guest_string_t *str, rb_abi_guest_tuple2_rb_abi_value_s32_t *ret0);
Expand Down
12 changes: 9 additions & 3 deletions ext/witapi/bindgen/rb-abi-guest.wit
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
resource rb-iseq
resource rb-abi-value
/// A Ruby value, which is as known as a VALUE in the Ruby C API.
/// This represents a handle owned by the Ruby guest environment.
type rb-abi-value = u32

/// Dispose of a Ruby value. This should be called when a handle to a
/// Ruby value is no longer needed by the host environment.
drop-rb-value: func(value: rb-abi-value)

type rb-errno = s32
type rb-id = u32

ruby-show-version: func()
ruby-init: func()
ruby-sysinit: func(args: list<string>)
ruby-options: func(args: list<string>) -> rb-iseq
ruby-options: func(args: list<string>) -> rb-abi-value
ruby-script: func(name: string)
ruby-init-loadpath: func()
rb-eval-string-protect: func(str: string) -> tuple<rb-abi-value, s32>
Expand Down
Loading