diff --git a/vhdlpp/scope.cc b/vhdlpp/scope.cc index e5d1dcd85..5182aee1a 100644 --- a/vhdlpp/scope.cc +++ b/vhdlpp/scope.cc @@ -203,6 +203,27 @@ void ScopeBase::do_use_from(const ScopeBase*that) } } +void ScopeBase::transfer_from(ScopeBase&ref) +{ + std::copy(ref.new_signals_.begin(), ref.new_signals_.end(), + insert_iterator >( + new_signals_, new_signals_.end()) + ); + ref.new_signals_.clear(); + + std::copy(ref.new_variables_.begin(), ref.new_variables_.end(), + insert_iterator >( + new_variables_, new_variables_.end()) + ); + ref.new_variables_.clear(); + + std::copy(ref.new_components_.begin(), ref.new_components_.end(), + insert_iterator >( + new_components_, new_components_.end()) + ); + ref.new_components_.clear(); +} + void ActiveScope::set_package_header(Package*pkg) { assert(package_header_ == 0); diff --git a/vhdlpp/scope.h b/vhdlpp/scope.h index d0054dae4..2b0fdc5b3 100644 --- a/vhdlpp/scope.h +++ b/vhdlpp/scope.h @@ -57,6 +57,9 @@ class ScopeBase { Signal* find_signal(perm_string by_name) const; Variable* find_variable(perm_string by_name) const; Subprogram* find_subprogram(perm_string by_name) const; + // Moves all signals, variables and components from another scope to + // this one. After the transfer new_* maps are emptied in the another scope. + void transfer_from(ScopeBase&ref); protected: void cleanup(); @@ -202,7 +205,7 @@ class ActiveScope : public ScopeBase { { map::iterator it; if((it = use_subprograms_.find(name)) != use_subprograms_.end() ) use_subprograms_.erase(it); - cur_subprograms_[name] = obj;; + cur_subprograms_[name] = obj; } void bind(Entity*ent)