std::string NoOperation::StateNormalizer::toString(const BaseSemantics::DispatcherPtr &cpu, const BaseSemantics::StatePtr &state_) { BaseSemantics::StatePtr state = state_; BaseSemantics::RiscOperatorsPtr ops = cpu->get_operators(); if (!state) return ""; bool isCloned = false; // do we have our own copy of the state? // If possible and appropriate, remove the instruction pointer register const RegisterDescriptor regIp = cpu->instructionPointerRegister(); BaseSemantics::RegisterStateGenericPtr rstate = BaseSemantics::RegisterStateGeneric::promote(state->registerState()); if (rstate && rstate->is_partly_stored(regIp)) { BaseSemantics::SValuePtr ip = ops->readRegister(cpu->instructionPointerRegister()); if (ip->is_number()) { state = state->clone(); isCloned = true; rstate = BaseSemantics::RegisterStateGeneric::promote(state->registerState()); rstate->erase_register(regIp, ops.get()); } } // Get the memory state, cloning the state if not done so above. BaseSemantics::MemoryCellStatePtr mem = boost::dynamic_pointer_cast<BaseSemantics::MemoryCellState>(state->memoryState()); if (mem && !isCloned) { state = state->clone(); isCloned = true; mem = BaseSemantics::MemoryCellState::promote(state->memoryState()); } // Erase memory that has never been written (i.e., cells that sprang into existence by reading an address) of which appears // to have been recently popped from the stack. CellErasurePredicate predicate(ops, ops->readRegister(cpu->stackPointerRegister()), ignorePoppedMemory_); if (mem) mem->eraseMatchingCells(predicate); BaseSemantics::Formatter fmt; fmt.set_show_latest_writers(false); fmt.set_show_properties(false); std::ostringstream ss; ss <<(*state+fmt); return ss.str(); }
void reset(const MemoryMap::Ptr &map) { BOOST_FOREACH (MemoryMap::Segment &segment, map->segments()) segment.buffer()->copyOnWrite(true); // prevent the VM from changing the real map BaseSemantics::StatePtr state = ops_->currentState()->clone(); state->clear(); ConcreteSemantics::MemoryStatePtr memState = ConcreteSemantics::MemoryState::promote(state->memoryState()); memState->memoryMap(map); ops_->currentState(state); BaseSemantics::SValuePtr sp = ops_->number_(wordSize_, stackVa_); ops_->writeRegister(regSp_, sp); ops_->writeMemory(regSs_, sp, ops_->number_(wordSize_, returnMarker_), ops_->boolean_(true)); }