|
|
1.1 root 1: (* Copyright 1989 by AT&T Bell Laboratories *)
2: structure Prim : sig structure Access : ACCESS
3: structure Basics : BASICS
4: val primTypes : Basics.Structure
5: val inLine : Basics.Structure
6: val inLineName : Access.primop -> string
7: val pure : Access.primop -> bool
8: val special : Access.access -> bool
9: end =
10: struct
11:
12: structure Access = Access
13: structure Basics = Basics
14:
15: open Access Basics BasicTypes Env NameSpace
16:
17: val symbol = Symbol.symbol
18:
19: (* primTypes structure *)
20:
21: val typesTable = newTable()
22:
23: fun entercon(s: string, c: datacon) =
24: IntStrMap.add typesTable
25: (varIndex(symbol s),s,CONbind c)
26:
27: fun entertyc(s : string, t : tycon ref) =
28: IntStrMap.add typesTable
29: (tycIndex(symbol s),s,TYCbind t) (* *)
30:
31: val primTypes = (
32: entertyc("bool", boolTycon);
33: entercon("true", trueDcon);
34: entercon("false", falseDcon);
35:
36: entertyc("list", listTycon);
37: entercon("::", consDcon);
38: IntStrMap.add typesTable
39: (fixIndex(symbol "::"),
40: "::",FIXbind(FIXvar{name=symbol "::",binding=infixright 5}));
41: entercon("nil", nilDcon);
42:
43: entertyc("ref", refTycon);
44: entercon("ref", refDcon);
45:
46: entertyc("unit", unitTycon);
47: entertyc("int", intTycon);
48: entertyc("real", realTycon);
49: entertyc("cont", contTycon);
50: entertyc("array", arrayTycon);
51: entertyc("string", stringTycon);
52:
53: entertyc("exn",exnTycon);
54:
55: mkSTR([symbol "PrimTypes"], typesTable, DIR, Stampset.globalStamps))
56:
57:
58: (* inLine structure *)
59:
60: val inLineTable = newTable()
61:
62: val bottom = POLYty{sign=[{weakness=infinity,eq=false}],
63: tyfun=TYFUN{arity=1,body=VARty(mkTyvar(IBOUND 0))}}
64:
65: val primopNames = [
66: ("callcc",P.callcc),
67: ("throw",P.throw),
68: ("delay",P.delay),
69: ("force",P.force),
70: ("!",P.!),
71: ("*",P.*),
72: ("+",P.+),
73: ("-",P.-),
74: (":=",P.:=),
75: ("<",P.<),
76: ("<=",P.<=),
77: (">",P.>),
78: (">=",P.>=),
79: ("alength",P.alength),
80: ("boxed",P.boxed),
81: ("div",P.div),
82: ("orb",P.orb),
83: ("andb",P.andb),
84: ("xorb",P.xorb),
85: ("lshift",P.lshift),
86: ("rshift",P.rshift),
87: ("notb",P.notb),
88: ("cast",P.cast),
89: ("=",P.eql),
90: ("fadd",P.fadd),
91: ("fdiv",P.fdiv),
92: ("feql",P.feql),
93: ("fge",P.fge),
94: ("fgt",P.fgt),
95: ("fle",P.fle),
96: ("flt",P.flt),
97: ("fmul",P.fmul),
98: ("fneg",P.fneg),
99: ("fneq",P.fneq),
100: ("fsub",P.fsub),
101: ("gethdlr",P.gethdlr),
102: ("ieql",P.ieql),
103: ("ineq",P.ineq),
104: ("<>",P.neq),
105: ("makeref",P.makeref),
106: ("ordof",P.ordof),
107: ("profile",P.profile),
108: ("sethdlr",P.sethdlr),
109: ("slength",P.slength),
110: ("store",P.store),
111: ("subscript",P.subscript),
112: ("unboxedassign",P.unboxedassign),
113: ("unboxedupdate",P.unboxedupdate),
114: ("update",P.update),
115: ("~",P.~) ]
116:
117: fun enter( s : string, p : primop ) =
118: let val name = symbol s
119: in IntStrMap.add inLineTable
120: (varIndex name,
121: s,VARbind(VALvar{access=INLINE p,
122: name=[name],typ=ref bottom}))
123: end
124:
125: val inLine =
126: (app enter primopNames;
127: mkSTR([symbol "InLine"], inLineTable, DIR, Stampset.globalStamps))
128:
129: fun inLineName p =
130: let fun find [] = ErrorMsg.impossible "Bad primop name"
131: | find ((s,p1)::rest) = if p1=p then s else find rest
132: in find primopNames
133: end
134:
135: val pure =
136: fn P.:= => false
137: | P.! => false (****)
138: | P.subscript => false (****)
139: | P.store => false
140: | P.unboxedassign => false
141: | P.unboxedupdate => false
142: | P.update => false
143: | P.callcc => false
144: | P.~ => false (* these must be here because they may raise *)
145: | P.+ => false
146: | P.- => false
147: | P.* => false
148: | P.div => false
149: | P.fneg => false
150: | P.fadd => false
151: | P.fsub => false
152: | P.fmul => false
153: | P.fdiv => false
154: | P.lshift => false
155: | P.force => false
156: | _ => true
157:
158: fun special(INLINE P.eql) = true
159: | special(INLINE P.neq) = true
160: | special(INLINE P.:=) = true
161: | special(INLINE P.update) = true
162: | special _ = false
163:
164: end (* structure Prim *)
165:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.