| 1 | .once | 
| 2 | |
| 3 | .include "control-flow.dl" | 
| 4 | |
| 5 | // At statement s, caller invokes callee. | 
| 6 | .decl call(caller: Function, s: Statement, callee:Function) | 
| 7 | .input call | 
| 8 | |
| 9 | // (f, s) is in this set if there is a call into the garbage collector, either | 
| 10 | // directly or indirectly, at statement s in function f. | 
| 11 | .decl might_collect(f: Function, s: Statement) | 
| 12 | .output might_collect | 
| 13 | |
| 14 | might_collect(f, s) :- call(f, s, "mylib.MaybeCollect"). | 
| 15 | might_collect(f, s) :- call(f, s, g), might_collect(g, _). |