@@ -294,14 +294,23 @@ function set_structtype_const(mod::Module, name::Symbol)
294
294
end
295
295
296
296
function evaluate_structtype (@nospecialize (recurse), frame, node)
297
+ grsvec! (ex:: Expr ) = (ex. args[1 ] = GlobalRef (Core, :svec ); return ex)
298
+
297
299
name, mod = structname (frame, node)
298
- params = lookup_or_eval (recurse, frame, node. args[2 ]):: SimpleVector
299
- fieldnames = lookup_or_eval (recurse, frame, node. args[3 ]):: SimpleVector
300
300
supertype = lookup_or_eval (recurse, frame, node. args[4 ]):: Type
301
- fieldtypes = lookup_or_eval (recurse, frame, node. args[5 ]):: SimpleVector
302
301
ismutable = node. args[6 ]
303
302
ninit = node. args[7 ]
304
- Core. eval (mod, Expr (:struct_type , name, params, fieldnames, supertype, fieldtypes, ismutable, ninit))
303
+ newstructexpr = Expr (:struct_type , name, nothing , nothing , supertype, nothing , ismutable, ninit)
304
+ for idx in (2 , 3 , 5 )
305
+ ex = newstructexpr. args[idx] = grsvec! (copy (node. args[idx]))
306
+ for i = 2 : length (ex. args)
307
+ a = ex. args[i]
308
+ if isa (a, SSAValue) || isa (a, SlotNumber)
309
+ ex. args[i] = lookup_var (frame, a)
310
+ end
311
+ end
312
+ end
313
+ Core. eval (mod, newstructexpr)
305
314
VERSION < v " 1.2.0-DEV.239" && set_structtype_const (mod, name)
306
315
end
307
316
0 commit comments