@@ -11,6 +11,7 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
1111 nargs = length (fargs) # includes f as the first "argument"
1212 # Determine whether we can look up the appropriate framecode in the local method table
1313 if isassigned (parentframe. methodtables, idx) # if this is the first call, this may not yet be set
14+ # The case where `methodtables[idx]` is a `Compiled` has already been handled in `bypass_builtins`
1415 d_meth = d_meth1 = parentframe. methodtables[idx]:: DispatchableMethod
1516 local d_methprev
1617 depth = 1
@@ -20,8 +21,12 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
2021 sig = d_meth. sig. parameters:: SimpleVector
2122 if length (sig) == nargs
2223 # If this is generated, match only if `enter_generated` also matches
23- fi = d_meth. frameinstance:: FrameInstance
24- matches = ! is_generated (scopeof (fi. framecode)) || enter_generated == fi. enter_generated
24+ fi = d_meth. frameinstance
25+ if fi isa FrameInstance
26+ matches = ! is_generated (scopeof (fi. framecode)) || enter_generated == fi. enter_generated
27+ else
28+ matches = ! enter_generated
29+ end
2530 if matches
2631 for i = 1 : nargs
2732 if ! isa (fargs[i], sig[i])
@@ -38,7 +43,11 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
3843 d_methprev. next = d_meth. next
3944 d_meth. next = d_meth1
4045 end
41- return fi. framecode, fi. sparam_vals
46+ if fi isa Compiled
47+ return Compiled (), nothing
48+ else
49+ return fi. framecode, fi. sparam_vals
50+ end
4251 end
4352 end
4453 depth += 1
@@ -52,11 +61,16 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
5261 fargs[1 ] = f = to_function (fargs[1 ])
5362 ret = prepare_call (f, fargs; enter_generated= enter_generated)
5463 ret === nothing && return f (fargs[2 : end ]. .. ), nothing
55- isa (ret, Compiled) && return ret, nothing
56- framecode, args, env, argtypes = ret
57- # Store the results of the method lookup in the local method table
58- fi = FrameInstance (framecode, env, is_generated (scopeof (framecode)) && enter_generated)
59- d_meth = DispatchableMethod (nothing , fi, argtypes)
64+ is_compiled = isa (ret[1 ], Compiled)
65+ local framecode
66+ if is_compiled
67+ d_meth = DispatchableMethod (nothing , Compiled (), ret[2 ])
68+ else
69+ framecode, args, env, argtypes = ret
70+ # Store the results of the method lookup in the local method table
71+ fi = FrameInstance (framecode, env, is_generated (scopeof (framecode)) && enter_generated)
72+ d_meth = DispatchableMethod (nothing , fi, argtypes)
73+ end
6074 if isassigned (parentframe. methodtables, idx)
6175 d_meth. next = parentframe. methodtables[idx]
6276 # Drop the oldest d_meth, if necessary
@@ -74,5 +88,9 @@ function get_call_framecode(fargs::Vector{Any}, parentframe::FrameCode, idx::Int
7488 d_meth. next = nothing
7589 end
7690 parentframe. methodtables[idx] = d_meth
77- return framecode, env
91+ if is_compiled
92+ return Compiled (), nothing
93+ else
94+ return framecode, env
95+ end
7896end
0 commit comments