@@ -1317,3 +1317,77 @@ bar_22708(x) = f_22708(x)
1317
1317
1318
1318
@test bar_22708 (1 ) == " x"
1319
1319
1320
+ # mechanism for spoofing work-limiting heuristics and early generator expansion (#24852)
1321
+ function _generated_stub (gen:: Symbol , args:: Vector{Any} , params:: Vector{Any} , line, file, expand_early)
1322
+ stub = Expr (:new , Core. GeneratedFunctionStub, gen, args, params, line, file, expand_early)
1323
+ return Expr (:meta , :generated , stub)
1324
+ end
1325
+
1326
+ f24852_kernel (x, y) = x * y
1327
+
1328
+ function f24852_kernel_cinfo (x, y)
1329
+ sig, spvals, method = Base. _methods_by_ftype (Tuple{typeof (f24852_kernel),x,y}, - 1 , typemax (UInt))[1 ]
1330
+ code_info = Base. uncompressed_ast (method)
1331
+ body = Expr (:block , code_info. code... )
1332
+ Base. Core. Inference. substitute! (body, 0 , Any[], sig, Any[spvals... ], 0 , :propagate )
1333
+ return method, code_info
1334
+ end
1335
+
1336
+ function f24852_gen_cinfo_uninflated (X, Y, f, x, y)
1337
+ _, code_info = f24852_kernel_cinfo (x, y)
1338
+ return code_info
1339
+ end
1340
+
1341
+ function f24852_gen_cinfo_inflated (X, Y, f, x, y)
1342
+ method, code_info = f24852_kernel_cinfo (x, y)
1343
+ code_info. signature_for_inference_heuristics = Core. Inference. svec (f, (x, y), typemax (UInt))
1344
+ return code_info
1345
+ end
1346
+
1347
+ function f24852_gen_expr (X, Y, f, x, y)
1348
+ return :(f24852_kernel (x:: $X , y:: $Y ))
1349
+ end
1350
+
1351
+ @eval begin
1352
+ function f24852_late_expr (x:: X , y:: Y ) where {X, Y}
1353
+ $ (_generated_stub (:f24852_gen_expr , Any[:f24852_late_expr , :x , :y ],
1354
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), false ))
1355
+ end
1356
+ function f24852_late_inflated (x:: X , y:: Y ) where {X, Y}
1357
+ $ (_generated_stub (:f24852_gen_cinfo_inflated , Any[:f24852_late_inflated , :x , :y ],
1358
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), false ))
1359
+ end
1360
+ function f24852_late_uninflated (x:: X , y:: Y ) where {X, Y}
1361
+ $ (_generated_stub (:f24852_gen_cinfo_uninflated , Any[:f24852_late_uninflated , :x , :y ],
1362
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), false ))
1363
+ end
1364
+ end
1365
+
1366
+ @eval begin
1367
+ function f24852_early_expr (x:: X , y:: Y ) where {X, Y}
1368
+ $ (_generated_stub (:f24852_gen_expr , Any[:f24852_early_expr , :x , :y ],
1369
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), true ))
1370
+ end
1371
+ function f24852_early_inflated (x:: X , y:: Y ) where {X, Y}
1372
+ $ (_generated_stub (:f24852_gen_cinfo_inflated , Any[:f24852_early_inflated , :x , :y ],
1373
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), true ))
1374
+ end
1375
+ function f24852_early_uninflated (x:: X , y:: Y ) where {X, Y}
1376
+ $ (_generated_stub (:f24852_gen_cinfo_uninflated , Any[:f24852_early_uninflated , :x , :y ],
1377
+ Any[:X , :Y ], @__LINE__ , QuoteNode (Symbol (@__FILE__ )), true ))
1378
+ end
1379
+ end
1380
+
1381
+ x, y = rand (), rand ()
1382
+ result = f24852_kernel (x, y)
1383
+
1384
+ @test result === f24852_late_expr (x, y)
1385
+ @test result === f24852_late_uninflated (x, y)
1386
+ @test result === f24852_late_inflated (x, y)
1387
+
1388
+ @test result === f24852_early_expr (x, y)
1389
+ @test result === f24852_early_uninflated (x, y)
1390
+ @test result === f24852_early_inflated (x, y)
1391
+
1392
+ # TODO : test that `expand_early = true` + inflated `signature_for_inference_heuristics`
1393
+ # can be used to tighten up some inference result.
0 commit comments