void FunctionEntry::memAlloc(MemoryMgr &mm){ memory_mgr_ = MemoryMgr(); const SymTab* st = this->symTab(); bool p_var = true; if(st!=NULL){ for(SymTab::const_iterator i = st->begin(); i != st->end(); ++i){ if((*i)->kind()==SymTabEntry::Kind::VARIABLE_KIND){ VariableEntry* ve = (VariableEntry*) (*i); if(ve->varKind()==VariableEntry::VarKind::PARAM_VAR && p_var){ //Parameters ve->offSet(memory_mgr_.getNextAddress()); } else { if(p_var){ //Set control_link_ and return_address_ returnLabel(memory_mgr_.getNextAddress()); returnOffset(memory_mgr_.getNextAddress()); controlLink(memory_mgr_.getNextAddress()); p_var = false; } //Local variables declared in function ve->memAlloc(memory_mgr_); } } } if(p_var){ returnLabel(memory_mgr_.getNextAddress()); returnOffset(memory_mgr_.getNextAddress()); controlLink(memory_mgr_.getNextAddress()); } } if(body()!=NULL){ body()->memAlloc(memory_mgr_); //Used for returning in case function reaches the end of its body without a return statement mem_reg_ = memory_mgr_.getNextRegister(true); memory_mgr_.addRegister(mem_reg_); label_reg_ = memory_mgr_.getNextRegister(true); memory_mgr_.addRegister(label_reg_); memory_mgr_.freeRegister(mem_reg_); memory_mgr_.freeRegister(label_reg_); } }