4747
4848get_source (meth:: Method ) = Base. uncompressed_ast (meth)
4949
50- function get_source (g:: GeneratedFunctionStub , env)
51- b = g (env... , g. argnames... )
52- b isa CodeInfo && return b
53- return eval (b)
54- end
50+ # The following creates the CodeInfo holding the generated expression. May be
51+ # useful if we decide to revert to that behavior.
52+ # function get_source(g::GeneratedFunctionStub, env)
53+ # b = @which g(env..., g.argnames...)
54+ # b isa CodeInfo && return b
55+ # return eval(b)
56+ # end
5557
5658function copy_codeinfo (code:: CodeInfo )
5759 @static if VERSION < v " 1.1.0-DEV.762"
@@ -129,6 +131,7 @@ function prepare_framecode(method::Method, @nospecialize(argtypes); enter_genera
129131 framecode = get (framedict, method, nothing )
130132 end
131133 if framecode === nothing
134+ method0 = method
132135 if is_generated (method) && ! enter_generated
133136 # If we're stepping into a staged function, we need to use
134137 # the specialization, rather than stepping through the
@@ -138,16 +141,20 @@ function prepare_framecode(method::Method, @nospecialize(argtypes); enter_genera
138141 generator = false
139142 else
140143 if is_generated (method)
141- code = get_source (method. generator, lenv)
144+ g = method. generator
145+ methsg = collect (methods (g. gen))
146+ @assert length (methsg) == 1
147+ method = first (methsg)
148+ code = get_source (method)
142149 generator = true
143150 else
144151 code = get_source (method)
145152 generator = false
146153 end
147154 end
148155 framecode = FrameCode (method, code; generator= generator)
149- if is_generated (method ) && ! enter_generated
150- genframedict[(method , argtypes)] = framecode
156+ if is_generated (method0 ) && ! generator
157+ genframedict[(method0 , argtypes)] = framecode
151158 else
152159 framedict[method] = framecode
153160 end
@@ -225,8 +232,10 @@ function prepare_call(@nospecialize(f), allargs; enter_generated = false)
225232 isa (ret, Compiled) && return ret
226233 # Typical return
227234 framecode, lenv = ret
228- if is_generated (method) && enter_generated
235+ if framecode . generator
229236 args = Any[_Typeof (a) for a in args]
237+ selfarg = Base. unwrap_unionall (scopeof (framecode). sig). parameters[1 ] # #self#
238+ args = Any[selfarg, lenv... , args... ]
230239 end
231240 return framecode, args, lenv, argtypes
232241end
@@ -294,8 +303,9 @@ static parameters `lenv`. See [`JuliaInterpreter.prepare_call`](@ref) for inform
294303"""
295304function prepare_frame (framecode:: FrameCode , args:: Vector{Any} , lenv:: SimpleVector ; enter_generated= false )
296305 s = scopeof (framecode)
297- if isa (s, Method) && is_generated (s) && enter_generated
306+ if framecode . generator
298307 args = Any[_Typeof (a) for a in args]
308+ args = Any[Base. unwrap_unionall (s. sig). parameters[1 ], lenv... , args... ] # first is #self#
299309 end
300310 framedata = prepare_framedata (framecode, args)
301311 resize! (framedata. sparams, length (lenv))
0 commit comments