summaryrefslogtreecommitdiff
path: root/src/semantic/frame.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/semantic/frame.rs')
-rw-r--r--src/semantic/frame.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/semantic/frame.rs b/src/semantic/frame.rs
new file mode 100644
index 0000000..ddfc330
--- /dev/null
+++ b/src/semantic/frame.rs
@@ -0,0 +1,44 @@
+use super::temp;
+
+pub enum Location {
+ InFrame {
+ offset: usize,
+ },
+ Register(temp::TempName),
+}
+
+pub enum Escape {
+ No,
+ Yes,
+}
+
+pub trait Frame {
+ fn new(name: temp::TempLabel, formals: Vec<Escape>) -> Self;
+ fn name(&self) -> temp::TempLabel;
+ fn formals(&self) -> &[Location];
+ fn alloc_local(&mut self, escapes: Escape) -> Location;
+}
+
+pub struct Amd64Frame {
+ name: temp::TempLabel,
+}
+
+impl Frame for Amd64Frame {
+ fn new(name: temp::TempLabel, formals: Vec<Escape>) -> Self {
+ Amd64Frame {
+ name,
+ }
+ }
+
+ fn name(&self) -> temp::TempLabel {
+ self.name
+ }
+
+ fn formals(&self) -> &[Location] {
+ unimplemented!();
+ }
+
+ fn alloc_local(&mut self, escapes: Escape) -> Location {
+ unimplemented!();
+ }
+}