From a8b0e1d5ed3096edce359cd5d7d2fbb7ab50d31e Mon Sep 17 00:00:00 2001 From: Chethan Yadav Date: Thu, 6 Nov 2025 12:29:48 +0530 Subject: [PATCH] x.json2: fix decode_number not initializing value to zero (fix #25641) (#25675) --- vlib/x/json2/decode.v | 1 + vlib/x/json2/tests/issue_25641_test.v | 29 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 vlib/x/json2/tests/issue_25641_test.v diff --git a/vlib/x/json2/decode.v b/vlib/x/json2/decode.v index c36b8ef1a..4b5896ac7 100644 --- a/vlib/x/json2/decode.v +++ b/vlib/x/json2/decode.v @@ -946,6 +946,7 @@ fn (mut decoder Decoder) decode_number[T](val &T) ! { } // doing it like this means the minimum of signed numbers does not overflow before being inverted + *val = 0 // initialize to zero before accumulating digits if !is_negative { digit_amount := get_number_digits(*val) diff --git a/vlib/x/json2/tests/issue_25641_test.v b/vlib/x/json2/tests/issue_25641_test.v new file mode 100644 index 000000000..aa0de0512 --- /dev/null +++ b/vlib/x/json2/tests/issue_25641_test.v @@ -0,0 +1,29 @@ +import x.json2 + +struct TestStruct { + age u16 = 25 +} + +fn test_u16_in_struct() { + original := TestStruct{} + encoded := json2.encode(original) + println('Encoded: ${encoded}') + + decoded := json2.decode[TestStruct](encoded) or { panic('Failed to decode: ${err}') } + println('Decoded: ${decoded}') + println('Age value: ${decoded.age}') + + assert decoded.age == 25, 'Expected age 25, got ${decoded.age}' +} + +fn test_u16_direct() { + decoded := json2.decode[u16]('25') or { panic('Failed: ${err}') } + println('Direct u16 decode of "25": ${decoded}') + assert decoded == 25, 'Expected 25, got ${decoded}' +} + +fn main() { + test_u16_direct() + test_u16_in_struct() + println('All tests passed!') +} -- 2.39.5