ArenaMemoryData * MemoryProfiler::Begin(LPCWSTR name) { if (!Js::Configuration::Global.flags.IsEnabled(Js::TraceMemoryFlag)) { return nullptr; } Assert(name != nullptr); if (wcscmp(name, _u("MemoryProfiler")) == 0) { // Don't profile memory profiler itself return nullptr; } // This is debug only code, we don't care if we catch the right exception AUTO_NESTED_HANDLED_EXCEPTION_TYPE(ExceptionType_DisableCheck); MemoryProfiler * memoryProfiler = EnsureMemoryProfiler(); ArenaMemoryDataSummary * arenaTotalMemoryData; if (!memoryProfiler->arenaDataMap.TryGetValue((LPWSTR)name, &arenaTotalMemoryData)) { arenaTotalMemoryData = AnewStructZ(&memoryProfiler->alloc, ArenaMemoryDataSummary); memoryProfiler->arenaDataMap.Add((LPWSTR)name, arenaTotalMemoryData); } arenaTotalMemoryData->arenaCount++; ArenaMemoryData * memoryData = AnewStructZ(&memoryProfiler->alloc, ArenaMemoryData); if (arenaTotalMemoryData->data == nullptr) { arenaTotalMemoryData->data = memoryData; } else { memoryData->next = arenaTotalMemoryData->data; arenaTotalMemoryData->data->prev = memoryData; arenaTotalMemoryData->data = memoryData; } memoryData->profiler = memoryProfiler; return memoryData; }
/* static */ void JITTimeFunctionBody::InitializeJITFunctionData( __in ArenaAllocator * arena, __in Js::FunctionBody *functionBody, __out FunctionBodyDataIDL * jitBody) { Assert(functionBody != nullptr); // const table jitBody->constCount = functionBody->GetConstantCount(); if (functionBody->GetConstantCount() > 0) { jitBody->constTable = (intptr_t *)functionBody->GetConstTable(); if (!functionBody->GetIsAsmJsFunction()) { jitBody->constTableContent = AnewStructZ(arena, ConstTableContentIDL); jitBody->constTableContent->count = functionBody->GetConstantCount(); jitBody->constTableContent->content = AnewArrayZ(arena, RecyclableObjectIDL*, functionBody->GetConstantCount()); for (Js::RegSlot reg = Js::FunctionBody::FirstRegSlot; reg < functionBody->GetConstantCount(); ++reg) { Js::Var varConst = functionBody->GetConstantVar(reg); Assert(varConst != nullptr); if (Js::TaggedInt::Is(varConst) || varConst == (Js::Var)&Js::NullFrameDisplay || varConst == (Js::Var)&Js::StrictNullFrameDisplay) { // don't need TypeId for these } else { if (Js::TaggedNumber::Is(varConst)) { // the typeid should be TypeIds_Number, determine this directly from const table } else { jitBody->constTableContent->content[reg - Js::FunctionBody::FirstRegSlot] = (RecyclableObjectIDL*)varConst; } } } }