@@ -5,27 +5,32 @@ const VERSIONS = Dict(
5
5
)
6
6
7
7
# TODO : Add any new types as they're added
8
- const SUPPORTED_TYPES = Dict {Symbol,Type} (
9
- Base. typename (x). name => x for x in [
10
- BenchmarkGroup,
11
- Parameters,
12
- TagFilter,
13
- Trial,
14
- TrialEstimate,
15
- TrialJudgement,
16
- TrialRatio,
17
- ]
8
+ const SUPPORTED_TYPES = Set {Type} ((
9
+ BenchmarkGroup,
10
+ Parameters,
11
+ TagFilter,
12
+ Trial,
13
+ TrialEstimate,
14
+ TrialJudgement,
15
+ TrialRatio,
16
+ LinuxPerf. Stats,
17
+ LinuxPerf. ThreadStats,
18
+ LinuxPerf. Counter,
19
+ LinuxPerf. EventType
20
+ ))
21
+ const LOWERED_TO_SUPPORTED_TYPES = Dict {Symbol,Type} (
22
+ Base. typename (x). name => x for x in SUPPORTED_TYPES
18
23
)
19
24
# n.b. Benchmark type not included here, since it is gensym'd
20
25
21
- function JSON. lower (x:: Union{values( SUPPORTED_TYPES) ...} )
26
+ function JSON. lower (x:: Union{SUPPORTED_TYPES...} )
22
27
d = Dict {String,Any} ()
23
28
T = typeof (x)
24
29
for i in 1 : nfields (x)
25
30
name = String (fieldname (T, i))
26
31
field = getfield (x, i)
27
32
ft = typeof (field)
28
- value = ft <: get ( SUPPORTED_TYPES, nameof (ft), Union{} ) ? JSON. lower (field) : field
33
+ value = ( ft in SUPPORTED_TYPES) ? JSON. lower (field) : field
29
34
d[name] = value
30
35
end
31
36
return [string (nameof (typeof (x))), d]
@@ -40,26 +45,25 @@ function safeeval(x::Expr)
40
45
x. head === :tuple && return ((safeeval (a) for a in x. args). .. ,)
41
46
return x
42
47
end
48
+ recover (:: Nothing ) = nothing
43
49
function recover (x:: Vector )
44
50
length (x) == 2 || throw (ArgumentError (" Expecting a vector of length 2" ))
45
51
typename = x[1 ]:: String
46
52
fields = x[2 ]:: Dict
47
53
startswith (typename, " BenchmarkTools." ) &&
48
54
(typename = typename[(sizeof (" BenchmarkTools." ) + 1 ): end ])
49
- T = SUPPORTED_TYPES [Symbol (typename)]
55
+ T = LOWERED_TO_SUPPORTED_TYPES [Symbol (typename)]
50
56
fc = fieldcount (T)
51
57
xs = Vector {Any} (undef, fc)
52
58
for i in 1 : fc
53
59
ft = fieldtype (T, i)
54
60
fn = String (fieldname (T, i))
55
- if ft == Union{Nothing,LinuxPerf. Stats}
56
- xsi = if isnothing (fields[fn])
57
- nothing
58
- else
59
- convert (ft, fields[fn])
60
- end
61
- elseif ft <: get (SUPPORTED_TYPES, nameof (ft), Union{})
61
+ if ft == Union{Nothing, LinuxPerf. Stats} || ft in SUPPORTED_TYPES
62
62
xsi = recover (fields[fn])
63
+ elseif ft == Vector{LinuxPerf. ThreadStats}
64
+ xsi = recover .(fields[fn])
65
+ elseif ft == Vector{Vector{LinuxPerf. Counter}}
66
+ xsi = [[recover (c) for c in t] for t in fields[fn]]
63
67
else
64
68
xsi = convert (ft, fields[fn])
65
69
end
@@ -120,7 +124,7 @@ function save(io::IO, args...)
120
124
" in the order it appears in the input."
121
125
)
122
126
continue
123
- elseif ! (arg isa get (SUPPORTED_TYPES, nameof ( typeof (arg)), Union{}))
127
+ elseif typeof (arg) ∉ SUPPORTED_TYPES
124
128
throw (ArgumentError (" Only BenchmarkTools types can be serialized." ))
125
129
end
126
130
push! (goodargs, arg)
0 commit comments