aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/bindings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c_compiler/src/bindings.cpp')
-rw-r--r--c_compiler/src/bindings.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/c_compiler/src/bindings.cpp b/c_compiler/src/bindings.cpp
index 4315407..80375e7 100644
--- a/c_compiler/src/bindings.cpp
+++ b/c_compiler/src/bindings.cpp
@@ -1,10 +1,12 @@
#include "bindings.hpp"
+#include <iostream>
+
// VariableStackBindings definition
VariableStackBindings::VariableStackBindings()
- : stack_counter(4)
+ : stack_counter(4), current_register(2)
{}
void VariableStackBindings::insertBinding(std::string id, TypePtr type, int32_t stack_position)
@@ -21,6 +23,21 @@ void VariableStackBindings::increaseStackPosition()
stack_counter += 4;
}
+void VariableStackBindings::resetRegister()
+{
+ current_register = 2;
+}
+
+void VariableStackBindings::increaseRegister()
+{
+ if(current_register == 15)
+ current_register = 24;
+ else if(current_register == 25)
+ std::cerr << "Error : cannot allocate more registers" << std::endl;
+ else
+ current_register++;
+}
+
int32_t VariableStackBindings::getCurrentStackPosition() const
{
return stack_counter;
@@ -36,6 +53,11 @@ int32_t VariableStackBindings::getStackPosition(const std::string &id) const
else return 0;
}
+int8_t VariableStackBindings::getCurrentRegister() const
+{
+ return current_register;
+}
+
bool VariableStackBindings::bindingExists(const std::string &id) const
{
auto binding = bindings.find(id);