47
47
48
48
get_source (meth:: Method ) = Base. uncompressed_ast (meth)
49
49
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
55
57
56
58
function copy_codeinfo (code:: CodeInfo )
57
59
@static if VERSION < v " 1.1.0-DEV.762"
@@ -129,6 +131,7 @@ function prepare_framecode(method::Method, @nospecialize(argtypes); enter_genera
129
131
framecode = get (framedict, method, nothing )
130
132
end
131
133
if framecode === nothing
134
+ method0 = method
132
135
if is_generated (method) && ! enter_generated
133
136
# If we're stepping into a staged function, we need to use
134
137
# the specialization, rather than stepping through the
@@ -138,16 +141,20 @@ function prepare_framecode(method::Method, @nospecialize(argtypes); enter_genera
138
141
generator = false
139
142
else
140
143
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)
142
149
generator = true
143
150
else
144
151
code = get_source (method)
145
152
generator = false
146
153
end
147
154
end
148
155
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
151
158
else
152
159
framedict[method] = framecode
153
160
end
@@ -225,8 +232,10 @@ function prepare_call(@nospecialize(f), allargs; enter_generated = false)
225
232
isa (ret, Compiled) && return ret
226
233
# Typical return
227
234
framecode, lenv = ret
228
- if is_generated (method) && enter_generated
235
+ if framecode . generator
229
236
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... ]
230
239
end
231
240
return framecode, args, lenv, argtypes
232
241
end
@@ -294,8 +303,9 @@ static parameters `lenv`. See [`JuliaInterpreter.prepare_call`](@ref) for inform
294
303
"""
295
304
function prepare_frame (framecode:: FrameCode , args:: Vector{Any} , lenv:: SimpleVector ; enter_generated= false )
296
305
s = scopeof (framecode)
297
- if isa (s, Method) && is_generated (s) && enter_generated
306
+ if framecode . generator
298
307
args = Any[_Typeof (a) for a in args]
308
+ args = Any[Base. unwrap_unionall (s. sig). parameters[1 ], lenv... , args... ] # first is #self#
299
309
end
300
310
framedata = prepare_framedata (framecode, args)
301
311
resize! (framedata. sparams, length (lenv))
0 commit comments