void migrate_block(Block* target, Migration* migration) { ca_assert(target != migration->oldBlock); if (target == migration->newBlock) return; // Store a cache of lookups that we've made in this call. TermMap cache; for (BlockIterator it(target); it; ++it) { Term* term = *it; // Iterate through each "dependency", which includes the function & inputs. for (int i=0; i < term->numDependencies(); i++) { Term* ref = term->dependency(i); Term* newRef = NULL; if (cache.contains(ref)) { newRef = cache[ref]; } else { // Lookup and save result in cache newRef = migrate_term_pointer(ref, migration); cache[ref] = newRef; } // Possibly rebind if (newRef != ref) term->setDependency(i, newRef); } } }
void update_all_code_references(Branch* target, Branch* oldBranch, Branch* newBranch) { ca_assert(target != oldBranch); ca_assert(target != newBranch); // Store a cache of lookups that we've made in this call. TermMap cache; for (BranchIterator it(target); it.unfinished(); it.advance()) { Term* term = *it; // Iterate through each "dependency", which includes the function & inputs. for (int i=0; i < term->numDependencies(); i++) { Term* ref = term->dependency(i); Term* newRef = NULL; if (cache.contains(ref)) { newRef = cache[ref]; } else { // Lookup and save result in cache newRef = translate_term_across_branches(ref, oldBranch, newBranch); cache[ref] = newRef; } // Possibly rebind if (newRef != ref) term->setDependency(i, newRef); } } }
void clear_block(Block* block) { block->names.clear(); block->inProgress = false; // Iterate through the block and tear down any term references, so that we // don't have to worry about stale pointers later. for (BlockIterator it(block); it; ++it) { if (*it == NULL) continue; pre_erase_term(*it); set_inputs(*it, TermList()); remove_from_any_user_lists(*it); change_function(*it, NULL); } for (int i= block->_terms.length() - 1; i >= 0; i--) { Term* term = block->get(i); if (term == NULL) continue; if (term->nestedContents) clear_block(term->nestedContents); } for (int i = block->_terms.length() - 1; i >= 0; i--) { Term* term = block->get(i); if (term == NULL) continue; // Delete any leftover users, mark them as repairable. for (int userIndex = 0; userIndex < term->users.length(); userIndex++) { Term* user = term->users[userIndex]; for (int depIndex = 0; depIndex < user->numDependencies(); depIndex++) { if (user->dependency(depIndex) == term) { // mark_repairable_link(user, term->name, depIndex); user->setDependency(depIndex, NULL); } } } erase_term(term); } block->_terms.clear(); }