diff options
| -rw-r--r-- | gi/js-value-inl.h | 7 | ||||
| -rw-r--r-- | installed-tests/js/testRegress.js | 14 |
2 files changed, 19 insertions, 2 deletions
diff --git a/gi/js-value-inl.h b/gi/js-value-inl.h index da1d5135..7a73b72e 100644 --- a/gi/js-value-inl.h +++ b/gi/js-value-inl.h @@ -197,6 +197,13 @@ GJS_JSAPI_RETURN_CONVENTION inline bool js_value_to_c_checked( if constexpr (std::is_same_v<WantedType, T>) return js_value_to_c(cx, value, out); + if constexpr (std::is_integral_v<WantedType>) { + if (value.isUndefined()) { + *out = 0; + return true; + } + } + if constexpr (std::is_arithmetic_v<T>) { bool ret = js_value_to_c(cx, value, out); if (out_of_range) { diff --git a/installed-tests/js/testRegress.js b/installed-tests/js/testRegress.js index 56296d94..f067f1a1 100644 --- a/installed-tests/js/testRegress.js +++ b/installed-tests/js/testRegress.js @@ -28,10 +28,13 @@ describe('Life, the Universe and Everything', function () { const method = `test_int${bits}`; expect(Regress[method](42)).toBe(42); expect(Regress[method](-42)).toBe(-42); + expect(Regress[method](undefined)).toBe(0); }); it(`includes unsigned ${bits}-bit integers`, function () { - expect(Regress[`test_uint${bits}`](42)).toBe(42); + const method = `test_uint${bits}`; + expect(Regress[method](42)).toBe(42); + expect(Regress[method](undefined)).toBe(0); }); }); @@ -40,12 +43,19 @@ describe('Life, the Universe and Everything', function () { const method = `test_${type}`; expect(Regress[method](42)).toBe(42); expect(Regress[method](-42)).toBe(-42); + + if (['float', 'double'].includes(type)) + expect(Number.isNaN(Regress[method](undefined))).toBeTruthy(); + else + expect(Regress[method](undefined)).toBe(0); }); }); ['ushort', 'uint', 'ulong', 'size'].forEach(type => { it(`includes ${type}s`, function () { - expect(Regress[`test_${type}`](42)).toBe(42); + const method = `test_${type}`; + expect(Regress[method](42)).toBe(42); + expect(Regress[method](undefined)).toBe(0); }); }); |
