Skip to content

Commit d1670fe

Browse files
Merge pull request #167 from ruby/katei/float-to-js
Add `Float#to_js`
2 parents bcc4c30 + 4fd8e89 commit d1670fe

File tree

10 files changed

+40
-0
lines changed

10 files changed

+40
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ rb_js_abi_host_js_abi_value_t rb_js_abi_host_int_to_js_number(int32_t value) {
121121
int32_t ret = __wasm_import_rb_js_abi_host_int_to_js_number(value);
122122
return (rb_js_abi_host_js_abi_value_t){ ret };
123123
}
124+
__attribute__((import_module("rb-js-abi-host"), import_name("float-to-js-number: func(value: float64) -> handle<js-abi-value>")))
125+
int32_t __wasm_import_rb_js_abi_host_float_to_js_number(double);
126+
rb_js_abi_host_js_abi_value_t rb_js_abi_host_float_to_js_number(double value) {
127+
int32_t ret = __wasm_import_rb_js_abi_host_float_to_js_number(value);
128+
return (rb_js_abi_host_js_abi_value_t){ ret };
129+
}
124130
__attribute__((import_module("rb-js-abi-host"), import_name("string-to-js-string: func(value: string) -> handle<js-abi-value>")))
125131
int32_t __wasm_import_rb_js_abi_host_string_to_js_string(int32_t, int32_t);
126132
rb_js_abi_host_js_abi_value_t rb_js_abi_host_string_to_js_string(rb_js_abi_host_string_t *value) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ extern "C"
5252
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);
5353
rb_js_abi_host_js_abi_value_t rb_js_abi_host_global_this(void);
5454
rb_js_abi_host_js_abi_value_t rb_js_abi_host_int_to_js_number(int32_t value);
55+
rb_js_abi_host_js_abi_value_t rb_js_abi_host_float_to_js_number(double value);
5556
rb_js_abi_host_js_abi_value_t rb_js_abi_host_string_to_js_string(rb_js_abi_host_string_t *value);
5657
rb_js_abi_host_js_abi_value_t rb_js_abi_host_bool_to_js_bool(bool value);
5758
rb_js_abi_host_js_abi_value_t rb_js_abi_host_proc_to_js_function(uint32_t value);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ is-js: func(value: js-abi-value) -> bool
1010
instance-of: func(value: js-abi-value, klass: js-abi-value) -> bool
1111
global-this: func() -> js-abi-value
1212
int-to-js-number: func(value: s32) -> js-abi-value
13+
float-to-js-number: func(value: float64) -> js-abi-value
1314
string-to-js-string: func(value: string) -> js-abi-value
1415
bool-to-js-bool: func(value: bool) -> js-abi-value
1516
proc-to-js-function: func(value: u32) -> js-abi-value

ext/js/js-core.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
extern VALUE rb_mKernel;
1414
extern VALUE rb_cInteger;
15+
extern VALUE rb_cFloat;
1516
extern VALUE rb_cString;
1617
extern VALUE rb_cTrueClass;
1718
extern VALUE rb_cFalseClass;
@@ -444,6 +445,16 @@ static VALUE _rb_js_integer_to_js(VALUE obj) {
444445
}
445446
}
446447

448+
/*
449+
* call-seq:
450+
* to_js -> JS::Object
451+
*
452+
* Returns +self+ as a JS::Object.
453+
*/
454+
static VALUE _rb_js_float_to_js(VALUE obj) {
455+
return jsvalue_s_new(rb_js_abi_host_float_to_js_number(RFLOAT_VALUE(obj)));
456+
}
457+
447458
/*
448459
* call-seq:
449460
* to_js -> JS::Object
@@ -556,6 +567,7 @@ void Init_js() {
556567
rb_define_singleton_method(rb_cJS_Object, "wrap", _rb_js_obj_wrap, 1);
557568

558569
rb_define_method(rb_cInteger, "to_js", _rb_js_integer_to_js, 0);
570+
rb_define_method(rb_cFloat, "to_js", _rb_js_float_to_js, 0);
559571
rb_define_method(rb_cString, "to_js", _rb_js_string_to_js, 0);
560572
rb_define_method(rb_cTrueClass, "to_js", _rb_js_true_to_js, 0);
561573
rb_define_method(rb_cFalseClass, "to_js", _rb_js_false_to_js, 0);

packages/npm-packages/ruby-wasm-wasi/src/bindgen/rb-js-abi-host.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export interface RbJsAbiHost {
2323
instanceOf(value: JsAbiValue, klass: JsAbiValue): boolean;
2424
globalThis(): JsAbiValue;
2525
intToJsNumber(value: number): JsAbiValue;
26+
floatToJsNumber(value: number): JsAbiValue;
2627
stringToJsString(value: string): JsAbiValue;
2728
boolToJsBool(value: boolean): JsAbiValue;
2829
procToJsFunction(value: number): JsAbiValue;

packages/npm-packages/ruby-wasm-wasi/src/bindgen/rb-js-abi-host.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ export function addRbJsAbiHostToImports(imports, obj, get_export) {
4141
const ret0 = obj.intToJsNumber(arg0);
4242
return resources0.insert(ret0);
4343
};
44+
imports["rb-js-abi-host"]["float-to-js-number: func(value: float64) -> handle<js-abi-value>"] = function(arg0) {
45+
const ret0 = obj.floatToJsNumber(arg0);
46+
return resources0.insert(ret0);
47+
};
4448
imports["rb-js-abi-host"]["string-to-js-string: func(value: string) -> handle<js-abi-value>"] = function(arg0, arg1) {
4549
const memory = get_export("memory");
4650
const ptr0 = arg0;

packages/npm-packages/ruby-wasm-wasi/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ export class RubyVM {
103103
intToJsNumber: (value) => {
104104
return value;
105105
},
106+
floatToJsNumber: (value) => {
107+
return value;
108+
},
106109
stringToJsString: (value) => {
107110
return value;
108111
},

packages/npm-packages/ruby-wasm-wasi/test/js_from_rb.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ describe("Manipulation of JS from Ruby", () => {
169169
test.each([
170170
{ expr: `JS.global`, expected: "[object Object]" },
171171
{ expr: `1.to_js`, expected: "1" },
172+
{ expr: `(0.5).to_js`, expected: "0.5" },
172173
{ expr: `JS.eval("return null")`, expected: "null" },
173174
{ expr: `JS.eval("return undefined")`, expected: "undefined" },
174175
{ expr: `JS.eval("return Symbol('sym')")`, expected: "Symbol(sym)" },

packages/npm-packages/ruby-wasm-wasi/test/test_unit.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
require_relative "./unit/test_object"
33
require_relative "./unit/test_error"
44
require_relative "./unit/test_async"
5+
require_relative "./unit/test_float"
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
require "test-unit"
2+
require "js"
3+
4+
class JS::TestFloat < Test::Unit::TestCase
5+
def test_to_js
6+
assert_equal (1.0).to_js, JS.eval("return 1.0;")
7+
assert_equal (0.5).to_js, JS.eval("return 0.5;")
8+
assert_equal (0.3).to_js, JS.eval("return 0.3;")
9+
end
10+
end

0 commit comments

Comments
 (0)