199 |
end |
end |
200 |
|
|
201 |
fun registerGroup g = let |
fun registerGroup g = let |
|
val GG.GROUP { grouppath, kind, sublibs, ... } = g |
|
202 |
val visited = ref SrcPathSet.empty |
val visited = ref SrcPathSet.empty |
203 |
|
fun registerGroup' g = let |
204 |
|
val GG.GROUP { grouppath, kind, sublibs, ... } = g |
205 |
fun registerStableLib (GG.GROUP { exports, ... }) = let |
fun registerStableLib (GG.GROUP { exports, ... }) = let |
206 |
val localmap = ref StableMap.empty |
val localmap = ref StableMap.empty |
207 |
fun bn (DG.PNODE p) = |
fun bn (DG.PNODE p) = |
208 |
(fn gp => fn _ => prim2dyn p gp, NONE) |
(fn gp => fn _ => prim2dyn p gp, NONE) |
209 |
| bn (DG.BNODE n) = let |
| bn (DG.BNODE n) = let |
210 |
val { bininfo = i, localimports, globalimports } = n |
val { bininfo = i, localimports, globalimports } = |
211 |
|
n |
212 |
fun new () = let |
fun new () = let |
213 |
val e0 = (getPerv, []) |
val e0 = (getPerv, []) |
214 |
fun join ((f, NONE), (e, l)) = |
fun join ((f, NONE), (e, l)) = |
245 |
| NONE => let |
| NONE => let |
246 |
val x = new () |
val x = new () |
247 |
in |
in |
248 |
localmap := |
localmap := StableMap.insert |
249 |
StableMap.insert (!localmap, i, x); |
(!localmap, i, x); |
250 |
x |
x |
251 |
end) |
end) |
252 |
end |
end |
256 |
fun sbn (DG.SB_SNODE n) = |
fun sbn (DG.SB_SNODE n) = |
257 |
EM.impossible "Link:SNODE in stable lib" |
EM.impossible "Link:SNODE in stable lib" |
258 |
| sbn (DG.SB_BNODE (DG.PNODE _, _)) = () |
| sbn (DG.SB_BNODE (DG.PNODE _, _)) = () |
259 |
| sbn (DG.SB_BNODE (n as DG.BNODE { bininfo, ... }, _)) = let |
| sbn (DG.SB_BNODE (n as DG.BNODE { bininfo, ... }, _)) = |
260 |
|
let |
261 |
val b as B (_, i, _) = |
val b as B (_, i, _) = |
262 |
case bn n of |
case bn n of |
263 |
(f, NONE) => B (f, bininfo, []) |
(f, NONE) => B (f, bininfo, []) |
274 |
in |
in |
275 |
if SrcPathSet.member (!visited, grouppath) then () |
if SrcPathSet.member (!visited, grouppath) then () |
276 |
else (visited := SrcPathSet.add (!visited, grouppath); |
else (visited := SrcPathSet.add (!visited, grouppath); |
277 |
app (registerGroup o #2) sublibs; |
app (registerGroup' o #2) sublibs; |
278 |
case kind of |
case kind of |
279 |
GG.STABLELIB => registerStableLib g |
GG.STABLELIB => registerStableLib g |
280 |
| _ => ()) |
| _ => ()) |
281 |
end |
end |
282 |
|
in |
283 |
|
registerGroup' g |
284 |
|
end |
285 |
|
|
286 |
fun newTraversal (group as GG.GROUP { exports, ... }, getBFC) = let |
fun newTraversal (group as GG.GROUP { exports, ... }, getBFC) = let |
287 |
|
|
288 |
val _ = registerGroup group |
val _ = registerGroup group |
289 |
|
|
290 |
val l_stablemap = ref StableMap.empty |
val l_stablemap = ref StableMap.empty |