diff --git a/packages/gems/js/lib/js.rb b/packages/gems/js/lib/js.rb index b5c6f68350..04ef16761e 100644 --- a/packages/gems/js/lib/js.rb +++ b/packages/gems/js/lib/js.rb @@ -173,7 +173,11 @@ def method_missing(sym, *args, &block) if sym_str.end_with?("?") # When a JS method is called with a ? suffix, it is treated as a predicate method, # and the return value is converted to a Ruby boolean value automatically. - self.call(sym_str[0..-2].to_sym, *args, &block) == JS::True + result = self.call(sym_str[0..-2].to_sym, *args, &block) + + # Type coerce the result to boolean type + # to match the true/false determination in JavaScript's if statement. + JS.global.Boolean(result) == JS::True elsif self[sym].typeof == "function" self.call(sym, *args, &block) else diff --git a/packages/npm-packages/ruby-wasm-wasi/test/unit/test_object.rb b/packages/npm-packages/ruby-wasm-wasi/test/unit/test_object.rb index 13e9bc3f3a..84b2885552 100644 --- a/packages/npm-packages/ruby-wasm-wasi/test/unit/test_object.rb +++ b/packages/npm-packages/ruby-wasm-wasi/test/unit/test_object.rb @@ -322,7 +322,9 @@ def test_method_missing_with_? return { return_true() { return true; }, return_false() { return false; }, - return_object() { return {}; } + return_object() { return {}; }, + return_null() { return null; }, + return_empty_string() { return ''; } }; JS @@ -334,8 +336,12 @@ def test_method_missing_with_? assert_true object.return_true? assert_false object.return_false? - # Return Ruby false when the return value is not JS::True - assert_false object.return_object? + # Return Ruby true when the return value is JavaScript true + assert_true object.return_object? + + # Return Ruby false when the return value is JavaScript false + assert_false object.return_null? + assert_false object.return_empty_string? end def test_respond_to_missing?