|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: signature GLOBALFIX = ! 3: sig structure CPS : CPS ! 4: val globalfix : (CPS.function * (CPS.lvar->bool))->(CPS.function * bool) list ! 5: end ! 6: ! 7: structure GlobalFix : GLOBALFIX = ! 8: struct ! 9: structure CPS = CPS ! 10: open CPS ! 11: fun globalfix((f,vl,cexp),known) = ! 12: let ! 13: fun gfix ce = ! 14: case ce of ! 15: FIX(fl,c) => ! 16: let val (n,c') = gfix c ! 17: val l' = ! 18: revfold (fn((v,a,c),m) => let val (l,d) = gfix c in (v,a,d)::l@m end) fl n ! 19: in (l',c') ! 20: end ! 21: | APP _ => ([],ce) ! 22: | SWITCH(v,l) => ! 23: let val (f,l') = ! 24: fold (fn(c,(fl,cl)) => let val (f,d) = gfix c in (f@fl,d::cl) end) l ([],[]) ! 25: in (f,SWITCH(v,l')) ! 26: end ! 27: | RECORD(l,v,c) => let val (f,c') = gfix c in (f,RECORD(l,v,c')) end ! 28: | SELECT(i,v,w,c) => let val (f,c') = gfix c in (f,SELECT(i,v,w,c')) end ! 29: | OFFSET(i,v,w,c) => let val (f,c') = gfix c in (f,OFFSET(i,v,w,c')) end ! 30: | PRIMOP(i,args,ret,l) => ! 31: let val (f,m) = ! 32: fold (fn(c,(fl,cl)) => let val (f,c) = gfix c in (f@fl,c::cl) end) l ([],[]) ! 33: in (f,PRIMOP(i,args,ret,m)) ! 34: end ! 35: val (l,body) = gfix cexp (* THROW AWAY bogus body. *) ! 36: in ((f,vl,body),false) :: map (fn x as (lb,_,_) => (x,known lb)) l ! 37: end ! 38: end (* structure GlobalFix *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.