void RuntimeContextInfo::EnqueueNewPathVarAsNeeded(Js::RecyclableObject* parent, Js::Var val, const char16* propName, const char16* optacessortag) { if(JsSupport::IsVarTaggedInline(val)) { return; } if(JsSupport::IsVarPrimitiveKind(val) && !Js::GlobalObject::Is(parent)) { return; //we keep primitives from global object only -- may need others but this is a simple way to start to get undefined, null, infy, etc. } Js::RecyclableObject* obj = Js::RecyclableObject::FromVar(val); if(!this->m_coreObjToPathMap.ContainsKey(obj)) { const UtilSupport::TTAutoString* ppath = this->m_coreObjToPathMap.Item(parent); this->m_worklist.Enqueue(obj); UtilSupport::TTAutoString* tpath = TT_HEAP_NEW(UtilSupport::TTAutoString, *ppath); tpath->Append(_u(".")); tpath->Append(propName); if(optacessortag != nullptr) { tpath->Append(optacessortag); } TTDAssert(!this->m_coreObjToPathMap.ContainsKey(obj), "Already in map!!!"); this->m_coreObjToPathMap.AddNew(obj, tpath); } }
void TTDCompareMap::CheckConsistentAndAddPtrIdMapping_Helper(TTD_PTR_ID h1PtrId, TTD_PTR_ID h2PtrId, TTDComparePath::StepKind stepKind, const TTDComparePath::PathEntry& next) { if(h1PtrId == TTD_INVALID_PTR_ID || h2PtrId == TTD_INVALID_PTR_ID) { this->DiagnosticAssert(h1PtrId == TTD_INVALID_PTR_ID && h2PtrId == TTD_INVALID_PTR_ID); } else if(this->H1PtrToH2PtrMap.ContainsKey(h1PtrId)) { this->DiagnosticAssert(this->H1PtrToH2PtrMap.Item(h1PtrId) == h2PtrId); } else if(this->H1ValueMap.ContainsKey(h1PtrId)) { this->DiagnosticAssert(this->H2ValueMap.ContainsKey(h2PtrId)); const NSSnapValues::SnapPrimitiveValue* v1 = this->H1ValueMap.Item(h1PtrId); const NSSnapValues::SnapPrimitiveValue* v2 = this->H2ValueMap.Item(h2PtrId); NSSnapValues::AssertSnapEquiv(v1, v2, *this); } else { this->H1PtrIdWorklist.Enqueue(h1PtrId); TTDComparePath* objPath = TT_HEAP_NEW(TTDComparePath, this->CurrentPath, stepKind, next); this->H1PtrToPathMap.AddNew(h1PtrId, objPath); this->H1PtrToH2PtrMap.AddNew(h1PtrId, h2PtrId); } }
void RuntimeContextInfo::EnqueueRootPathObject(const char16* rootName, Js::RecyclableObject* obj) { this->m_worklist.Enqueue(obj); UtilSupport::TTAutoString* rootStr = TT_HEAP_NEW(UtilSupport::TTAutoString, rootName); TTDAssert(!this->m_coreObjToPathMap.ContainsKey(obj), "Already in map!!!"); this->m_coreObjToPathMap.AddNew(obj, rootStr); }
void RuntimeContextInfo::AddWellKnownDebuggerScopePath(Js::RecyclableObject* parent, Js::DebuggerScope* dbgScope, uint32 index) { if(!this->m_coreDbgScopeToPathMap.ContainsKey(dbgScope)) { const UtilSupport::TTAutoString* ppath = this->m_coreObjToPathMap.Item(parent); UtilSupport::TTAutoString* scpath = TT_HEAP_NEW(UtilSupport::TTAutoString, *ppath); scpath->Append(_u(".!scope[")); scpath->Append(index); scpath->Append(_u("]")); this->m_coreDbgScopeToPathMap.AddNew(dbgScope, scpath); } }
void RuntimeContextInfo::EnqueueNewFunctionBodyObject(Js::RecyclableObject* parent, Js::FunctionBody* fbody, const char16* name) { if(!this->m_coreBodyToPathMap.ContainsKey(fbody)) { fbody->EnsureDeserialized(); const UtilSupport::TTAutoString* ppath = this->m_coreObjToPathMap.Item(parent); UtilSupport::TTAutoString* fpath = TT_HEAP_NEW(UtilSupport::TTAutoString, *ppath); fpath->Append(_u(".")); fpath->Append(name); this->m_coreBodyToPathMap.AddNew(fbody, fpath); } }
SnapShot* SnapShot::ParseSnapshotFromFile(FileReader* reader) { reader->ReadRecordStart(); reader->ReadDouble(NSTokens::Key::timeTotal); reader->ReadUInt64(NSTokens::Key::usedMemory, true); reader->ReadUInt64(NSTokens::Key::reservedMemory, true); reader->ReadDouble(NSTokens::Key::timeMark, true); reader->ReadDouble(NSTokens::Key::timeExtract, true); SnapShot* snap = TT_HEAP_NEW(SnapShot); uint32 ctxCount = reader->ReadLengthValue(true); reader->ReadSequenceStart_WDefaultKey(true); for(uint32 i = 0; i < ctxCount; ++i) { NSSnapValues::SnapContext* snpCtx = snap->m_ctxList.NextOpenEntry(); NSSnapValues::ParseSnapContext(snpCtx, i != 0, reader, snap->GetSnapshotSlabAllocator()); } reader->ReadSequenceEnd(); //// SnapShot::ParseListHelper(&NSSnapType::ParseSnapHandler, snap->m_handlerList, reader, snap->GetSnapshotSlabAllocator()); TTDIdentifierDictionary<TTD_PTR_ID, NSSnapType::SnapHandler*> handlerMap; handlerMap.Initialize(snap->m_handlerList.Count()); for(auto iter = snap->m_handlerList.GetIterator(); iter.IsValid(); iter.MoveNext()) { handlerMap.AddItem(iter.Current()->HandlerId, iter.Current()); } SnapShot::ParseListHelper_WMap(&NSSnapType::ParseSnapType, snap->m_typeList, reader, snap->GetSnapshotSlabAllocator(), handlerMap); TTDIdentifierDictionary<TTD_PTR_ID, NSSnapType::SnapType*> typeMap; typeMap.Initialize(snap->m_typeList.Count()); for(auto iter = snap->m_typeList.GetIterator(); iter.IsValid(); iter.MoveNext()) { typeMap.AddItem(iter.Current()->TypePtrId, iter.Current()); } //// uint32 bodyCount = reader->ReadLengthValue(true); reader->ReadSequenceStart_WDefaultKey(true); for(uint32 i = 0; i < bodyCount; ++i) { NSSnapValues::FunctionBodyResolveInfo* into = snap->m_functionBodyList.NextOpenEntry(); NSSnapValues::ParseFunctionBodyInfo(into, i != 0, reader, snap->GetSnapshotSlabAllocator()); } reader->ReadSequenceEnd(); SnapShot::ParseListHelper_WMap(&NSSnapValues::ParseSnapPrimitiveValue, snap->m_primitiveObjectList, reader, snap->GetSnapshotSlabAllocator(), typeMap); uint32 objCount = reader->ReadLengthValue(true); reader->ReadSequenceStart_WDefaultKey(true); for(uint32 i = 0; i < objCount; ++i) { NSSnapObjects::SnapObject* into = snap->m_compoundObjectList.NextOpenEntry(); NSSnapObjects::ParseObject(into, i != 0, reader, snap->GetSnapshotSlabAllocator(), snap->m_snapObjectVTableArray, typeMap); } reader->ReadSequenceEnd(); //// SnapShot::ParseListHelper(&NSSnapValues::ParseScriptFunctionScopeInfo, snap->m_scopeEntries, reader, snap->GetSnapshotSlabAllocator()); SnapShot::ParseListHelper(&NSSnapValues::ParseSlotArrayInfo, snap->m_slotArrayEntries, reader, snap->GetSnapshotSlabAllocator()); reader->ReadDouble(NSTokens::Key::timeWrite, true); reader->ReadRecordEnd(); return snap; }