Skip to content

Commit a8b0e1d

Browse files
x.json2: fix decode_number not initializing value to zero (fix #25641) (#25675)
1 parent 82d4ba6 commit a8b0e1d

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

vlib/x/json2/decode.v

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ fn (mut decoder Decoder) decode_number[T](val &T) ! {
946946
}
947947

948948
// doing it like this means the minimum of signed numbers does not overflow before being inverted
949+
*val = 0 // initialize to zero before accumulating digits
949950
if !is_negative {
950951
digit_amount := get_number_digits(*val)
951952

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import x.json2
2+
3+
struct TestStruct {
4+
age u16 = 25
5+
}
6+
7+
fn test_u16_in_struct() {
8+
original := TestStruct{}
9+
encoded := json2.encode(original)
10+
println('Encoded: ${encoded}')
11+
12+
decoded := json2.decode[TestStruct](encoded) or { panic('Failed to decode: ${err}') }
13+
println('Decoded: ${decoded}')
14+
println('Age value: ${decoded.age}')
15+
16+
assert decoded.age == 25, 'Expected age 25, got ${decoded.age}'
17+
}
18+
19+
fn test_u16_direct() {
20+
decoded := json2.decode[u16]('25') or { panic('Failed: ${err}') }
21+
println('Direct u16 decode of "25": ${decoded}')
22+
assert decoded == 25, 'Expected 25, got ${decoded}'
23+
}
24+
25+
fn main() {
26+
test_u16_direct()
27+
test_u16_in_struct()
28+
println('All tests passed!')
29+
}

0 commit comments

Comments
 (0)