@@ -77,7 +77,7 @@ const TAGS = Any[
77
77
78
78
@assert length (TAGS) == 255
79
79
80
- const ser_version = 10 # do not make changes without bumping the version #!
80
+ const ser_version = 11 # do not make changes without bumping the version #!
81
81
82
82
const NTAGS = length (TAGS)
83
83
@@ -109,6 +109,7 @@ const ARRAY_TAG = findfirst(==(Array), TAGS)%Int32
109
109
const EXPR_TAG = sertag (Expr)
110
110
const MODULE_TAG = sertag (Module)
111
111
const METHODINSTANCE_TAG = sertag (Core. MethodInstance)
112
+ const CODEINFO_TAG = sertag (Core. CodeInfo)
112
113
const METHOD_TAG = sertag (Method)
113
114
const TASK_TAG = sertag (Task)
114
115
const DATATYPE_TAG = sertag (DataType)
@@ -438,6 +439,41 @@ function serialize(s::AbstractSerializer, linfo::Core.MethodInstance)
438
439
nothing
439
440
end
440
441
442
+ # For future compatibility detection, add a version specifically for CodeInfo.
443
+ # Bump this each time CodeInfo changes, and add a deserializer for the old
444
+ # version.
445
+ # 1 - julia 1.0/1.1 - not stored; must be inferred
446
+ # 2 - julia 1.2 - not stored; must be inferred
447
+ # 3 - julia 1.3/1.4 - not stored; must be inferred
448
+ # 4 - julia 1.5
449
+ const _current_codeinfo_ver = Int32 (4 )
450
+
451
+ function serialize (s:: AbstractSerializer , ci:: Core.CodeInfo )
452
+ serialize_cycle (s, ci) && return
453
+ writetag (s. io, CODEINFO_TAG)
454
+ serialize (s, _current_codeinfo_ver) # for backwards compat
455
+ serialize (s, ci. code)
456
+ serialize (s, ci. codelocs)
457
+ serialize (s, ci. ssavaluetypes)
458
+ serialize (s, ci. ssaflags)
459
+ serialize (s, ci. method_for_inference_limit_heuristics)
460
+ serialize (s, ci. linetable)
461
+ serialize (s, ci. slotnames)
462
+ serialize (s, ci. slotflags)
463
+ serialize (s, ci. slottypes)
464
+ serialize (s, ci. rettype)
465
+ serialize (s, ci. parent)
466
+ serialize (s, ci. edges)
467
+ serialize (s, ci. min_world)
468
+ serialize (s, ci. max_world)
469
+ serialize (s, ci. hide_in_stacktrace)
470
+ serialize (s, ci. inferred)
471
+ serialize (s, ci. inlineable)
472
+ serialize (s, ci. propagate_inbounds)
473
+ serialize (s, ci. pure)
474
+ nothing
475
+ end
476
+
441
477
function serialize (s:: AbstractSerializer , t:: Task )
442
478
serialize_cycle (s, t) && return
443
479
if istaskstarted (t) && ! istaskdone (t)
@@ -1018,7 +1054,37 @@ end
1018
1054
function deserialize (s:: AbstractSerializer , :: Type{CodeInfo} )
1019
1055
ci = ccall (:jl_new_code_info_uninit , Ref{CodeInfo}, ())
1020
1056
deserialize_cycle (s, ci)
1021
- ci. code = deserialize (s):: Vector{Any}
1057
+ code_or_codeinfo_ver = deserialize (s)
1058
+ if code_or_codeinfo_ver isa Vector{Any}
1059
+ ci. code = code_or_codeinfo_ver
1060
+ _deserialize_old_codeinfo! (s, ci)
1061
+ return ci
1062
+ end
1063
+ codeinfo_ver = code_or_codeinfo_ver:: Int32
1064
+ @assert codeinfo_ver == _current_codeinfo_ver
1065
+ ci. code = deserialize (s)
1066
+ ci. codelocs = deserialize (s)
1067
+ ci. ssavaluetypes = deserialize (s)
1068
+ ci. ssaflags = deserialize (s)
1069
+ ci. method_for_inference_limit_heuristics = deserialize (s)
1070
+ ci. linetable = deserialize (s)
1071
+ ci. slotnames = deserialize (s)
1072
+ ci. slotflags = deserialize (s)
1073
+ ci. slottypes = deserialize (s)
1074
+ ci. rettype = deserialize (s)
1075
+ ci. parent = deserialize (s)
1076
+ ci. edges = deserialize (s)
1077
+ ci. min_world = deserialize (s)
1078
+ ci. max_world = deserialize (s)
1079
+ ci. hide_in_stacktrace = deserialize (s)
1080
+ ci. inferred = deserialize (s)
1081
+ ci. inlineable = deserialize (s)
1082
+ ci. propagate_inbounds = deserialize (s)
1083
+ ci. pure = deserialize (s)
1084
+ return ci
1085
+ end
1086
+
1087
+ function _deserialize_old_codeinfo! (s, ci)
1022
1088
ci. codelocs = deserialize (s):: Vector{Int32}
1023
1089
_x = deserialize (s)
1024
1090
if _x isa Array || _x isa Int
@@ -1054,7 +1120,6 @@ function deserialize(s::AbstractSerializer, ::Type{CodeInfo})
1054
1120
ci. max_world = reinterpret (UInt, deserialize (s))
1055
1121
end
1056
1122
end
1057
- ci. hide_in_stacktrace = deserialize (s)
1058
1123
ci. inferred = deserialize (s)
1059
1124
ci. inlineable = deserialize (s)
1060
1125
ci. propagate_inbounds = deserialize (s)
0 commit comments