From d413dece45f0bf99fb629c49f32ae68085c14020 Mon Sep 17 00:00:00 2001 From: GGRei Date: Sun, 21 Jan 2024 13:40:53 +0100 Subject: [PATCH] jsgen: fix javascript backend treating u32 as i32 (fix #20499) (#20618) --- vlib/v/gen/js/builtin_types.v | 15 ++++++++++++++- vlib/v/gen/js/tests/testdata/u32.out | 4 ++++ vlib/v/gen/js/tests/testdata/u32.v | 7 +++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/js/tests/testdata/u32.out create mode 100644 vlib/v/gen/js/tests/testdata/u32.v diff --git a/vlib/v/gen/js/builtin_types.v b/vlib/v/gen/js/builtin_types.v index 72619a9b4..d7af533ef 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', 'u32', 'int_literal' { + 'i8', 'i16', 'int', 'u16', 'int_literal' { // TODO: Bounds checking g.gen_builtin_prototype( typ_name: typ_name @@ -348,6 +348,19 @@ 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. + // The '>>> 0' bit operation ensures it is treated as unsigned, covering the full 0 to 2^32-1 range. + 'u32' { + g.gen_builtin_prototype( + typ_name: typ_name + default_value: 'new Number(0)' + constructor: 'this.val = Math.floor(Number(val) & 0xffffffff) >>> 0' + value_of: 'Number(this.val)' + to_string: 'this.valueOf().toString()' + eq: 'new bool(self.valueOf() === other.valueOf())' + to_jsval: '+this' + ) + } // u64 and i64 are so big that their values do not fit into JS number so we use BigInt. 'u64' { if g.pref.output_es5 { diff --git a/vlib/v/gen/js/tests/testdata/u32.out b/vlib/v/gen/js/tests/testdata/u32.out new file mode 100644 index 000000000..9710b4f0b --- /dev/null +++ b/vlib/v/gen/js/tests/testdata/u32.out @@ -0,0 +1,4 @@ +4294967295 +0 +true +25600000 \ No newline at end of file diff --git a/vlib/v/gen/js/tests/testdata/u32.v b/vlib/v/gen/js/tests/testdata/u32.v new file mode 100644 index 000000000..528c07d05 --- /dev/null +++ b/vlib/v/gen/js/tests/testdata/u32.v @@ -0,0 +1,7 @@ +fn main() { + println(u32(0xFFFFFFFF)) + println(u32(4294967295) + 1) + + println(u32(42) == u32(42)) + println(u32(100000) * 256) +} -- 2.39.5