81 |
NONE => BF.exec (bfc, de) |
NONE => BF.exec (bfc, de) |
82 |
| SOME de' => de' |
| SOME de' => de' |
83 |
|
|
|
fun memoize thunk = let |
|
|
val r = ref (fn _ => raise Fail "Link:memoize") |
|
|
fun firsttime gp = let |
|
|
val v = thunk gp |
|
|
in |
|
|
r := (fn _ => v); |
|
|
v |
|
|
end |
|
|
in |
|
|
r := firsttime; |
|
|
fn gp => !r gp |
|
|
end |
|
|
|
|
84 |
type smemo = E.dynenv * SmlInfo.info list |
type smemo = E.dynenv * SmlInfo.info list |
85 |
|
|
86 |
val smlmap = ref (SmlInfoMap.empty: smemo SmlInfoMap.map) |
val smlmap = ref (SmlInfoMap.empty: smemo SmlInfoMap.map) |
208 |
case (BinInfo.sh_mode i, le) of |
case (BinInfo.sh_mode i, le) of |
209 |
(Sharing.SHARE _, (e, [])) => let |
(Sharing.SHARE _, (e, [])) => let |
210 |
fun thunk gp = link_stable (i, e gp) |
fun thunk gp = link_stable (i, e gp) |
211 |
val m_thunk = memoize thunk |
val m_thunk = Memoize.memoize thunk |
212 |
in |
in |
213 |
(fn gp => fn _ => m_thunk gp, NONE) |
(fn gp => fn _ => m_thunk gp, NONE) |
214 |
end |
end |
287 |
in |
in |
288 |
f gp (foldl add emptyDyn fl) |
f gp (foldl add emptyDyn fl) |
289 |
end |
end |
290 |
val m_th = memoize th |
val m_th = Memoize.memoize th |
291 |
in |
in |
292 |
l_stablemap := |
l_stablemap := |
293 |
StableMap.insert (!l_stablemap, i, m_th); |
StableMap.insert (!l_stablemap, i, m_th); |
320 |
(map fsbn globalimports) |
(map fsbn globalimports) |
321 |
val (getE, snl) = foldl add gi (map sn localimports) |
val (getE, snl) = foldl add gi (map sn localimports) |
322 |
fun thunk gp = link_sml (gp, i, getBFC, getE, snl) |
fun thunk gp = link_sml (gp, i, getBFC, getE, snl) |
323 |
val m_thunk = memoize thunk |
val m_thunk = Memoize.memoize thunk |
324 |
in |
in |
325 |
l_smlmap := SmlInfoMap.insert (!l_smlmap, i, m_thunk); |
l_smlmap := SmlInfoMap.insert (!l_smlmap, i, m_thunk); |
326 |
(m_thunk, [i]) |
(m_thunk, [i]) |