aboutsummaryrefslogtreecommitdiff
path: root/ABC/CStack.icl
diff options
context:
space:
mode:
Diffstat (limited to 'ABC/CStack.icl')
-rw-r--r--ABC/CStack.icl26
1 files changed, 26 insertions, 0 deletions
diff --git a/ABC/CStack.icl b/ABC/CStack.icl
new file mode 100644
index 0000000..74ca885
--- /dev/null
+++ b/ABC/CStack.icl
@@ -0,0 +1,26 @@
+implementation module ABC.CStack
+
+import StdEnv
+
+import ABC.Def
+import ABC.Misc
+
+:: CStack :== [InstrId]
+
+instance toString CStack where toString xs = "[" <++ (",", xs) <+ "]"
+
+cs_init :: CStack
+cs_init = []
+
+cs_get :: CSrc CStack -> InstrId
+cs_get _ [] = abortn "cs_get: index too large"
+cs_get 0 [i:_] = i
+cs_get i [_:s] = cs_get (i-1) s
+
+cs_popn :: CSrc CStack -> CStack
+cs_popn 0 s = s
+cs_popn _ [] = abortn "cs_popn: popping too many elements"
+cs_popn i [_:s] = cs_popn (i-1) s
+
+cs_push :: InstrId CStack -> CStack
+cs_push i s = [i:s]