aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler
diff options
context:
space:
mode:
authorYann Herklotz <ymherklotz@gmail.com>2017-03-28 20:37:19 +0100
committerYann Herklotz <ymherklotz@gmail.com>2017-03-28 20:37:19 +0100
commit07c0a816be9c9f3342272623e69ae0d134ebe46a (patch)
tree736a0c1b9b67be4a47e99e103fa119d45ceba235 /c_compiler
parentb72ddcdd509e19f95a58a0497344b546a3ad3c50 (diff)
downloadCompiler-07c0a816be9c9f3342272623e69ae0d134ebe46a.tar.gz
Compiler-07c0a816be9c9f3342272623e69ae0d134ebe46a.zip
Completely done
Diffstat (limited to 'c_compiler')
-rw-r--r--c_compiler/src/declaration.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/c_compiler/src/declaration.cpp b/c_compiler/src/declaration.cpp
index 0865619..7c7791e 100644
--- a/c_compiler/src/declaration.cpp
+++ b/c_compiler/src/declaration.cpp
@@ -201,6 +201,7 @@ Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const
if(getId() != "")
{
+
int stack_position = bindings.currentStackPosition();
std::shared_ptr<ArrayDeclaration> array_declaration(
std::dynamic_pointer_cast<ArrayDeclaration>(declarator_));
@@ -213,9 +214,20 @@ Bindings ArrayDeclaration::localAsm(Bindings bindings, int &label_count) const
}
std::shared_ptr<Initializer> initializer;
- initializer = std::static_pointer_cast<Initializer>(initializer_);
- initializer->printInitializerAsm(bindings, label_count, array_sizes.size()-1, array_sizes, type_->type());
-
+ if(initializer_ != nullptr)
+ {
+ initializer = std::static_pointer_cast<Initializer>(initializer_);
+ initializer->printInitializerAsm(bindings, label_count, array_sizes.size()-1, array_sizes, type_->type());
+ }
+ else
+ {
+ int sum = 1;
+ std::for_each(array_sizes.begin(), array_sizes.end(), [&] (int n) {
+ sum *= n;
+ });
+ sum *= getType()->getSize();
+ bindings.increaseStackPosition(sum);
+ }
// reverse vector to store in binding
std::reverse(array_sizes.begin(), array_sizes.end());
bindings.insertBinding(getId(), type_, stack_position, array_sizes);