Skip to content

Commit 39fb296

Browse files
Stop using WIT's resource
because handles and resources support were already removed in the main branch of wit-bindgen bytecodealliance/wit-bindgen#346
1 parent 394841d commit 39fb296

File tree

12 files changed

+226
-547
lines changed

12 files changed

+226
-547
lines changed

ext/js/bindgen/rb-js-abi-host.c

Lines changed: 68 additions & 97 deletions
Large diffs are not rendered by default.

ext/js/bindgen/rb-js-abi-host.h

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,6 @@ extern "C"
88
#include <stdint.h>
99
#include <stdbool.h>
1010

11-
typedef struct {
12-
uint32_t idx;
13-
} rb_js_abi_host_js_abi_value_t;
14-
void rb_js_abi_host_js_abi_value_free(rb_js_abi_host_js_abi_value_t *ptr);
15-
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);
16-
1711
typedef struct {
1812
char *ptr;
1913
size_t len;
@@ -22,6 +16,10 @@ extern "C"
2216
void rb_js_abi_host_string_set(rb_js_abi_host_string_t *ret, const char *s);
2317
void rb_js_abi_host_string_dup(rb_js_abi_host_string_t *ret, const char *s);
2418
void rb_js_abi_host_string_free(rb_js_abi_host_string_t *ret);
19+
// A JavaScript value. In the future, this will be replaced by handle types.
20+
// The underlying value should be owned by the JavaScript host environment
21+
// and should live at least until all handles to it are dropped.
22+
typedef uint32_t rb_js_abi_host_js_abi_value_t;
2523
typedef struct {
2624
uint8_t tag;
2725
union {
@@ -31,7 +29,6 @@ extern "C"
3129
} rb_js_abi_host_js_abi_result_t;
3230
#define RB_JS_ABI_HOST_JS_ABI_RESULT_SUCCESS 0
3331
#define RB_JS_ABI_HOST_JS_ABI_RESULT_FAILURE 1
34-
void rb_js_abi_host_js_abi_result_free(rb_js_abi_host_js_abi_result_t *ptr);
3532
typedef struct {
3633
uint8_t tag;
3734
union {

ext/js/bindgen/rb-js-abi-host.wit

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
resource js-abi-value
1+
/// A JavaScript value. In the future, this will be replaced by handle types.
2+
/// The underlying value should be owned by the JavaScript host environment
3+
/// and should live at least until all handles to it are dropped.
4+
type js-abi-value = u32
25

36
variant js-abi-result {
47
success(js-abi-value),

ext/witapi/bindgen/rb-abi-guest.c

Lines changed: 12 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -13,74 +13,6 @@ size_t new_size
1313
abort();
1414
return ret;
1515
}
16-
17-
__attribute__((import_module("canonical_abi"), import_name("resource_drop_rb-iseq")))
18-
void __resource_rb_iseq_drop(uint32_t idx);
19-
20-
void rb_abi_guest_rb_iseq_free(rb_abi_guest_rb_iseq_t *ptr) {
21-
__resource_rb_iseq_drop(ptr->idx);
22-
}
23-
24-
__attribute__((import_module("canonical_abi"), import_name("resource_clone_rb-iseq")))
25-
uint32_t __resource_rb_iseq_clone(uint32_t idx);
26-
27-
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_clone(rb_abi_guest_rb_iseq_t *ptr) {
28-
return (rb_abi_guest_rb_iseq_t){__resource_rb_iseq_clone(ptr->idx)};
29-
}
30-
31-
__attribute__((import_module("canonical_abi"), import_name("resource_new_rb-iseq")))
32-
uint32_t __resource_rb_iseq_new(uint32_t val);
33-
34-
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_new(void *data) {
35-
return (rb_abi_guest_rb_iseq_t){__resource_rb_iseq_new((uint32_t) data)};
36-
}
37-
38-
__attribute__((import_module("canonical_abi"), import_name("resource_get_rb-iseq")))
39-
uint32_t __resource_rb_iseq_get(uint32_t idx);
40-
41-
void* rb_abi_guest_rb_iseq_get(rb_abi_guest_rb_iseq_t *ptr) {
42-
return (void*) __resource_rb_iseq_get(ptr->idx);
43-
}
44-
45-
__attribute__((export_name("canonical_abi_drop_rb-iseq")))
46-
void __resource_rb_iseq_dtor(uint32_t val) {
47-
if (rb_abi_guest_rb_iseq_dtor)
48-
rb_abi_guest_rb_iseq_dtor((void*) val);
49-
}
50-
51-
__attribute__((import_module("canonical_abi"), import_name("resource_drop_rb-abi-value")))
52-
void __resource_rb_abi_value_drop(uint32_t idx);
53-
54-
void rb_abi_guest_rb_abi_value_free(rb_abi_guest_rb_abi_value_t *ptr) {
55-
__resource_rb_abi_value_drop(ptr->idx);
56-
}
57-
58-
__attribute__((import_module("canonical_abi"), import_name("resource_clone_rb-abi-value")))
59-
uint32_t __resource_rb_abi_value_clone(uint32_t idx);
60-
61-
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_clone(rb_abi_guest_rb_abi_value_t *ptr) {
62-
return (rb_abi_guest_rb_abi_value_t){__resource_rb_abi_value_clone(ptr->idx)};
63-
}
64-
65-
__attribute__((import_module("canonical_abi"), import_name("resource_new_rb-abi-value")))
66-
uint32_t __resource_rb_abi_value_new(uint32_t val);
67-
68-
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_new(void *data) {
69-
return (rb_abi_guest_rb_abi_value_t){__resource_rb_abi_value_new((uint32_t) data)};
70-
}
71-
72-
__attribute__((import_module("canonical_abi"), import_name("resource_get_rb-abi-value")))
73-
uint32_t __resource_rb_abi_value_get(uint32_t idx);
74-
75-
void* rb_abi_guest_rb_abi_value_get(rb_abi_guest_rb_abi_value_t *ptr) {
76-
return (void*) __resource_rb_abi_value_get(ptr->idx);
77-
}
78-
79-
__attribute__((export_name("canonical_abi_drop_rb-abi-value")))
80-
void __resource_rb_abi_value_dtor(uint32_t val) {
81-
if (rb_abi_guest_rb_abi_value_dtor)
82-
rb_abi_guest_rb_abi_value_dtor((void*) val);
83-
}
8416
#include <string.h>
8517

8618
void rb_abi_guest_string_set(rb_abi_guest_string_t *ret, const char *s) {
@@ -109,13 +41,7 @@ void rb_abi_guest_list_string_free(rb_abi_guest_list_string_t *ptr) {
10941
free(ptr->ptr);
11042
}
11143
}
112-
void rb_abi_guest_tuple2_rb_abi_value_s32_free(rb_abi_guest_tuple2_rb_abi_value_s32_t *ptr) {
113-
rb_abi_guest_rb_abi_value_free(&ptr->f0);
114-
}
11544
void rb_abi_guest_list_rb_abi_value_free(rb_abi_guest_list_rb_abi_value_t *ptr) {
116-
for (size_t i = 0; i < ptr->len; i++) {
117-
rb_abi_guest_rb_abi_value_free(&ptr->ptr[i]);
118-
}
11945
if (ptr->len > 0) {
12046
free(ptr->ptr);
12147
}
@@ -136,11 +62,11 @@ void __wasm_export_rb_abi_guest_ruby_sysinit(int32_t arg, int32_t arg0) {
13662
rb_abi_guest_list_string_t arg1 = (rb_abi_guest_list_string_t) { (rb_abi_guest_string_t*)(arg), (size_t)(arg0) };
13763
rb_abi_guest_ruby_sysinit(&arg1);
13864
}
139-
__attribute__((export_name("ruby-options: func(args: list<string>) -> handle<rb-iseq>")))
65+
__attribute__((export_name("ruby-options: func(args: list<string>) -> u32")))
14066
int32_t __wasm_export_rb_abi_guest_ruby_options(int32_t arg, int32_t arg0) {
14167
rb_abi_guest_list_string_t arg1 = (rb_abi_guest_list_string_t) { (rb_abi_guest_string_t*)(arg), (size_t)(arg0) };
142-
rb_abi_guest_rb_iseq_t ret = rb_abi_guest_ruby_options(&arg1);
143-
return (ret).idx;
68+
rb_abi_guest_rb_abi_value_t ret = rb_abi_guest_ruby_options(&arg1);
69+
return (int32_t) (ret);
14470
}
14571
__attribute__((export_name("ruby-script: func(name: string) -> ()")))
14672
void __wasm_export_rb_abi_guest_ruby_script(int32_t arg, int32_t arg0) {
@@ -151,23 +77,23 @@ __attribute__((export_name("ruby-init-loadpath: func() -> ()")))
15177
void __wasm_export_rb_abi_guest_ruby_init_loadpath(void) {
15278
rb_abi_guest_ruby_init_loadpath();
15379
}
154-
__attribute__((export_name("rb-eval-string-protect: func(str: string) -> tuple<handle<rb-abi-value>, s32>")))
80+
__attribute__((export_name("rb-eval-string-protect: func(str: string) -> tuple<u32, s32>")))
15581
int32_t __wasm_export_rb_abi_guest_rb_eval_string_protect(int32_t arg, int32_t arg0) {
15682
rb_abi_guest_string_t arg1 = (rb_abi_guest_string_t) { (char*)(arg), (size_t)(arg0) };
15783
rb_abi_guest_tuple2_rb_abi_value_s32_t ret;
15884
rb_abi_guest_rb_eval_string_protect(&arg1, &ret);
15985
int32_t ptr = (int32_t) &RET_AREA;
160-
*((int32_t*)(ptr + 0)) = ((ret).f0).idx;
86+
*((int32_t*)(ptr + 0)) = (int32_t) ((ret).f0);
16187
*((int32_t*)(ptr + 4)) = (ret).f1;
16288
return ptr;
16389
}
164-
__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>")))
90+
__attribute__((export_name("rb-funcallv-protect: func(recv: u32, mid: u32, args: list<u32>) -> tuple<u32, s32>")))
16591
int32_t __wasm_export_rb_abi_guest_rb_funcallv_protect(int32_t arg, int32_t arg0, int32_t arg1, int32_t arg2) {
16692
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) };
16793
rb_abi_guest_tuple2_rb_abi_value_s32_t ret;
168-
rb_abi_guest_rb_funcallv_protect((rb_abi_guest_rb_abi_value_t){ arg }, (uint32_t) (arg0), &arg3, &ret);
94+
rb_abi_guest_rb_funcallv_protect((uint32_t) (arg), (uint32_t) (arg0), &arg3, &ret);
16995
int32_t ptr = (int32_t) &RET_AREA;
170-
*((int32_t*)(ptr + 0)) = ((ret).f0).idx;
96+
*((int32_t*)(ptr + 0)) = (int32_t) ((ret).f0);
17197
*((int32_t*)(ptr + 4)) = (ret).f1;
17298
return ptr;
17399
}
@@ -177,19 +103,19 @@ int32_t __wasm_export_rb_abi_guest_rb_intern(int32_t arg, int32_t arg0) {
177103
rb_abi_guest_rb_id_t ret = rb_abi_guest_rb_intern(&arg1);
178104
return (int32_t) (ret);
179105
}
180-
__attribute__((export_name("rb-errinfo: func() -> handle<rb-abi-value>")))
106+
__attribute__((export_name("rb-errinfo: func() -> u32")))
181107
int32_t __wasm_export_rb_abi_guest_rb_errinfo(void) {
182108
rb_abi_guest_rb_abi_value_t ret = rb_abi_guest_rb_errinfo();
183-
return (ret).idx;
109+
return (int32_t) (ret);
184110
}
185111
__attribute__((export_name("rb-clear-errinfo: func() -> ()")))
186112
void __wasm_export_rb_abi_guest_rb_clear_errinfo(void) {
187113
rb_abi_guest_rb_clear_errinfo();
188114
}
189-
__attribute__((export_name("rstring-ptr: func(value: handle<rb-abi-value>) -> string")))
115+
__attribute__((export_name("rstring-ptr: func(value: u32) -> string")))
190116
int32_t __wasm_export_rb_abi_guest_rstring_ptr(int32_t arg) {
191117
rb_abi_guest_string_t ret;
192-
rb_abi_guest_rstring_ptr((rb_abi_guest_rb_abi_value_t){ arg }, &ret);
118+
rb_abi_guest_rstring_ptr((uint32_t) (arg), &ret);
193119
int32_t ptr = (int32_t) &RET_AREA;
194120
*((int32_t*)(ptr + 4)) = (int32_t) (ret).len;
195121
*((int32_t*)(ptr + 0)) = (int32_t) (ret).ptr;

ext/witapi/bindgen/rb-abi-guest.h

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,6 @@ extern "C"
88
#include <stdint.h>
99
#include <stdbool.h>
1010

11-
typedef struct {
12-
uint32_t idx;
13-
} rb_abi_guest_rb_iseq_t;
14-
void rb_abi_guest_rb_iseq_free(rb_abi_guest_rb_iseq_t *ptr);
15-
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_clone(rb_abi_guest_rb_iseq_t *ptr);
16-
rb_abi_guest_rb_iseq_t rb_abi_guest_rb_iseq_new(void *data);
17-
void* rb_abi_guest_rb_iseq_get(rb_abi_guest_rb_iseq_t *ptr);
18-
19-
__attribute__((weak))
20-
void rb_abi_guest_rb_iseq_dtor(void *data);
21-
22-
typedef struct {
23-
uint32_t idx;
24-
} rb_abi_guest_rb_abi_value_t;
25-
void rb_abi_guest_rb_abi_value_free(rb_abi_guest_rb_abi_value_t *ptr);
26-
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_clone(rb_abi_guest_rb_abi_value_t *ptr);
27-
rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_new(void *data);
28-
void* rb_abi_guest_rb_abi_value_get(rb_abi_guest_rb_abi_value_t *ptr);
29-
30-
__attribute__((weak))
31-
void rb_abi_guest_rb_abi_value_dtor(void *data);
32-
3311
typedef struct {
3412
char *ptr;
3513
size_t len;
@@ -38,6 +16,9 @@ extern "C"
3816
void rb_abi_guest_string_set(rb_abi_guest_string_t *ret, const char *s);
3917
void rb_abi_guest_string_dup(rb_abi_guest_string_t *ret, const char *s);
4018
void rb_abi_guest_string_free(rb_abi_guest_string_t *ret);
19+
// A Ruby value, which is as known as a VALUE in the Ruby C API.
20+
// This represents a handle owned by the Ruby guest environment.
21+
typedef uint32_t rb_abi_guest_rb_abi_value_t;
4122
typedef int32_t rb_abi_guest_rb_errno_t;
4223
typedef uint32_t rb_abi_guest_rb_id_t;
4324
typedef struct {
@@ -49,7 +30,6 @@ extern "C"
4930
rb_abi_guest_rb_abi_value_t f0;
5031
int32_t f1;
5132
} rb_abi_guest_tuple2_rb_abi_value_s32_t;
52-
void rb_abi_guest_tuple2_rb_abi_value_s32_free(rb_abi_guest_tuple2_rb_abi_value_s32_t *ptr);
5333
typedef struct {
5434
rb_abi_guest_rb_abi_value_t *ptr;
5535
size_t len;
@@ -58,7 +38,7 @@ extern "C"
5838
void rb_abi_guest_ruby_show_version(void);
5939
void rb_abi_guest_ruby_init(void);
6040
void rb_abi_guest_ruby_sysinit(rb_abi_guest_list_string_t *args);
61-
rb_abi_guest_rb_iseq_t rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args);
41+
rb_abi_guest_rb_abi_value_t rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args);
6242
void rb_abi_guest_ruby_script(rb_abi_guest_string_t *name);
6343
void rb_abi_guest_ruby_init_loadpath(void);
6444
void rb_abi_guest_rb_eval_string_protect(rb_abi_guest_string_t *str, rb_abi_guest_tuple2_rb_abi_value_s32_t *ret0);

ext/witapi/bindgen/rb-abi-guest.wit

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
1-
resource rb-iseq
2-
resource rb-abi-value
1+
/// A Ruby value, which is as known as a VALUE in the Ruby C API.
2+
/// This represents a handle owned by the Ruby guest environment.
3+
type rb-abi-value = u32
4+
35
type rb-errno = s32
46
type rb-id = u32
57

68
ruby-show-version: func()
79
ruby-init: func()
810
ruby-sysinit: func(args: list<string>)
9-
ruby-options: func(args: list<string>) -> rb-iseq
11+
ruby-options: func(args: list<string>) -> rb-abi-value
1012
ruby-script: func(name: string)
1113
ruby-init-loadpath: func()
1214
rb-eval-string-protect: func(str: string) -> tuple<rb-abi-value, s32>

ext/witapi/witapi-core.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,13 @@ void rb_abi_lend_object(VALUE obj) {
172172
assert(state == TAG_NONE && "rb_abi_lend_object_internal failed");
173173
}
174174

175+
static inline rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_abi_value_new(VALUE obj) {
176+
return (rb_abi_guest_rb_abi_value_t)(obj);
177+
}
178+
static inline VALUE rb_abi_guest_rb_abi_value_get(rb_abi_guest_rb_abi_value_t *self) {
179+
return (VALUE)(*self);
180+
}
181+
175182
static VALUE rb_abi_guest_rb_abi_value_dtor_internal(VALUE obj) {
176183
VALUE object_id = rb_obj_id(obj);
177184
VALUE ref_count = rb_hash_lookup(rb_abi_guest_refcount_hash, object_id);
@@ -223,20 +230,20 @@ void rb_abi_guest_ruby_sysinit(rb_abi_guest_list_string_t *args) {
223230
RB_WASM_LIB_RT(ruby_sysinit(&argc, &c_args))
224231
}
225232

226-
rb_abi_guest_rb_iseq_t
233+
rb_abi_guest_rb_abi_value_t
227234
rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args) {
228-
void *result;
235+
VALUE result;
229236
char **c_args;
230237
c_strings_from_abi(args, c_args);
231-
RB_WASM_LIB_RT(result = ruby_options(args->len, c_args))
232-
return rb_abi_guest_rb_iseq_new(result);
238+
RB_WASM_LIB_RT(result = (VALUE)ruby_options(args->len, c_args))
239+
return rb_abi_guest_rb_abi_value_new(result);
233240
}
234241

235242
rb_abi_guest_rb_errno_t
236-
rb_abi_guest_ruby_run_node(rb_abi_guest_rb_iseq_t node) {
243+
rb_abi_guest_ruby_run_node(rb_abi_guest_rb_abi_value_t node) {
237244
int result;
238-
void *iseq = rb_abi_guest_rb_iseq_get(&node);
239-
RB_WASM_LIB_RT(ruby_run_node(iseq))
245+
VALUE iseq = rb_abi_guest_rb_abi_value_get(&node);
246+
RB_WASM_LIB_RT(ruby_run_node((void *)iseq))
240247
return result;
241248
}
242249

@@ -260,7 +267,7 @@ void rb_abi_guest_rb_eval_string_protect(
260267
if (ret0->f1 == TAG_NONE) {
261268
rb_abi_lend_object(retval);
262269
}
263-
ret0->f0 = rb_abi_guest_rb_abi_value_new((void *)retval);
270+
ret0->f0 = rb_abi_guest_rb_abi_value_new(retval);
264271
}
265272

266273
struct rb_funcallv_thunk_ctx {
@@ -294,7 +301,7 @@ void rb_abi_guest_rb_funcallv_protect(
294301
if (ret0->f1 == TAG_NONE) {
295302
rb_abi_lend_object(retval);
296303
}
297-
ret0->f0 = rb_abi_guest_rb_abi_value_new((void *)retval);
304+
ret0->f0 = rb_abi_guest_rb_abi_value_new(retval);
298305
}
299306

300307
rb_abi_guest_rb_id_t rb_abi_guest_rb_intern(rb_abi_guest_string_t *name) {
@@ -305,7 +312,7 @@ rb_abi_guest_rb_abi_value_t rb_abi_guest_rb_errinfo(void) {
305312
VALUE retval;
306313
RB_WASM_LIB_RT(retval = rb_errinfo());
307314
rb_abi_lend_object(retval);
308-
return rb_abi_guest_rb_abi_value_new((void *)retval);
315+
return rb_abi_guest_rb_abi_value_new(retval);
309316
}
310317

311318
void rb_abi_guest_rb_clear_errinfo(void) { rb_set_errinfo(Qnil); }

packages/npm-packages/ruby-wasm-wasi/src/bindgen/intrinsics.js

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -41,46 +41,6 @@ export function utf8_encode(s, realloc, memory) {
4141
}
4242
export let UTF8_ENCODED_LEN = 0;
4343

44-
export class Slab {
45-
constructor() {
46-
this.list = [];
47-
this.head = 0;
48-
}
49-
50-
insert(val) {
51-
if (this.head >= this.list.length) {
52-
this.list.push({
53-
next: this.list.length + 1,
54-
val: undefined,
55-
});
56-
}
57-
const ret = this.head;
58-
const slot = this.list[ret];
59-
this.head = slot.next;
60-
slot.next = -1;
61-
slot.val = val;
62-
return ret;
63-
}
64-
65-
get(idx) {
66-
if (idx >= this.list.length)
67-
throw new RangeError('handle index not valid');
68-
const slot = this.list[idx];
69-
if (slot.next === -1)
70-
return slot.val;
71-
throw new RangeError('handle index not valid');
72-
}
73-
74-
remove(idx) {
75-
const ret = this.get(idx); // validate the slot
76-
const slot = this.list[idx];
77-
slot.val = undefined;
78-
slot.next = this.head;
79-
this.head = idx;
80-
return ret;
81-
}
82-
}
83-
8444
export function throw_invalid_bool() {
8545
throw new RangeError("invalid variant discriminant for bool");
8646
}

0 commit comments

Comments
 (0)