|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: (* access.sml *)
3:
4: (* use "symbol.sig"; use "access.sig"; use "intmap.sig";
5:
6: functor AccessF(structure Intmap: INTMAP
7: structure Symbol: SYMBOL) : ACCESS =
8: *)
9: structure Access : ACCESS =
10: struct
11:
12: structure Symbol = Symbol
13: structure P =
14: struct
15: datatype primop =
16: ! | * | + | - | := | < | <= | > | >= | alength | boxed | div | cast |
17: eql | fadd |fdiv |feql |fge |fgt |fle |flt |fmul |fneg |fneq |fsub |
18: gethdlr | ieql | ineq | neq | makeref | ordof | profile |
19: sethdlr | slength | callcc | throw | delay | force |
20: store | subscript | unboxedassign | unboxedupdate | update | ~ |
21: rshift | lshift | orb | andb | xorb | notb
22:
23: fun pr_primop(!) = "!"
24: | pr_primop(op *) = "*"
25: | pr_primop(op +) = "+"
26: | pr_primop(op -) = "-"
27: | pr_primop(op :=) = ":="
28: | pr_primop(op <) = "<"
29: | pr_primop(op <=) = "<="
30: | pr_primop(op >) = ">"
31: | pr_primop(op >=) = ">="
32: | pr_primop (alength) = "alength"
33: | pr_primop(boxed) = "boxed"
34: | pr_primop (op div) = "div"
35: | pr_primop cast = "cast"
36: | pr_primop eql = "eql"
37: | pr_primop fadd = "fadd"
38: | pr_primop fdiv = "fdiv"
39: | pr_primop feql = "feql"
40: | pr_primop fge = "fge"
41: | pr_primop fgt = "fgt"
42: | pr_primop fle = "fle"
43: | pr_primop flt = "flt"
44: | pr_primop fmul = "fmul"
45: | pr_primop fneg = "fneg"
46: | pr_primop fneq = "fneq"
47: | pr_primop fsub = "fsub"
48: | pr_primop gethdlr = "gethdlr"
49: | pr_primop ieql = "ieql"
50: | pr_primop ineq = "ineq"
51: | pr_primop neq = "neq"
52: | pr_primop makeref = "makeref"
53: | pr_primop ordof = "ordof"
54: | pr_primop profile = "profile"
55: | pr_primop sethdlr = "sethdlr"
56: | pr_primop slength = "slength"
57: | pr_primop callcc = "callcc"
58: | pr_primop throw = "throw"
59: | pr_primop store = "store"
60: | pr_primop subscript = "subscript"
61: | pr_primop unboxedassign = "unboxedassign"
62: | pr_primop unboxedupdate = "unboxedupdate"
63: | pr_primop (op update) = "update"
64: | pr_primop(~) = "~"
65: | pr_primop(rshift) = "rshift"
66: | pr_primop(lshift) = "lshift"
67: | pr_primop(orb) = "orb"
68: | pr_primop(andb) = "andb"
69: | pr_primop(xorb) = "xorb"
70: | pr_primop(notb) = "notb"
71: end
72:
73: type lvar = int (* lambda variable id number *)
74: type slot = int (* position in structure record *)
75: type path = int list (* slot chain terminated by lambda variable id number *)
76: type primop = P.primop
77:
78: datatype access
79: = LVAR of lvar
80: | SLOT of slot
81: | PATH of path
82: | INLINE of primop
83:
84: (* local *)
85: val varcount = ref 0
86: exception NoLvarName
87: val lvarNames : string Intmap.intmap = Intmap.new(32, NoLvarName)
88: val name = Intmap.map lvarNames
89: val giveLvarName = Intmap.add lvarNames
90:
91: val saveLvarNames = System.Control.saveLvarNames
92: fun mkLvar () : lvar = (inc varcount; !varcount)
93: fun sameName(v,w) =
94: if !saveLvarNames
95: then giveLvarName(v,name w)
96: handle NoLvarName => (giveLvarName(w, name v)
97: handle NoLvarName => ())
98: else ()
99: fun dupLvar v =
100: (inc varcount;
101: if !saveLvarNames
102: then giveLvarName(!varcount,name v) handle NoLvarName => ()
103: else ();
104: !varcount)
105: fun namedLvar(id: Symbol.symbol) =
106: (inc varcount;
107: if !saveLvarNames then giveLvarName(!varcount,Symbol.name id) else ();
108: !varcount)
109: fun lvarName(lv : lvar) : string =
110: (name lv ^ makestring lv) handle NoLvarName => makestring lv
111:
112: fun pr_lvar(lvar:lvar) = makestring(lvar)
113: fun pr_slot(slot:slot) = makestring(slot)
114: fun pr_path'[] = "]"
115: | pr_path'[x:int] = makestring x ^ "]"
116: | pr_path'((x:int)::rest)= makestring x ^ "," ^ pr_path' rest
117: fun pr_path path = "[" ^ pr_path' path
118: fun pr_access (LVAR lvar) = "LVAR(" ^ pr_lvar lvar ^ ")"
119: | pr_access (SLOT slot) = "SLOT(" ^ pr_slot slot ^ ")"
120: | pr_access (PATH path) = "PATH(" ^ pr_path path ^ ")"
121: | pr_access (INLINE po) = "INLINE(" ^ P.pr_primop po ^ ")"
122:
123: end (* structure Access *)
124:
125: (*
126: structure Access= AccessF(structure Intmap= Intmap
127: structure Symbol= Symbol);
128:
129: *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.