@@ -29,6 +29,31 @@ function JSON.lower(x::Union{values(SUPPORTED_TYPES)...})
29
29
return [string (nameof (typeof (x))), d]
30
30
end
31
31
32
+ # Recovers LinuxPerf.Stats from serialized form
33
+ function _convert (:: Type{Union{Nothing,LinuxPerf.Stats}} , d)
34
+ if isnothing (d)
35
+ return nothing
36
+ end
37
+ return LinuxPerf. Stats (_convert .(LinuxPerf. ThreadStats, d[" threads" ]))
38
+ end
39
+ function _convert (:: Type{LinuxPerf.ThreadStats} , d:: Dict{String} )
40
+ return LinuxPerf. ThreadStats (
41
+ d[" pid" ],
42
+ [
43
+ [_convert (LinuxPerf. Counter, counter) for counter in group] for
44
+ group in d[" groups" ]
45
+ ],
46
+ )
47
+ end
48
+ function _convert (:: Type{LinuxPerf.Counter} , d:: Dict{String} )
49
+ return LinuxPerf. Counter (
50
+ _convert (LinuxPerf. EventType, d[" event" ]), d[" value" ], d[" enabled" ], d[" running" ]
51
+ )
52
+ end
53
+ function _convert (:: Type{LinuxPerf.EventType} , d:: Dict{String} )
54
+ return LinuxPerf. EventType (d[" category" ], d[" event" ])
55
+ end
56
+
32
57
# a minimal 'eval' function, mirroring KeyTypes, but being slightly more lenient
33
58
safeeval (@nospecialize x) = x
34
59
safeeval (x:: QuoteNode ) = x. value
@@ -50,7 +75,9 @@ function recover(x::Vector)
50
75
for i in 1 : fc
51
76
ft = fieldtype (T, i)
52
77
fn = String (fieldname (T, i))
53
- if ft <: get (SUPPORTED_TYPES, nameof (ft), Union{})
78
+ if ft == Union{Nothing,LinuxPerf. Stats}
79
+ xsi = _convert (ft, fields[fn])
80
+ elseif ft <: get (SUPPORTED_TYPES, nameof (ft), Union{})
54
81
xsi = recover (fields[fn])
55
82
else
56
83
xsi = if fn == " evals_set" && ! haskey (fields, fn)
0 commit comments