void Transaction::append(DelayCallInfo DCI) { if (!DCI.m_DGR.isNull() && getState() == kCommitting) { // We are committing and getting enw decls in. // Move them into a sub transaction that will be processed // recursively at the end of of commitTransaction. Transaction* subTransactionWhileCommitting = 0; if (hasNestedTransactions() && m_NestedTransactions->back()->getState() == kCollecting) subTransactionWhileCommitting = m_NestedTransactions->back(); else { // FIXME: is this correct (Axel says "yes") CompilationOptions Opts(getCompilationOpts()); Opts.DeclarationExtraction = 0; Opts.ValuePrinting = CompilationOptions::VPDisabled; Opts.ResultEvaluation = 0; Opts.DynamicScoping = 0; subTransactionWhileCommitting = new Transaction(Opts, getModule()); addNestedTransaction(subTransactionWhileCommitting); } subTransactionWhileCommitting->append(DCI); return; } assert(DCI.m_DGR.isNull() || (getState() == kCollecting || getState() == kCompleted) || "Cannot append declarations in current state."); bool checkForWrapper = !m_WrapperFD; assert(checkForWrapper = true && "Check for wrappers with asserts"); // register the wrapper if any. if (checkForWrapper && !DCI.m_DGR.isNull() && DCI.m_DGR.isSingleDecl()) { if (FunctionDecl* FD = dyn_cast<FunctionDecl>(DCI.m_DGR.getSingleDecl())) if (utils::Analyze::IsWrapper(FD)) { assert(!m_WrapperFD && "Two wrappers in one transaction?"); m_WrapperFD = FD; } } // Lazy create the container on first append. if (!m_DeclQueue) m_DeclQueue.reset(new DeclQueue()); m_DeclQueue->push_back(DCI); }