diff options
author | metagn <metagngn@gmail.com> | 2024-09-17 04:50:10 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-17 09:50:10 +0800 |
commit | fe55dcb2be26e9b955ad949a65bf94e65478a1ab (patch) | |
tree | 37827bb2eb0a56ede886a66b95130e3fda1bb265 /tests/stdlib/tmarshalsegfault.nim | |
parent | 651fdbe586bcee64bd7f4b96c2b98b5970d0eb62 (diff) | |
download | Nim-fe55dcb2be26e9b955ad949a65bf94e65478a1ab.tar.gz |
test case haul before 2.2 (#24119)
closes #4774, closes #7385, closes #10019, closes #12405, closes #12732, closes #13270, closes #13799, closes #15247, closes #16128, closes #16175, closes #16774, closes #17527, closes #20880, closes #21346
Diffstat (limited to 'tests/stdlib/tmarshalsegfault.nim')
-rw-r--r-- | tests/stdlib/tmarshalsegfault.nim | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/tests/stdlib/tmarshalsegfault.nim b/tests/stdlib/tmarshalsegfault.nim new file mode 100644 index 000000000..a18ace6d1 --- /dev/null +++ b/tests/stdlib/tmarshalsegfault.nim @@ -0,0 +1,55 @@ +# issue #12405 + +import std/[marshal, streams, times, tables, os, assertions] + +type AiredEpisodeState * = ref object + airedAt * : DateTime + tvShowId * : string + seasonNumber * : int + number * : int + title * : string + +type ShowsWatchlistState * = ref object + aired * : seq[AiredEpisodeState] + +type UiState * = ref object + shows: ShowsWatchlistState + +# Helpers to marshal and unmarshal +proc load * ( state : var UiState, file : string ) = + var strm = newFileStream( file, fmRead ) + + strm.load( state ) + + strm.close() + +proc store * ( state : UiState, file : string ) = + var strm = newFileStream( file, fmWrite ) + + strm.store( state ) + + strm.close() + +# 1. We fill the state initially +var state : UiState = UiState( shows: ShowsWatchlistState( aired: @[] ) ) + +# VERY IMPORTANT: For some reason, small numbers (like 2 or 3) don't trigger the bug. Anything above 7 or 8 on my machine triggers though +for i in 0..30: + var episode = AiredEpisodeState( airedAt: now(), tvShowId: "1", seasonNumber: 1, number: 1, title: "string" ) + + state.shows.aired.add( episode ) + +# 2. Store it in a file with the marshal module, and then load it back up +store( state, "tmarshalsegfault_data" ) +load( state, "tmarshalsegfault_data" ) +removeFile("tmarshalsegfault_data") + +# 3. VERY IMPORTANT: Without this line, for some reason, everything works fine +state.shows.aired[ 0 ] = AiredEpisodeState( airedAt: now(), tvShowId: "1", seasonNumber: 1, number: 1, title: "string" ) + +# 4. And formatting the airedAt date will now trigger the exception +var s = "" +for ep in state.shows.aired: + let x = $ep.seasonNumber & "x" & $ep.number & " (" & $ep.airedAt & ")" + if s.len == 0: s = x + else: doAssert s == x |