blob: b9b3f3b9065117aa64e59195e45ac526ba0c56cf [file] [log] [blame]
#include "scope_util.h"
#include "vtr_util.h"
#include "vtr_memory.h"
sc_scope *current_scope = NULL;
std::vector<sc_scope *> scope_stack;
sc_scope *new_sc_scope()
{
sc_scope *new_scope = (sc_scope *)vtr::calloc(1, sizeof(sc_scope));
if(new_scope)
{
new_scope->defparam_sc = sc_new_string_cache();
new_scope->param_sc = sc_new_string_cache();
}
return new_scope;
}
void move_sc_scope_items(sc_scope **source_ref, sc_scope *destination)
{
sc_scope *source = (*source_ref);
if(source)
{
sc_merge_string_cache(&(source->defparam_sc) ,destination->defparam_sc);
sc_merge_string_cache(&(source->param_sc) ,destination->param_sc);
vtr::free(source);
source = NULL;
}
(*source_ref) = source;
}
void free_sc_scope(sc_scope **to_free_ref, STRING_CACHE **param, STRING_CACHE **defparam)
{
sc_scope *to_free = (*to_free_ref);
if(to_free)
{
*defparam = to_free->defparam_sc;
*param = to_free->param_sc;
to_free->defparam_sc = NULL;
to_free->param_sc = NULL;
vtr::free(to_free);
to_free = NULL;
}
(*to_free_ref) = to_free;
}
sc_scope *pop_scope()
{
sc_scope *to_return = NULL;
if(!scope_stack.empty())
{
to_return = scope_stack.back();
scope_stack.pop_back();
}
/* current param table is the top */
if(!scope_stack.empty())
{
current_scope = scope_stack.back();
}
else
{
current_scope = NULL;
}
return to_return;
}
void merge_top_scopes()
{
if(scope_stack.size() > 1)
{
sc_scope *insertion = pop_scope();
move_sc_scope_items(&insertion, scope_stack.back());
}
}
void push_scope()
{
scope_stack.push_back(new_sc_scope());
/* update current scope */
current_scope = scope_stack.back();
}