/*** * Returns a shallow copy */ StateVector* StateVector::clone() { StateVector *clone = new (gc) StateVector(currentReferences->size(), gc); for (int32_t i = 0; i < getNumberOfLocals(); i++) { TessaInstruction* currentReference = getLocal(i); clone->setLocal(i, currentReference); } return clone; }
/*** * You can get the basic block object by asking the Label to give you the basic block * When you create a basic block, it also creates the parameter instructions for the current number of local variables. * If you are tracking more than just local variables, you have to manually create a parameter instruction later. */ TessaVM::BasicBlock* TessaCreationApi::createNewBasicBlock() { TessaVM::BasicBlock* newBasicBlock = currentFunction->createNewBasicBlock(); this->switchToBasicBlock(newBasicBlock); int localCount = currentFunction->getLocalCount(); StateVector* beginStateVector = new (gc) StateVector(localCount, gc); for (int i = 0; i < localCount; i++) { beginStateVector->setLocal(i, new (gc) ParameterInstruction(NULL, newBasicBlock)); } StateVector* endStateVector = beginStateVector->clone(); newBasicBlock->setBeginState(beginStateVector); newBasicBlock->setEndState(endStateVector); return newBasicBlock; }
void TessaCreationApi::setLocalVariable(int localVariableNumber, TessaInstruction* newReference) { StateVector* endState = currentFunction->getCurrentBasicBlock()->getEndState(); endState->setLocal(localVariableNumber, newReference); }
void TessaCreationApi::trackExtraVariableInEntryState(int index, TessaInstruction* reference, int startingNumberOfLocals) { BasicBlock* currentBlock = currentFunction->getCurrentBasicBlock(); StateVector* beginState = currentBlock->getBeginState(); //AvmAssert(index + startingNumberOfLocals <= beginState->getNumberOfLocals()); beginState->setLocal(index + startingNumberOfLocals, reference); }