From 6ab13a870fadddfbb753a351236fd9c9f58d95aa Mon Sep 17 00:00:00 2001 From: GGRei Date: Sun, 28 Jan 2024 18:23:36 +0100 Subject: [PATCH] v.gen.js: fix u16 cast handling in the JS backend (#20620) --- vlib/v/gen/js/builtin_types.v | 10 ++++++---- vlib/v/gen/js/tests/testdata/u16.out | 5 +++++ vlib/v/gen/js/tests/testdata/u16.v | 8 ++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 vlib/v/gen/js/tests/testdata/u16.out create mode 100644 vlib/v/gen/js/tests/testdata/u16.v diff --git a/vlib/v/gen/js/builtin_types.v b/vlib/v/gen/js/builtin_types.v index d7af533ef..69118fcee 100644 --- a/vlib/v/gen/js/builtin_types.v +++ b/vlib/v/gen/js/builtin_types.v @@ -335,7 +335,7 @@ fn (mut g JsGen) gen_builtin_type_defs() { for typ_name in v_types { // TODO: JsDoc match typ_name { - 'i8', 'i16', 'int', 'u16', 'int_literal' { + 'i8', 'i16', 'int', 'int_literal' { // TODO: Bounds checking g.gen_builtin_prototype( typ_name: typ_name @@ -348,13 +348,15 @@ fn (mut g JsGen) gen_builtin_type_defs() { to_jsval: '+this' ) } - // u32 requires special handling in JavaScript to correctly represent it as an unsigned 32-bit integer. + // u16 / u32 requires special handling in JavaScript to correctly represent it as an unsigned 32-bit integer. // The '>>> 0' bit operation ensures it is treated as unsigned, covering the full 0 to 2^32-1 range. - 'u32' { + // For u16, '>>> 0' combined with a mask of 0xffff limits it to the 0 to 2^16-1 range, correctly handling values as unsigned 16-bit integers. + 'u16', 'u32' { g.gen_builtin_prototype( typ_name: typ_name default_value: 'new Number(0)' - constructor: 'this.val = Math.floor(Number(val) & 0xffffffff) >>> 0' + constructor: "this.val = Math.floor(Number(val) & ('" + typ_name + + '\' === "u16" ? 0xffff : 0xffffffff)) >>> 0' value_of: 'Number(this.val)' to_string: 'this.valueOf().toString()' eq: 'new bool(self.valueOf() === other.valueOf())' diff --git a/vlib/v/gen/js/tests/testdata/u16.out b/vlib/v/gen/js/tests/testdata/u16.out new file mode 100644 index 000000000..92b3f0780 --- /dev/null +++ b/vlib/v/gen/js/tests/testdata/u16.out @@ -0,0 +1,5 @@ +65535 +0 +true +56000 +65535 \ No newline at end of file diff --git a/vlib/v/gen/js/tests/testdata/u16.v b/vlib/v/gen/js/tests/testdata/u16.v new file mode 100644 index 000000000..0244f637f --- /dev/null +++ b/vlib/v/gen/js/tests/testdata/u16.v @@ -0,0 +1,8 @@ +fn main() { + println(u16(0xFFFF)) + println(u16(65535) + 1) + + println(u16(42) == u16(42)) + println(u16(1000) * 56) + println(u16(0xFFFFFFFF)) +} -- 2.39.5