@@ -21,7 +21,7 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
2121 type Sto = LocalStore [Adr , Val ]
2222 type Dlt = Delta [Adr , Val ]
2323 type Cnt = AbstractCount
24- type Res = Map [Cmp , (Val , Dlt , Set [Adr ])]
24+ type Res = Map [Cmp , (Val , Dlt , Set [Adr ], Set [ Adr ] )]
2525 type Sts = Map [Cmp , Sto ]
2626 type Anl = SchemeModFLocalFSIntraAnalysis
2727
@@ -91,9 +91,11 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
9191 def withRestrictedStore (rs : Set [Adr ])(blk : A [Val ]): A [Val ] =
9292 (anl, env, sto, ctx) =>
9393 val gcs = LocalStoreGC ().collect(sto, rs)
94- blk(anl, env, sto, ctx).map { (vlu, dlt, upd) =>
95- val gcd = DeltaGC (gcs).collect(dlt, lattice.refs(vlu) ++ upd)
96- (vlu, gcd, upd)
94+ blk(anl, env, sto, ctx).map { (vlu, dlt, upd, all) =>
95+ val gcu = upd.filter(gcs.contains)
96+ val gca = all.filter(dlt.delta.contains)
97+ val gcd = DeltaGC (gcs).collect(dlt, lattice.refs(vlu) ++ gcu)
98+ (vlu, gcd, gcu, gca)
9799 }
98100
99101 override protected def applyClosure (app : App , lam : Lam , ags : List [Val ], fvs : Iterable [(Adr , Val )]): A [Val ] =
@@ -109,20 +111,20 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
109111 // ANALYSISM MONAD
110112 //
111113
112- type A [X ] = (Anl , Env , Sto , Ctx ) => Option [(X , Dlt , Set [Adr ])]
114+ type A [X ] = (Anl , Env , Sto , Ctx ) => Option [(X , Dlt , Set [Adr ], Set [ Adr ] )]
113115
114116 given analysisM : AnalysisM [A ] with
115117 // MONAD
116118 def unit [X ](x : X ) =
117- (_, _, _, _) => Some ((x, Delta .emptyDelta, Set .empty))
119+ (_, _, _, _) => Some ((x, Delta .emptyDelta, Set .empty, Set .empty ))
118120 def map [X , Y ](m : A [X ])(f : X => Y ) =
119- (anl, env, sto, ctx) => m(anl, env, sto, ctx).map((x, d, u) => (f(x), d, u))
121+ (anl, env, sto, ctx) => m(anl, env, sto, ctx).map((x, d, u, a ) => (f(x), d, u, a ))
120122 def flatMap [X , Y ](m : A [X ])(f : X => A [Y ]) =
121123 (anl, env, sto, ctx) =>
122124 for
123- (x0, d0, u0) <- m(anl, env, sto, ctx)
124- (x1, d1, u1) <- f(x0)(anl, env, sto.integrate(d0), ctx)
125- yield (x1, Delta .compose(d1, d0), u0 ++ u1.filter(sto.contains) )
125+ (x0, d0, u0, a0 ) <- m(anl, env, sto, ctx)
126+ (x1, d1, u1, a1 ) <- f(x0)(anl, env, sto.integrate(d0), ctx)
127+ yield (x1, Delta .compose(d1, d0), u0 ++ u1, a0 ++ a1 )
126128 // MONADJOIN
127129 def mbottom [X ] =
128130 (_, _, _, _) => None
@@ -131,27 +133,27 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
131133 (x(anl, env, sto, ctx), y(anl, env, sto, ctx)) match
132134 case (None , yres) => yres
133135 case (xres, None ) => xres
134- case (Some ((xv, xs, xu)), Some (yv, ys, yu)) => Some ((Lattice [X ].join(xv, yv), sto.join(xs, ys), xu ++ yu))
136+ case (Some ((xv, xs, xu, xa )), Some (yv, ys, yu, ya )) => Some ((Lattice [X ].join(xv, yv), sto.join(xs, ys), xu ++ yu, xa ++ ya ))
135137 // MONADERROR
136138 def fail [X ](err : Error ) =
137139 mbottom // we are not interested in errors here (at least, not yet ...)
138140 // STOREM
139141 def addrEq =
140- (_, _, sto, _) => Some ((eqA(sto), Delta .emptyDelta, Set .empty))
142+ (_, _, sto, _) => Some ((eqA(sto), Delta .emptyDelta, Set .empty, Set .empty ))
141143 def extendSto (adr : Adr , vlu : Val ) =
142- (_, _, sto, _) => Some ((), extendV(sto, adr, vlu), Set .empty)
144+ (_, _, sto, _) => Some ((), extendV(sto, adr, vlu), Set .empty, Set (adr) )
143145 def updateSto (adr : Adr , vlu : Val ) =
144- (_, _, sto, _) => Some ((), updateV(sto, adr, vlu), Set (adr))
146+ (_, _, sto, _) => Some ((), updateV(sto, adr, vlu), Set (adr), Set .empty )
145147 def lookupSto (adr : Adr ) =
146- (_, _, sto, _) => sto.getValue(adr).map((_, Delta .emptyDelta, Set .empty))
148+ (_, _, sto, _) => sto.getValue(adr).map((_, Delta .emptyDelta, Set .empty, Set .empty ))
147149 // CTX STUFF
148150 def getCtx =
149- (_, _, _, ctx) => Some ((ctx, Delta .emptyDelta, Set .empty))
151+ (_, _, _, ctx) => Some ((ctx, Delta .emptyDelta, Set .empty, Set .empty ))
150152 def withCtx [X ](f : Ctx => Ctx )(blk : A [X ]) =
151153 (anl, env, sto, ctx) => blk(anl, env, sto, f(ctx))
152154 // ENV STUFF
153155 def getEnv =
154- (_, env, _, _) => Some ((env, Delta .emptyDelta, Set .empty))
156+ (_, env, _, _) => Some ((env, Delta .emptyDelta, Set .empty, Set .empty ))
155157 def withEnv [X ](f : Env => Env )(blk : A [X ]) =
156158 (anl, env, sto, ctx) => blk(anl, f(env), sto, ctx)
157159 // CALL STUFF
@@ -176,16 +178,16 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
176178 // register dependencies on all addresses
177179 sto.content.keys.foreach(adr => register(AddrDependencyFS (cmp, adr)))
178180 // GC the result
179- val rgc = eval(cmp.exp)(this , cmp.env, sto, cmp.ctx).map { (v, d, u) =>
180- (v, DeltaGC (sto).collect(d, lattice.refs(v) ++ u), u)
181+ val rgc = eval(cmp.exp)(this , cmp.env, sto, cmp.ctx).map { (v, d, u, a ) =>
182+ (v, DeltaGC (sto).collect(d, lattice.refs(v) ++ u), u, a )
181183 }
182184 // update the result of this component
183185 val old = results.get(cmp)
184186 if (rgc != old) then
185187 results += cmp -> rgc.get
186188 trigger(ResultDependency (cmp))
187189
188- def call (cll : Cll , sto : Sto ): Option [(Val , Dlt , Set [Adr ])] =
190+ def call (cll : Cll , sto : Sto ): Option [(Val , Dlt , Set [Adr ], Set [ Adr ] )] =
189191 // spawn the component
190192 spawn(cll)
191193 // add bindings to its store
@@ -204,7 +206,7 @@ abstract class SchemeModFLocalFS(prg: SchemeExp) extends ModAnalysis[SchemeExp](
204206
205207 override def doWrite (dep : Dependency ): Boolean = dep match
206208 case ResultDependency (cmp) =>
207- val old = inter.results.getOrElse(cmp, (lattice.bottom, Delta .emptyDelta, Set .empty))
209+ val old = inter.results.getOrElse(cmp, (lattice.bottom, Delta .emptyDelta, Set .empty, Set .empty ))
208210 val cur = intra.results(cmp) // we are certain to have a result here!
209211 if old != cur then
210212 inter.results += cmp -> cur
0 commit comments