diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-28 20:37:19 +0100 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2017-03-28 20:37:19 +0100 |
commit | 07c0a816be9c9f3342272623e69ae0d134ebe46a (patch) | |
tree | 736a0c1b9b67be4a47e99e103fa119d45ceba235 /c_compiler | |
parent | b72ddcdd509e19f95a58a0497344b546a3ad3c50 (diff) | |
download | Compiler-07c0a816be9c9f3342272623e69ae0d134ebe46a.tar.gz Compiler-07c0a816be9c9f3342272623e69ae0d134ebe46a.zip |
Completely done
Diffstat (limited to 'c_compiler')
-rw-r--r-- | c_compiler/src/declaration.cpp | 18 |
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); |