js 2.6.2 → 2.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 153c572884d06b66e29644640877fa1b35d8d08725d44cafb0895e0269f40d8d
4
- data.tar.gz: 67351a2724d1c4f74aba3506d14334bef7055918e564429ac9eaf73b277dbcac
3
+ metadata.gz: 6f322c0e5d521f68cd2b3f105afecd8b93b7372a3320df538a7fed9c124e6c53
4
+ data.tar.gz: 8286d36e16bc367780fed3f12e9189b3cbaf79945e7768e0718bea3529fdc528
5
5
  SHA512:
6
- metadata.gz: 7f5cfd35ce5a3242d83553dc3fe8e71664fcad0198535d85ee06adbad272cae7d3eddc2ade6e9852b4f81c559056f4f0904474f83ad6d0a000536a9b0d93a10b
7
- data.tar.gz: bd603fe5fe568ec47898d1356a1e46f0bde720313c56b24e36b4f1f70d46f3995c87728621463d332ba37fd347f7ae7f78d218c99adf0d594f50954e21515a49
6
+ metadata.gz: 1cb9831474ab99228f8c38634ee6e3bfed2e6b1cc48e414267826cb37d5ba0b8d2a8d9d57b39b3075c4c96ecefaf28aa762cf332dcfd2a4992e872ed423593a5
7
+ data.tar.gz: 35b2224562bd4c50894419a454bfc165af4be9d63c2a636f2f311ad16b466b0e717d4e9004faa9d74ff9d6f0d17a2c2904452cf130a8e80cced40c806b47bc10
data/ext/js/bindgen/ext.c CHANGED
@@ -78,9 +78,6 @@ extern void __wasm_import_ruby_js_js_runtime_throw_prohibit_rewind_exception(uin
78
78
 
79
79
 
80
80
 
81
-
82
-
83
-
84
81
  __attribute__((__weak__, __export_name__("cabi_post_ruby:js/ruby-runtime#rstring-ptr")))
85
82
  void __wasm_export_exports_ruby_js_ruby_runtime_rstring_ptr_post_return(uint8_t * arg0) {
86
83
  if ((*((size_t*) (arg0 + 4))) > 0) {
@@ -150,32 +147,6 @@ void ruby_js_js_runtime_list_borrow_js_abi_value_free(ruby_js_js_runtime_list_bo
150
147
  }
151
148
  }
152
149
 
153
- __attribute__((__import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-drop]rb-iseq")))
154
- extern void __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_drop(int32_t handle);
155
-
156
- void exports_ruby_js_ruby_runtime_rb_iseq_drop_own(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle) {
157
- __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_drop(handle.__handle);
158
- }
159
-
160
- __attribute__(( __import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-new]rb-iseq")))
161
- extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_new(int32_t);
162
-
163
- __attribute__((__import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-rep]rb-iseq")))
164
- extern int32_t __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_rep(int32_t);
165
-
166
- 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) {
167
- return (exports_ruby_js_ruby_runtime_own_rb_iseq_t) { __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_new((int32_t) rep) };
168
- }
169
-
170
- 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) {
171
- return (exports_ruby_js_ruby_runtime_rb_iseq_t*) __wasm_import_exports_ruby_js_ruby_runtime_rb_iseq_rep(handle.__handle);
172
- }
173
-
174
- __attribute__((__export_name__("ruby:js/ruby-runtime#[dtor]rb_iseq")))
175
- void __wasm_export_exports_ruby_js_ruby_runtime_rb_iseq_dtor(exports_ruby_js_ruby_runtime_rb_iseq_t* arg) {
176
- exports_ruby_js_ruby_runtime_rb_iseq_destructor(arg);
177
- }
178
-
179
150
  __attribute__((__import_module__("[export]ruby:js/ruby-runtime"), __import_name__("[resource-drop]rb-abi-value")))
180
151
  extern void __wasm_import_exports_ruby_js_ruby_runtime_rb_abi_value_drop(int32_t handle);
181
152
 
@@ -437,27 +408,9 @@ void __wasm_export_exports_ruby_js_ruby_runtime_ruby_show_version(void) {
437
408
  }
438
409
 
439
410
  __attribute__((__export_name__("ruby:js/ruby-runtime#ruby-init")))
440
- void __wasm_export_exports_ruby_js_ruby_runtime_ruby_init(void) {
441
- exports_ruby_js_ruby_runtime_ruby_init();
442
- }
443
-
444
- __attribute__((__export_name__("ruby:js/ruby-runtime#ruby-sysinit")))
445
- void __wasm_export_exports_ruby_js_ruby_runtime_ruby_sysinit(uint8_t * arg, size_t arg0) {
411
+ void __wasm_export_exports_ruby_js_ruby_runtime_ruby_init(uint8_t * arg, size_t arg0) {
446
412
  ext_list_string_t arg1 = (ext_list_string_t) { (ext_string_t*)(arg), (arg0) };
447
- exports_ruby_js_ruby_runtime_ruby_sysinit(&arg1);
448
- }
449
-
450
- __attribute__((__export_name__("ruby:js/ruby-runtime#ruby-options")))
451
- int32_t __wasm_export_exports_ruby_js_ruby_runtime_ruby_options(uint8_t * arg, size_t arg0) {
452
- ext_list_string_t arg1 = (ext_list_string_t) { (ext_string_t*)(arg), (arg0) };
453
- exports_ruby_js_ruby_runtime_own_rb_iseq_t ret = exports_ruby_js_ruby_runtime_ruby_options(&arg1);
454
- return (ret).__handle;
455
- }
456
-
457
- __attribute__((__export_name__("ruby:js/ruby-runtime#ruby-script")))
458
- void __wasm_export_exports_ruby_js_ruby_runtime_ruby_script(uint8_t * arg, size_t arg0) {
459
- ext_string_t arg1 = (ext_string_t) { (uint8_t*)(arg), (arg0) };
460
- exports_ruby_js_ruby_runtime_ruby_script(&arg1);
413
+ exports_ruby_js_ruby_runtime_ruby_init(&arg1);
461
414
  }
462
415
 
463
416
  __attribute__((__export_name__("ruby:js/ruby-runtime#ruby-init-loadpath")))
data/ext/js/bindgen/ext.h CHANGED
@@ -48,14 +48,6 @@ typedef struct ruby_js_js_runtime_list_borrow_js_abi_value_t {
48
48
  size_t len;
49
49
  } ruby_js_js_runtime_list_borrow_js_abi_value_t;
50
50
 
51
- typedef struct exports_ruby_js_ruby_runtime_own_rb_iseq_t {
52
- int32_t __handle;
53
- } exports_ruby_js_ruby_runtime_own_rb_iseq_t;
54
-
55
- typedef struct exports_ruby_js_ruby_runtime_rb_iseq_t exports_ruby_js_ruby_runtime_rb_iseq_t;
56
-
57
- typedef exports_ruby_js_ruby_runtime_rb_iseq_t* exports_ruby_js_ruby_runtime_borrow_rb_iseq_t;
58
-
59
51
  typedef struct exports_ruby_js_ruby_runtime_own_rb_abi_value_t {
60
52
  int32_t __handle;
61
53
  } exports_ruby_js_ruby_runtime_own_rb_abi_value_t;
@@ -108,10 +100,7 @@ extern void ruby_js_js_runtime_throw_prohibit_rewind_exception(ext_string_t *mes
108
100
 
109
101
  // Exported Functions from `ruby:js/ruby-runtime`
110
102
  void exports_ruby_js_ruby_runtime_ruby_show_version(void);
111
- void exports_ruby_js_ruby_runtime_ruby_init(void);
112
- void exports_ruby_js_ruby_runtime_ruby_sysinit(ext_list_string_t *args);
113
- exports_ruby_js_ruby_runtime_own_rb_iseq_t exports_ruby_js_ruby_runtime_ruby_options(ext_list_string_t *args);
114
- void exports_ruby_js_ruby_runtime_ruby_script(ext_string_t *name);
103
+ void exports_ruby_js_ruby_runtime_ruby_init(ext_list_string_t *args);
115
104
  void exports_ruby_js_ruby_runtime_ruby_init_loadpath(void);
116
105
  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);
117
106
  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);
@@ -137,12 +126,6 @@ void ruby_js_js_runtime_raw_integer_free(ruby_js_js_runtime_raw_integer_t *ptr);
137
126
 
138
127
  void ruby_js_js_runtime_list_borrow_js_abi_value_free(ruby_js_js_runtime_list_borrow_js_abi_value_t *ptr);
139
128
 
140
- extern void exports_ruby_js_ruby_runtime_rb_iseq_drop_own(exports_ruby_js_ruby_runtime_own_rb_iseq_t handle);
141
-
142
- 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);
143
- 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);
144
- void exports_ruby_js_ruby_runtime_rb_iseq_destructor(exports_ruby_js_ruby_runtime_rb_iseq_t *rep);
145
-
146
129
  extern void exports_ruby_js_ruby_runtime_rb_abi_value_drop_own(exports_ruby_js_ruby_runtime_own_rb_abi_value_t handle);
147
130
 
148
131
  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);
Binary file
@@ -14,40 +14,6 @@ size_t new_size
14
14
  return ret;
15
15
  }
16
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
17
  __attribute__((import_module("canonical_abi"), import_name("resource_drop_rb-abi-value")))
52
18
  void __resource_rb_abi_value_drop(uint32_t idx);
53
19
 
@@ -127,25 +93,10 @@ __attribute__((export_name("ruby-show-version: func() -> ()")))
127
93
  void __wasm_export_rb_abi_guest_ruby_show_version(void) {
128
94
  rb_abi_guest_ruby_show_version();
129
95
  }
130
- __attribute__((export_name("ruby-init: func() -> ()")))
131
- void __wasm_export_rb_abi_guest_ruby_init(void) {
132
- rb_abi_guest_ruby_init();
133
- }
134
- __attribute__((export_name("ruby-sysinit: func(args: list<string>) -> ()")))
135
- void __wasm_export_rb_abi_guest_ruby_sysinit(int32_t arg, int32_t arg0) {
96
+ __attribute__((export_name("ruby-init: func(args: list<string>) -> ()")))
97
+ void __wasm_export_rb_abi_guest_ruby_init(int32_t arg, int32_t arg0) {
136
98
  rb_abi_guest_list_string_t arg1 = (rb_abi_guest_list_string_t) { (rb_abi_guest_string_t*)(arg), (size_t)(arg0) };
137
- rb_abi_guest_ruby_sysinit(&arg1);
138
- }
139
- __attribute__((export_name("ruby-options: func(args: list<string>) -> handle<rb-iseq>")))
140
- int32_t __wasm_export_rb_abi_guest_ruby_options(int32_t arg, int32_t arg0) {
141
- 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;
144
- }
145
- __attribute__((export_name("ruby-script: func(name: string) -> ()")))
146
- void __wasm_export_rb_abi_guest_ruby_script(int32_t arg, int32_t arg0) {
147
- rb_abi_guest_string_t arg1 = (rb_abi_guest_string_t) { (char*)(arg), (size_t)(arg0) };
148
- rb_abi_guest_ruby_script(&arg1);
99
+ rb_abi_guest_ruby_init(&arg1);
149
100
  }
150
101
  __attribute__((export_name("ruby-init-loadpath: func() -> ()")))
151
102
  void __wasm_export_rb_abi_guest_ruby_init_loadpath(void) {
@@ -8,17 +8,6 @@ extern "C"
8
8
  #include <stdint.h>
9
9
  #include <stdbool.h>
10
10
 
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
11
  typedef struct {
23
12
  uint32_t idx;
24
13
  } rb_abi_guest_rb_abi_value_t;
@@ -56,10 +45,7 @@ extern "C"
56
45
  } rb_abi_guest_list_rb_abi_value_t;
57
46
  void rb_abi_guest_list_rb_abi_value_free(rb_abi_guest_list_rb_abi_value_t *ptr);
58
47
  void rb_abi_guest_ruby_show_version(void);
59
- void rb_abi_guest_ruby_init(void);
60
- 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);
62
- void rb_abi_guest_ruby_script(rb_abi_guest_string_t *name);
48
+ void rb_abi_guest_ruby_init(rb_abi_guest_list_string_t *args);
63
49
  void rb_abi_guest_ruby_init_loadpath(void);
64
50
  void rb_abi_guest_rb_eval_string_protect(rb_abi_guest_string_t *str, rb_abi_guest_tuple2_rb_abi_value_s32_t *ret0);
65
51
  void rb_abi_guest_rb_funcallv_protect(rb_abi_guest_rb_abi_value_t recv, rb_abi_guest_rb_id_t mid, rb_abi_guest_list_rb_abi_value_t *args, rb_abi_guest_tuple2_rb_abi_value_s32_t *ret0);
@@ -1,13 +1,9 @@
1
- resource rb-iseq
2
1
  resource rb-abi-value
3
2
  type rb-errno = s32
4
3
  type rb-id = u32
5
4
 
6
5
  ruby-show-version: func()
7
- ruby-init: func()
8
- ruby-sysinit: func(args: list<string>)
9
- ruby-options: func(args: list<string>) -> rb-iseq
10
- ruby-script: func(name: string)
6
+ ruby-init: func(args: list<string>)
11
7
  ruby-init-loadpath: func()
12
8
  rb-eval-string-protect: func(str: string) -> tuple<rb-abi-value, s32>
13
9
  rb-funcallv-protect: func(recv: rb-abi-value, mid: rb-id, args: list<rb-abi-value>) -> tuple<rb-abi-value, s32>
data/ext/js/extconf.rb CHANGED
@@ -11,7 +11,7 @@ end
11
11
 
12
12
  $objs = %w[js-core.o witapi-core.o]
13
13
 
14
- use_component_model = enable_config("component-model", false)
14
+ use_component_model = enable_config("component-model", true)
15
15
  $stderr.print "Building with component model: "
16
16
  $stderr.puts use_component_model ? "\e[1;32myes\e[0m" : "\e[1;31mno\e[0m"
17
17
  if use_component_model
data/ext/js/js-core.c CHANGED
@@ -146,12 +146,25 @@ VALUE _rb_js_try_convert(VALUE klass, VALUE obj) {
146
146
  * p JS.is_a?(JS.global, JS.global[:Object]) #=> true
147
147
  * p JS.is_a?(JS.global, Object) #=> false
148
148
  */
149
- static VALUE _rb_js_is_kind_of(VALUE klass, VALUE obj, VALUE c) {
149
+ static VALUE _rb_js_is_kind_of(int argc, VALUE *argv, VALUE self) {
150
+
151
+ if (argc == 1) {
152
+ // If the second argument is not given, behaves as `Module#is_a?`.
153
+ return rb_obj_is_kind_of(self, argv[0]);
154
+ }
155
+
156
+ if (argc != 2) {
157
+ rb_raise(rb_eArgError, "wrong number of arguments (given %d, expected 2)",
158
+ argc);
159
+ }
160
+
161
+ VALUE obj = argv[0];
162
+ VALUE klass = argv[1];
150
163
  if (!IS_JSVALUE(obj)) {
151
164
  return Qfalse;
152
165
  }
153
166
  struct jsvalue *val = DATA_PTR(obj);
154
- VALUE js_klass_v = _rb_js_try_convert(klass, c);
167
+ VALUE js_klass_v = _rb_js_try_convert(self, klass);
155
168
  struct jsvalue *js_klass = DATA_PTR(js_klass_v);
156
169
  return RBOOL(rb_js_abi_host_instance_of(val->abi, js_klass->abi));
157
170
  }
@@ -561,13 +574,13 @@ static VALUE _rb_js_proc_to_js(VALUE obj) {
561
574
  */
562
575
  void Init_js() {
563
576
  rb_mJS = rb_define_module("JS");
564
- rb_define_module_function(rb_mJS, "is_a?", _rb_js_is_kind_of, 2);
577
+ rb_define_module_function(rb_mJS, "is_a?", _rb_js_is_kind_of, -1);
565
578
  rb_define_module_function(rb_mJS, "try_convert", _rb_js_try_convert, 1);
566
579
  rb_define_module_function(rb_mJS, "eval", _rb_js_eval_js, 1);
567
580
  rb_define_module_function(rb_mJS, "global", _rb_js_global_this, 0);
568
581
 
569
582
  i_to_js = rb_intern("to_js");
570
- rb_cJS_Object = rb_define_class_under(rb_mJS, "Object", rb_cObject);
583
+ rb_cJS_Object = rb_define_class_under(rb_mJS, "Object", rb_cBasicObject);
571
584
  VALUE rb_cJS_singleton = rb_singleton_class(rb_cJS_Object);
572
585
  rb_define_alloc_func(rb_cJS_Object, jsvalue_s_allocate);
573
586
  rb_define_method(rb_cJS_Object, "[]", _rb_js_obj_aref, 1);
data/ext/js/types.h CHANGED
@@ -10,7 +10,6 @@ typedef exports_ruby_js_ruby_runtime_own_rb_abi_value_t
10
10
  rb_abi_guest_own_rb_abi_value_t;
11
11
  typedef exports_ruby_js_ruby_runtime_list_borrow_rb_abi_value_t
12
12
  rb_abi_guest_list_rb_abi_value_t;
13
- typedef exports_ruby_js_ruby_runtime_own_rb_iseq_t rb_abi_guest_rb_iseq_t;
14
13
  typedef exports_ruby_js_ruby_runtime_rb_id_t rb_abi_guest_rb_id_t;
15
14
  typedef exports_ruby_js_ruby_runtime_tuple2_own_rb_abi_value_s32_t
16
15
  rb_abi_guest_tuple2_rb_abi_value_s32_t;
data/ext/js/witapi-core.c CHANGED
@@ -188,9 +188,6 @@ void rb_abi_guest_rb_abi_value_dtor(void *data) {
188
188
  }
189
189
 
190
190
  #ifdef JS_ENABLE_COMPONENT_MODEL
191
- void exports_ruby_js_ruby_runtime_rb_iseq_destructor(
192
- exports_ruby_js_ruby_runtime_rb_iseq_t *rep) {}
193
-
194
191
  void exports_ruby_js_ruby_runtime_rb_abi_value_destructor(
195
192
  exports_ruby_js_ruby_runtime_rb_abi_value_t *rep) {
196
193
  rb_abi_guest_rb_abi_value_dtor((void *)rep);
@@ -203,36 +200,22 @@ void exports_ruby_js_ruby_runtime_rb_abi_value_destructor(
203
200
 
204
201
  void rb_abi_guest_ruby_show_version(void) { ruby_show_version(); }
205
202
 
206
- __attribute__((noinline)) static void rb_abi_guest_ruby_init_thunk(void) {
203
+ __attribute__((noinline)) static void
204
+ rb_abi_guest_ruby_init_thunk(int argc, char **c_args) {
207
205
  ruby_init();
208
206
  rb_abi_guest_arena_hash = rb_hash_new();
209
207
  rb_abi_guest_refcount_hash = rb_hash_new();
210
208
 
211
209
  rb_gc_register_mark_object(rb_abi_guest_arena_hash);
212
210
  rb_gc_register_mark_object(rb_abi_guest_refcount_hash);
211
+ ruby_sysinit(&argc, &c_args);
212
+ ruby_options(argc, c_args);
213
213
  }
214
- void rb_abi_guest_ruby_init(void) {
215
- RB_WASM_LIB_RT(rb_abi_guest_ruby_init_thunk())
216
- }
217
-
218
- void rb_abi_guest_ruby_sysinit(rb_abi_guest_list_string_t *args) {
219
- char **c_args;
214
+ void rb_abi_guest_ruby_init(rb_abi_guest_list_string_t *args) {
220
215
  int argc = args->len;
221
- c_strings_from_abi(args, c_args);
222
- RB_WASM_LIB_RT(ruby_sysinit(&argc, &c_args))
223
- }
224
-
225
- rb_abi_guest_rb_iseq_t
226
- rb_abi_guest_ruby_options(rb_abi_guest_list_string_t *args) {
227
- void *result;
228
216
  char **c_args;
229
217
  c_strings_from_abi(args, c_args);
230
- RB_WASM_LIB_RT(result = ruby_options(args->len, c_args))
231
- return rb_abi_guest_rb_iseq_new(result);
232
- }
233
-
234
- void rb_abi_guest_ruby_script(rb_abi_guest_string_t *name) {
235
- RB_WASM_LIB_RT(ruby_script((const char *)name->ptr))
218
+ RB_WASM_LIB_RT(rb_abi_guest_ruby_init_thunk(argc, c_args))
236
219
  }
237
220
 
238
221
  void rb_abi_guest_ruby_init_loadpath(void) {
@@ -398,22 +381,9 @@ void exports_ruby_js_ruby_runtime_ruby_show_version(void) {
398
381
  __wasm_call_ctors_if_needed();
399
382
  rb_abi_guest_ruby_show_version();
400
383
  }
401
- void exports_ruby_js_ruby_runtime_ruby_init(void) {
402
- __wasm_call_ctors_if_needed();
403
- rb_abi_guest_ruby_init();
404
- }
405
- void exports_ruby_js_ruby_runtime_ruby_sysinit(ext_list_string_t *args) {
406
- __wasm_call_ctors_if_needed();
407
- rb_abi_guest_ruby_sysinit(args);
408
- }
409
- exports_ruby_js_ruby_runtime_own_rb_iseq_t
410
- exports_ruby_js_ruby_runtime_ruby_options(ext_list_string_t *args) {
411
- __wasm_call_ctors_if_needed();
412
- return rb_abi_guest_ruby_options(args);
413
- }
414
- void exports_ruby_js_ruby_runtime_ruby_script(ext_string_t *name) {
384
+ void exports_ruby_js_ruby_runtime_ruby_init(ext_list_string_t *args) {
415
385
  __wasm_call_ctors_if_needed();
416
- rb_abi_guest_ruby_script(name);
386
+ rb_abi_guest_ruby_init(args);
417
387
  }
418
388
  void exports_ruby_js_ruby_runtime_ruby_init_loadpath(void) {
419
389
  __wasm_call_ctors_if_needed();
@@ -26,6 +26,10 @@ module JS
26
26
  @url_stack.pop
27
27
  end
28
28
 
29
+ def inspect
30
+ "#{self.class}(#{@url_stack})"
31
+ end
32
+
29
33
  private
30
34
 
31
35
  def filename_from(relative_feature)
@@ -43,11 +43,27 @@ module JS
43
43
  include Singleton
44
44
 
45
45
  def initialize
46
+ # By default, the base_url is the URL of the HTML file that invoked ruby.wasm vm.
46
47
  base_url = JS.global[:URL].new(JS.global[:location][:href])
47
48
  @resolver = URLResolver.new(base_url)
48
49
  @evaluator = Evaluator.new
49
50
  end
50
51
 
52
+ # If you want to resolve relative paths to a starting point other than the HTML file that executes ruby.wasm,
53
+ # you can set the base_url property.
54
+ # For example, if you want to use the `lib` directory as the starting point, specify base_url as follows
55
+ #
56
+ # == Example
57
+ # require 'js/require_remote'
58
+ # JS::RequireRemote.instance.base_url = "lib"
59
+ # JS::RequireRemote.instance.load("foo") # => 'lib/foo.rb' will be loaded.
60
+ #
61
+ def base_url=(base_url)
62
+ base_url = base_url.end_with?("/") ? base_url : "#{base_url}/"
63
+ url = JS.global[:URL].new(base_url, JS.global[:location][:href])
64
+ @resolver = URLResolver.new(url)
65
+ end
66
+
51
67
  # Load the given feature from remote.
52
68
  def load(relative_feature)
53
69
  location = @resolver.get_location(relative_feature)
data/lib/js/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module JS
2
- VERSION = "2.6.2"
2
+ VERSION = "2.7.1"
3
3
  end
data/lib/js.rb CHANGED
@@ -125,7 +125,20 @@ module JS
125
125
  end
126
126
  end
127
127
 
128
- class JS::Object
128
+ # Inherit BasicObject to prevent define coventional menthods. #Override the `Object#send` to give priority to `send` method of JavaScript.
129
+ #
130
+ # This is to make it easier to use JavaScript Objects with `send` method such as `WebSocket` and `XMLHttpRequest`.
131
+ # The JavaScript method call short-hand in `JS::Object` is implemented using `method_missing`.
132
+ # If JS::Object inherits from Object, the `send` method defined in Ruby will take precedence over the JavaScript `send` method.
133
+ # If you want to call the JavaScript `send` method, you must use the `call` method as follows:
134
+ #
135
+ # ws = JS.global[:WebSocket].new("ws://example.com")
136
+ # ws.call(:send, ["Hello, world! from Ruby"])
137
+ #
138
+ # This inheritation allows you to call the JavaScript `send` method with the following syntax:
139
+ #
140
+ # ws.send("Hello, world! from Ruby")
141
+ class JS::Object < BasicObject
129
142
  # Create a JavaScript object with the new method
130
143
  #
131
144
  # The below examples show typical usage in Ruby
@@ -141,7 +154,7 @@ class JS::Object
141
154
  #
142
155
  def new(*args, &block)
143
156
  args = args + [block] if block
144
- JS.global[:Reflect].construct(self, args.to_js)
157
+ ::JS.global[:Reflect].construct(self, args.to_js)
145
158
  end
146
159
 
147
160
  # Converts +self+ to an Array:
@@ -149,8 +162,8 @@ class JS::Object
149
162
  # JS.eval("return [1, 2, 3]").to_a.map(&:to_i) # => [1, 2, 3]
150
163
  # JS.global[:document].querySelectorAll("p").to_a # => [[object HTMLParagraphElement], ...
151
164
  def to_a
152
- as_array = JS.global[:Array].from(self)
153
- Array.new(as_array[:length].to_i) { as_array[_1] }
165
+ as_array = ::JS.global[:Array].from(self)
166
+ ::Array.new(as_array[:length].to_i) { as_array[_1] }
154
167
  end
155
168
 
156
169
  # Provide a shorthand form for JS::Object#call
@@ -173,32 +186,28 @@ class JS::Object
173
186
  if sym_str.end_with?("?")
174
187
  # When a JS method is called with a ? suffix, it is treated as a predicate method,
175
188
  # and the return value is converted to a Ruby boolean value automatically.
176
- result = self.call(sym_str[0..-2].to_sym, *args, &block)
177
-
189
+ result = invoke_js_method(sym_str[0..-2].to_sym, *args, &block)
178
190
  # Type coerce the result to boolean type
179
191
  # to match the true/false determination in JavaScript's if statement.
180
- JS.global.Boolean(result) == JS::True
181
- elsif self[sym].typeof == "function"
182
- self.call(sym, *args, &block)
183
- else
184
- super
192
+ return ::JS.global.Boolean(result) == ::JS::True
185
193
  end
194
+
195
+ invoke_js_method(sym, *args, &block)
186
196
  end
187
197
 
188
198
  # Check if a JavaScript method exists
189
199
  #
190
200
  # See JS::Object#method_missing for details.
191
201
  def respond_to_missing?(sym, include_private)
192
- return true if super
193
202
  sym_str = sym.to_s
194
203
  sym = sym_str[0..-2].to_sym if sym_str.end_with?("?")
195
204
  self[sym].typeof == "function"
196
205
  end
197
206
 
198
- # Call the receiver (a JavaScript function) with `undefined` as its receiver context.
207
+ # Call the receiver (a JavaScript function) with `undefined` as its receiver context.
199
208
  # This method is similar to JS::Object#call, but it is used to call a function that is not
200
209
  # a method of an object.
201
- #
210
+ #
202
211
  # floor = JS.global[:Math][:floor]
203
212
  # floor.apply(3.14) # => 3
204
213
  # JS.global[:Promise].new do |resolve, reject|
@@ -206,7 +215,7 @@ class JS::Object
206
215
  # end.await # => 42
207
216
  def apply(*args, &block)
208
217
  args = args + [block] if block
209
- JS.global[:Reflect].call(:apply, self, JS::Undefined, args.to_js)
218
+ ::JS.global[:Reflect].call(:apply, self, ::JS::Undefined, args.to_js)
210
219
  end
211
220
 
212
221
  # Await a JavaScript Promise like `await` in JavaScript.
@@ -236,8 +245,35 @@ class JS::Object
236
245
  # JS.eval("return new Promise((ok, err) => err(new Error())").await # => raises JS::Error
237
246
  def await
238
247
  # Promise.resolve wrap a value or flattens promise-like object and its thenable chain
239
- promise = JS.global[:Promise].resolve(self)
240
- JS.promise_scheduler.await(promise)
248
+ promise = ::JS.global[:Promise].resolve(self)
249
+ ::JS.promise_scheduler.await(promise)
250
+ end
251
+
252
+ # The `respond_to?` method is only used in unit tests.
253
+ # There is little need to define it here.
254
+ # However, methods suffixed with `?` do not conflict with JavaScript methods.
255
+ # As there are no disadvantages, we will define the `respond_to?` method here
256
+ # in the same way as the `nil?` and `is_a?` methods, prioritizing convenience.
257
+ [:nil?, :is_a?, :raise, :respond_to?].each do |method|
258
+ define_method(method, ::Object.instance_method(method))
259
+ end
260
+
261
+ private
262
+
263
+ # Invoke a JavaScript method
264
+ # If the property of JavaScritp object does not exist, raise a `NoMethodError`.
265
+ # If the property exists but is not a function, raise a `TypeError`.
266
+ def invoke_js_method(sym, *args, &block)
267
+ return self.call(sym, *args, &block) if self[sym].typeof == "function"
268
+
269
+ # Check to see if a non-functional property exists.
270
+ if ::JS.global[:Reflect].call(:has, self, sym.to_s) == ::JS::True
271
+ raise ::TypeError,
272
+ "`#{sym}` is not a function. To reference a property, use `[:#{sym}]` syntax instead."
273
+ end
274
+
275
+ raise ::NoMethodError,
276
+ "undefined method `#{sym}' for an instance of JS::Object"
241
277
  end
242
278
  end
243
279
 
data/wit/js-runtime.wit CHANGED
@@ -14,7 +14,7 @@ interface js-runtime {
14
14
  instance-of: func(value: borrow<js-abi-value>, klass: borrow<js-abi-value>) -> bool;
15
15
  global-this: func() -> js-abi-value;
16
16
  int-to-js-number: func(value: s32) -> js-abi-value;
17
- float-to-js-number: func(value: float64) -> js-abi-value;
17
+ float-to-js-number: func(value: f64) -> js-abi-value;
18
18
  string-to-js-string: func(value: string) -> js-abi-value;
19
19
  bool-to-js-bool: func(value: bool) -> js-abi-value;
20
20
  proc-to-js-function: func() -> js-abi-value;
@@ -23,7 +23,7 @@ interface js-runtime {
23
23
  js-value-to-string: func(value: borrow<js-abi-value>) -> string;
24
24
 
25
25
  variant raw-integer {
26
- as-float(float64),
26
+ as-float(f64),
27
27
  bignum(string),
28
28
  }
29
29
 
data/wit/ruby-runtime.wit CHANGED
@@ -3,17 +3,13 @@ package ruby:js;
3
3
  interface ruby-runtime {
4
4
  use js-runtime.{js-abi-value};
5
5
 
6
- resource rb-iseq {}
7
6
  resource rb-abi-value {}
8
7
 
9
8
  type rb-errno = s32;
10
9
  type rb-id = u32;
11
10
 
12
11
  ruby-show-version: func();
13
- ruby-init: func();
14
- ruby-sysinit: func(args: list<string>);
15
- ruby-options: func(args: list<string>) -> rb-iseq;
16
- ruby-script: func(name: string);
12
+ ruby-init: func(args: list<string>);
17
13
  ruby-init-loadpath: func();
18
14
  rb-eval-string-protect: func(str: string) -> tuple<rb-abi-value, s32>;
19
15
  rb-funcallv-protect: func(recv: borrow<rb-abi-value>, mid: rb-id, args: list<borrow<rb-abi-value>>) -> tuple<rb-abi-value, s32>;
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.2
4
+ version: 2.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuta Saito
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-06-29 00:00:00.000000000 Z
10
+ date: 2025-01-23 00:00:00.000000000 Z
12
11
  dependencies: []
13
12
  description: JavaScript bindings for ruby.wasm. This gem provides a way to use JavaScript
14
13
  functionalities from Ruby through WebAssembly.
@@ -52,7 +51,6 @@ licenses:
52
51
  - MIT
53
52
  metadata:
54
53
  source_code_uri: https://github.com/ruby/ruby.wasm/tree/main/packages/gems/js
55
- post_install_message:
56
54
  rdoc_options: []
57
55
  require_paths:
58
56
  - lib
@@ -67,8 +65,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
65
  - !ruby/object:Gem::Version
68
66
  version: '0'
69
67
  requirements: []
70
- rubygems_version: 3.5.9
71
- signing_key:
68
+ rubygems_version: 3.6.0.dev
72
69
  specification_version: 4
73
70
  summary: JavaScript bindings for ruby.wasm
74
71
  test_files: []