virtual void TearDown() override { ::testing::Test::TearDown(); anjing::app::App::StopApplication(app); Adelete(app); }
void MemoryLogger::Write(const char16* msg) { #ifdef EXCEPTION_CHECK // In most cases this will be called at runtime when we have exception check enabled. AutoNestedHandledExceptionType autoNestedHandledExceptionType(ExceptionType_DisableCheck); #endif AutoCriticalSection autocs(&m_criticalSection); // TODO: with circular buffer now we can use much granular lock. // Create a copy of the message. size_t len = wcslen(msg); char16* buf = AnewArray(m_alloc, char16, len + 1); js_wmemcpy_s(buf, len + 1, msg, len + 1); // Copy with the NULL-terminator. // m_current is the next position to write to. if (m_log[m_current]) { Adelete(m_alloc, m_log[m_current]); } m_log[m_current] = buf; m_current = (m_current + 1) % m_capacity; }
MemoryLogger::~MemoryLogger() { Adelete(m_alloc, m_log); }
void Scope::MergeParamAndBodyScopes(ParseNode *pnodeScope, ByteCodeGenerator *byteCodeGenerator) { Assert(pnodeScope->sxFnc.funcInfo); Scope *paramScope = pnodeScope->sxFnc.pnodeScopes->sxBlock.scope; Scope *bodyScope = pnodeScope->sxFnc.pnodeBodyScope->sxBlock.scope; Assert(paramScope->m_symList == nullptr || paramScope->symbolTable == nullptr); Assert(bodyScope->m_symList == nullptr || bodyScope->symbolTable == nullptr); if (paramScope->Count() == 0) { // Once the scopes are merged, there's no reason to instantiate the param scope. paramScope->SetMustInstantiate(false); // Scopes are already merged or we don't have an arguments object. Go ahead and // remove the param scope from the scope chain. bodyScope->SetEnclosingScope(paramScope->GetEnclosingScope()); return; } bodyScope->ForEachSymbol([&](Symbol * sym) { // Duplicate 'arguments' - param scope arguments wins. if (byteCodeGenerator->UseParserBindings() && sym->GetDecl()->sxVar.pid == byteCodeGenerator->GetParser()->names()->arguments) { return; } Assert(paramScope->m_symList == nullptr || paramScope->FindLocalSymbol(sym->GetName()) == nullptr); paramScope->AddNewSymbol(sym); }); // Reassign non-formal slot positions. Formals need to keep their slot positions to ensure // the argument object works properly. Other symbols need to be reassigned slot positions. paramScope->ForEachSymbol([&](Symbol * sym) { if (sym->GetSymbolType() != STFormal && sym->GetScopeSlot() != Js::Constants::NoProperty) { sym->SetScopeSlot(Js::Constants::NoProperty); sym->EnsureScopeSlot(pnodeScope->sxFnc.funcInfo); } sym->SetScope(bodyScope); }); bodyScope->m_count = paramScope->m_count; bodyScope->m_symList = paramScope->m_symList; bodyScope->scopeSlotCount = paramScope->scopeSlotCount; if (bodyScope->symbolTable != nullptr) { Adelete(byteCodeGenerator->GetAllocator(), bodyScope->symbolTable); bodyScope->symbolTable = nullptr; } bodyScope->symbolTable = paramScope->symbolTable; if (paramScope->GetIsObject()) { bodyScope->SetIsObject(); } if (paramScope->GetMustInstantiate()) { bodyScope->SetMustInstantiate(true); } // Once the scopes are merged, there's no reason to instantiate the param scope. paramScope->SetMustInstantiate(false); paramScope->m_count = 0; paramScope->scopeSlotCount = 0; paramScope->m_symList = nullptr; paramScope->symbolTable = nullptr; // Remove the parameter scope from the scope chain. bodyScope->SetEnclosingScope(paramScope->GetEnclosingScope()); }