| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- #include "RuntimeDebugPch.h"
- #if ENABLE_TTD
- namespace TTD
- {
- namespace NSLogEvents
- {
- void PassVarToHostInReplay(ThreadContextTTD* executeContext, TTDVar origVar, Js::Var replayVar)
- {
- static_assert(sizeof(TTDVar) == sizeof(Js::Var), "We assume the bit patterns on these types are the same!!!");
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- if(replayVar == nullptr || TTD::JsSupport::IsVarTaggedInline(replayVar))
- {
- TTDAssert(TTD::JsSupport::AreInlineVarsEquiv(origVar, replayVar), "Should be same bit pattern.");
- }
- #endif
- if(replayVar != nullptr && TTD::JsSupport::IsVarPtrValued(replayVar))
- {
- Js::RecyclableObject* obj = Js::RecyclableObject::FromVar(replayVar);
- executeContext->AddLocalRoot(TTD_CONVERT_OBJ_TO_LOG_PTR_ID(origVar), obj);
- }
- }
- Js::Var InflateVarInReplay(ThreadContextTTD* executeContext, TTDVar origVar)
- {
- static_assert(sizeof(TTDVar) == sizeof(Js::Var), "We assume the bit patterns on these types are the same!!!");
- if(origVar == nullptr || TTD::JsSupport::IsVarTaggedInline(origVar))
- {
- return TTD_CONVERT_TTDVAR_TO_JSVAR(origVar);
- }
- else
- {
- return executeContext->LookupObjectForLogID(TTD_CONVERT_OBJ_TO_LOG_PTR_ID(origVar));
- }
- }
- void EventLogEntry_Emit(const EventLogEntry* evt, EventLogEntryVTableEntry* evtFPVTable, FileWriter* writer, ThreadContext* threadContext, NSTokens::Separator separator)
- {
- writer->WriteRecordStart(separator);
- writer->WriteTag<EventKind>(NSTokens::Key::eventKind, evt->EventKind);
- writer->WriteInt32(NSTokens::Key::eventResultStatus, evt->ResultStatus, NSTokens::Separator::CommaSeparator);
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- writer->WriteInt64(NSTokens::Key::eventTime, evt->EventTimeStamp, NSTokens::Separator::CommaSeparator);
- #endif
- auto emitFP = evtFPVTable[(uint32)evt->EventKind].EmitFP;
- if(emitFP != nullptr)
- {
- emitFP(evt, writer, threadContext);
- }
- writer->WriteRecordEnd();
- }
- EventKind EventLogEntry_ParseHeader(bool readSeparator, FileReader* reader)
- {
- reader->ReadRecordStart(readSeparator);
- return reader->ReadTag<EventKind>(NSTokens::Key::eventKind);
- }
- void EventLogEntry_ParseRest(EventLogEntry* evt, EventLogEntryVTableEntry* evtFPVTable, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- evt->ResultStatus = reader->ReadInt32(NSTokens::Key::eventResultStatus, true);
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- evt->EventTimeStamp = reader->ReadInt64(NSTokens::Key::eventTime, true);
- #endif
- auto parseFP = evtFPVTable[(uint32)evt->EventKind].ParseFP;
- if(parseFP != nullptr)
- {
- parseFP(evt, threadContext, reader, alloc);
- }
- reader->ReadRecordEnd();
- }
- bool EventFailsWithRuntimeError(const EventLogEntry* evt)
- {
- return !(EventDoesNotReturn(evt) || EventCompletesNormally(evt) || EventCompletesWithException(evt));
- }
- bool EventDoesNotReturn(const EventLogEntry* evt)
- {
- return evt->ResultStatus == -1;
- }
- bool EventCompletesNormally(const EventLogEntry* evt)
- {
- return (evt->ResultStatus == 0) || (evt->ResultStatus == TTD_REPLAY_JsErrorInvalidArgument) || (evt->ResultStatus == TTD_REPLAY_JsErrorArgumentNotObject);
- }
- bool EventCompletesWithException(const EventLogEntry* evt)
- {
- return (evt->ResultStatus == TTD_REPLAY_JsErrorCategoryScript) || (evt->ResultStatus == TTD_REPLAY_JsErrorScriptTerminated);
- }
- //////////////////
- void SnapshotEventLogEntry_UnloadEventMemory(EventLogEntry* evt, UnlinkableSlabAllocator& alloc)
- {
- SnapshotEventLogEntry* snapEvt = GetInlineEventDataAs<SnapshotEventLogEntry, EventKind::SnapshotTag>(evt);
- if(snapEvt->LiveContextCount != 0)
- {
- alloc.UnlinkAllocation(snapEvt->LiveContextIdArray);
- }
- if(snapEvt->LongLivedRefRootsCount != 0)
- {
- alloc.UnlinkAllocation(snapEvt->LongLivedRefRootsIdArray);
- }
- SnapshotEventLogEntry_UnloadSnapshot(evt);
- }
- void SnapshotEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const SnapshotEventLogEntry* snapEvt = GetInlineEventDataAs<SnapshotEventLogEntry, EventKind::SnapshotTag>(evt);
- writer->WriteInt64(NSTokens::Key::restoreTime, snapEvt->RestoreTimestamp, NSTokens::Separator::CommaSeparator);
- writer->WriteLengthValue(snapEvt->LiveContextCount, NSTokens::Separator::CommaSeparator);
- writer->WriteSequenceStart_DefaultKey(NSTokens::Separator::CommaSeparator);
- for(uint32 i = 0; i < snapEvt->LiveContextCount; ++i)
- {
- writer->WriteNakedLogTag(snapEvt->LiveContextIdArray[i], i != 0 ? NSTokens::Separator::CommaSeparator : NSTokens::Separator::NoSeparator);
- }
- writer->WriteSequenceEnd();
- writer->WriteLengthValue(snapEvt->LongLivedRefRootsCount, NSTokens::Separator::CommaSeparator);
- writer->WriteSequenceStart_DefaultKey(NSTokens::Separator::CommaSeparator);
- for(uint32 i = 0; i < snapEvt->LongLivedRefRootsCount; ++i)
- {
- writer->WriteNakedLogTag(snapEvt->LongLivedRefRootsIdArray[i], i != 0 ? NSTokens::Separator::CommaSeparator : NSTokens::Separator::NoSeparator);
- }
- writer->WriteSequenceEnd();
- if(snapEvt->Snap != nullptr)
- {
- snapEvt->Snap->EmitSnapshot(snapEvt->RestoreTimestamp, threadContext);
- }
- }
- void SnapshotEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- SnapshotEventLogEntry* snapEvt = GetInlineEventDataAs<SnapshotEventLogEntry, EventKind::SnapshotTag>(evt);
- snapEvt->RestoreTimestamp = reader->ReadInt64(NSTokens::Key::restoreTime, true);
- snapEvt->LiveContextCount = reader->ReadLengthValue(true);
- snapEvt->LiveContextIdArray = (snapEvt->LiveContextCount != 0) ? alloc.SlabAllocateArray<TTD_LOG_PTR_ID>(snapEvt->LiveContextCount) : nullptr;
- reader->ReadSequenceStart_WDefaultKey(true);
- for(uint32 i = 0; i < snapEvt->LiveContextCount; ++i)
- {
- snapEvt->LiveContextIdArray[i] = reader->ReadNakedLogTag(i != 0);
- }
- reader->ReadSequenceEnd();
- snapEvt->LongLivedRefRootsCount = reader->ReadLengthValue(true);
- snapEvt->LongLivedRefRootsIdArray = (snapEvt->LongLivedRefRootsCount != 0) ? alloc.SlabAllocateArray<TTD_LOG_PTR_ID>(snapEvt->LongLivedRefRootsCount) : nullptr;
- reader->ReadSequenceStart_WDefaultKey(true);
- for(uint32 i = 0; i < snapEvt->LongLivedRefRootsCount; ++i)
- {
- snapEvt->LongLivedRefRootsIdArray[i] = reader->ReadNakedLogTag(i != 0);
- }
- reader->ReadSequenceEnd();
- snapEvt->Snap = nullptr;
- }
- void SnapshotEventLogEntry_EnsureSnapshotDeserialized(EventLogEntry* evt, ThreadContext* threadContext)
- {
- SnapshotEventLogEntry* snapEvt = GetInlineEventDataAs<SnapshotEventLogEntry, EventKind::SnapshotTag>(evt);
- if(snapEvt->Snap == nullptr)
- {
- snapEvt->Snap = SnapShot::Parse(snapEvt->RestoreTimestamp, threadContext);
- }
- }
- void SnapshotEventLogEntry_UnloadSnapshot(EventLogEntry* evt)
- {
- SnapshotEventLogEntry* snapEvt = GetInlineEventDataAs<SnapshotEventLogEntry, EventKind::SnapshotTag>(evt);
- if(snapEvt->Snap != nullptr)
- {
- TT_HEAP_DELETE(SnapShot, snapEvt->Snap);
- snapEvt->Snap = nullptr;
- }
- }
- void EventLoopYieldPointEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const EventLoopYieldPointEntry* ypEvt = GetInlineEventDataAs<EventLoopYieldPointEntry, EventKind::EventLoopYieldPointTag>(evt);
- writer->WriteUInt64(NSTokens::Key::eventTime, ypEvt->EventTimeStamp, NSTokens::Separator::CommaSeparator);
- writer->WriteDouble(NSTokens::Key::loopTime, ypEvt->EventWallTime, NSTokens::Separator::CommaSeparator);
- }
- void EventLoopYieldPointEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- EventLoopYieldPointEntry* ypEvt = GetInlineEventDataAs<EventLoopYieldPointEntry, EventKind::EventLoopYieldPointTag>(evt);
- ypEvt->EventTimeStamp = reader->ReadUInt64(NSTokens::Key::eventTime, true);
- ypEvt->EventWallTime = reader->ReadDouble(NSTokens::Key::loopTime, true);
- }
- //////////////////
- void CodeLoadEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const CodeLoadEventLogEntry* codeEvt = GetInlineEventDataAs<CodeLoadEventLogEntry, EventKind::TopLevelCodeTag>(evt);
- writer->WriteUInt32(NSTokens::Key::u32Val, codeEvt->BodyCounterId, NSTokens::Separator::CommaSeparator);
- }
- void CodeLoadEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- CodeLoadEventLogEntry* codeEvt = GetInlineEventDataAs<CodeLoadEventLogEntry, EventKind::TopLevelCodeTag>(evt);
- codeEvt->BodyCounterId = reader->ReadUInt32(NSTokens::Key::u32Val, true);
- }
- void TelemetryEventLogEntry_UnloadEventMemory(EventLogEntry* evt, UnlinkableSlabAllocator& alloc)
- {
- TelemetryEventLogEntry* telemetryEvt = GetInlineEventDataAs<TelemetryEventLogEntry, EventKind::TelemetryLogTag>(evt);
- alloc.UnlinkString(telemetryEvt->InfoString);
- }
- void TelemetryEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const TelemetryEventLogEntry* telemetryEvt = GetInlineEventDataAs<TelemetryEventLogEntry, EventKind::TelemetryLogTag>(evt);
- writer->WriteString(NSTokens::Key::stringVal, telemetryEvt->InfoString, NSTokens::Separator::CommaSeparator);
- writer->WriteBool(NSTokens::Key::boolVal, telemetryEvt->DoPrint, NSTokens::Separator::CommaSeparator);
- }
- void TelemetryEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- TelemetryEventLogEntry* telemetryEvt = GetInlineEventDataAs<TelemetryEventLogEntry, EventKind::TelemetryLogTag>(evt);
- reader->ReadString(NSTokens::Key::stringVal, alloc, telemetryEvt->InfoString, true);
- telemetryEvt->DoPrint = reader->ReadBool(NSTokens::Key::boolVal, true);
- }
- //////////////////
- void RandomSeedEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const RandomSeedEventLogEntry* rndEvt = GetInlineEventDataAs<RandomSeedEventLogEntry, EventKind::RandomSeedTag>(evt);
- writer->WriteUInt64(NSTokens::Key::u64Val, rndEvt->Seed0, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt64(NSTokens::Key::u64Val, rndEvt->Seed1, NSTokens::Separator::CommaSeparator);
- }
- void RandomSeedEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- RandomSeedEventLogEntry* rndEvt = GetInlineEventDataAs<RandomSeedEventLogEntry, EventKind::RandomSeedTag>(evt);
- rndEvt->Seed0 = reader->ReadUInt64(NSTokens::Key::u64Val, true);
- rndEvt->Seed1 = reader->ReadUInt64(NSTokens::Key::u64Val, true);
- }
- void DoubleEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const DoubleEventLogEntry* dblEvt = GetInlineEventDataAs<DoubleEventLogEntry, EventKind::DoubleTag>(evt);
- writer->WriteDouble(NSTokens::Key::doubleVal, dblEvt->DoubleValue, NSTokens::Separator::CommaSeparator);
- }
- void DoubleEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- DoubleEventLogEntry* dblEvt = GetInlineEventDataAs<DoubleEventLogEntry, EventKind::DoubleTag>(evt);
- dblEvt->DoubleValue = reader->ReadDouble(NSTokens::Key::doubleVal, true);
- }
- void StringValueEventLogEntry_UnloadEventMemory(EventLogEntry* evt, UnlinkableSlabAllocator& alloc)
- {
- StringValueEventLogEntry* strEvt = GetInlineEventDataAs<StringValueEventLogEntry, EventKind::StringTag>(evt);
- alloc.UnlinkString(strEvt->StringValue);
- }
- void StringValueEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const StringValueEventLogEntry* strEvt = GetInlineEventDataAs<StringValueEventLogEntry, EventKind::StringTag>(evt);
- writer->WriteString(NSTokens::Key::stringVal, strEvt->StringValue, NSTokens::Separator::CommaSeparator);
- }
- void StringValueEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- StringValueEventLogEntry* strEvt = GetInlineEventDataAs<StringValueEventLogEntry, EventKind::StringTag>(evt);
- reader->ReadString(NSTokens::Key::stringVal, alloc, strEvt->StringValue, true);
- }
- //////////////////
- void PropertyEnumStepEventLogEntry_UnloadEventMemory(EventLogEntry* evt, UnlinkableSlabAllocator& alloc)
- {
- PropertyEnumStepEventLogEntry* propertyEvt = GetInlineEventDataAs<PropertyEnumStepEventLogEntry, EventKind::PropertyEnumTag>(evt);
- if(!IsNullPtrTTString(propertyEvt->PropertyString))
- {
- alloc.UnlinkString(propertyEvt->PropertyString);
- }
- }
- void PropertyEnumStepEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const PropertyEnumStepEventLogEntry* propertyEvt = GetInlineEventDataAs<PropertyEnumStepEventLogEntry, EventKind::PropertyEnumTag>(evt);
- writer->WriteBool(NSTokens::Key::boolVal, !!propertyEvt->ReturnCode, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::propertyId, propertyEvt->Pid, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::attributeFlags, propertyEvt->Attributes, NSTokens::Separator::CommaSeparator);
- if(propertyEvt->ReturnCode)
- {
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- writer->WriteString(NSTokens::Key::stringVal, propertyEvt->PropertyString, NSTokens::Separator::CommaSeparator);
- #else
- if(propertyEvt->Pid == Js::Constants::NoProperty)
- {
- writer->WriteString(NSTokens::Key::stringVal, propertyEvt->PropertyString, NSTokens::Separator::CommaSeparator);
- }
- #endif
- }
- }
- void PropertyEnumStepEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- PropertyEnumStepEventLogEntry* propertyEvt = GetInlineEventDataAs<PropertyEnumStepEventLogEntry, EventKind::PropertyEnumTag>(evt);
- propertyEvt->ReturnCode = reader->ReadBool(NSTokens::Key::boolVal, true);
- propertyEvt->Pid = (Js::PropertyId)reader->ReadUInt32(NSTokens::Key::propertyId, true);
- propertyEvt->Attributes = (Js::PropertyAttributes)reader->ReadUInt32(NSTokens::Key::attributeFlags, true);
- InitializeAsNullPtrTTString(propertyEvt->PropertyString);
- if(propertyEvt->ReturnCode)
- {
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- reader->ReadString(NSTokens::Key::stringVal, alloc, propertyEvt->PropertyString, true);
- #else
- if(propertyEvt->Pid == Js::Constants::NoProperty)
- {
- reader->ReadString(NSTokens::Key::stringVal, alloc, propertyEvt->PropertyString, true);
- }
- #endif
- }
- }
- //////////////////
- void SymbolCreationEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const SymbolCreationEventLogEntry* symEvt = GetInlineEventDataAs<SymbolCreationEventLogEntry, EventKind::SymbolCreationTag>(evt);
- writer->WriteUInt32(NSTokens::Key::propertyId, symEvt->Pid, NSTokens::Separator::CommaSeparator);
- }
- void SymbolCreationEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- SymbolCreationEventLogEntry* symEvt = GetInlineEventDataAs<SymbolCreationEventLogEntry, EventKind::SymbolCreationTag>(evt);
- symEvt->Pid = (Js::PropertyId)reader->ReadUInt32(NSTokens::Key::propertyId, true);
- }
- //////////////////
- void WeakCollectionContainsEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const WeakCollectionContainsEventLogEntry* wcEvt = GetInlineEventDataAs<WeakCollectionContainsEventLogEntry, EventKind::WeakCollectionContainsTag>(evt);
- writer->WriteBool(NSTokens::Key::boolVal, wcEvt->ContainsValue, NSTokens::Separator::CommaSeparator);
- }
- void WeakCollectionContainsEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- WeakCollectionContainsEventLogEntry* wcEvt = GetInlineEventDataAs<WeakCollectionContainsEventLogEntry, EventKind::WeakCollectionContainsTag>(evt);
- wcEvt->ContainsValue = reader->ReadBool(NSTokens::Key::boolVal, true);
- }
- //////////////////
- int64 ExternalCbRegisterCallEventLogEntry_GetLastNestedEventTime(const EventLogEntry* evt)
- {
- const ExternalCbRegisterCallEventLogEntry* cbrEvt = GetInlineEventDataAs<ExternalCbRegisterCallEventLogEntry, EventKind::ExternalCbRegisterCall>(evt);
- return cbrEvt->LastNestedEventTime;
- }
- void ExternalCbRegisterCallEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const ExternalCbRegisterCallEventLogEntry* cbrEvt = GetInlineEventDataAs<ExternalCbRegisterCallEventLogEntry, EventKind::ExternalCbRegisterCall>(evt);
- NSSnapValues::EmitTTDVar(cbrEvt->CallbackFunction, writer, NSTokens::Separator::CommaSeparator);
- writer->WriteInt64(NSTokens::Key::i64Val, cbrEvt->LastNestedEventTime, NSTokens::Separator::CommaSeparator);
- }
- void ExternalCbRegisterCallEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- ExternalCbRegisterCallEventLogEntry* cbrEvt = GetInlineEventDataAs<ExternalCbRegisterCallEventLogEntry, EventKind::ExternalCbRegisterCall>(evt);
- cbrEvt->CallbackFunction = NSSnapValues::ParseTTDVar(true, reader);
- cbrEvt->LastNestedEventTime = reader->ReadInt64(NSTokens::Key::i64Val, true);
- }
- //////////////////
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- void ExternalCallEventLogEntry_ProcessDiagInfoPre(EventLogEntry* evt, Js::JavascriptFunction* function, UnlinkableSlabAllocator& alloc)
- {
- ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- Js::JavascriptString* displayName = function->GetDisplayName();
- alloc.CopyStringIntoWLength(displayName->GetSz(), displayName->GetLength(), callEvt->FunctionName);
- }
- #endif
- int64 ExternalCallEventLogEntry_GetLastNestedEventTime(const EventLogEntry* evt)
- {
- const ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- return callEvt->LastNestedEventTime;
- }
- void ExternalCallEventLogEntry_ProcessArgs(EventLogEntry* evt, int32 rootDepth, Js::JavascriptFunction* function, const Js::Arguments& args, bool checkExceptions, UnlinkableSlabAllocator& alloc)
- {
- ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- callEvt->RootNestingDepth = rootDepth;
- callEvt->ArgCount = args.Info.Count + 1;
- static_assert(sizeof(TTDVar) == sizeof(Js::Var), "These need to be the same size (and have same bit layout) for this to work!");
- callEvt->ArgArray = alloc.SlabAllocateArray<TTDVar>(callEvt->ArgCount);
- callEvt->ArgArray[0] = static_cast<TTDVar>(function);
- js_memcpy_s(callEvt->ArgArray + 1, args.Info.Count * sizeof(TTDVar), args.Values, args.Info.Count * sizeof(Js::Var));
- if (args.HasNewTarget())
- {
- callEvt->NewTarget = static_cast<TTDVar>(args.GetNewTarget());
- }
- else
- {
- callEvt->NewTarget = nullptr;
- }
- callEvt->ReturnValue = nullptr;
- callEvt->LastNestedEventTime = TTD_EVENT_MAXTIME;
- callEvt->CheckExceptionStatus = checkExceptions;
- }
- void ExternalCallEventLogEntry_ProcessReturn(EventLogEntry* evt, Js::Var res, int64 lastNestedEvent)
- {
- ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- callEvt->ReturnValue = TTD_CONVERT_JSVAR_TO_TTDVAR(res);
- callEvt->LastNestedEventTime = lastNestedEvent;
- }
- void ExternalCallEventLogEntry_UnloadEventMemory(EventLogEntry* evt, UnlinkableSlabAllocator& alloc)
- {
- ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- alloc.UnlinkAllocation(callEvt->ArgArray);
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- alloc.UnlinkString(callEvt->FunctionName);
- #endif
- }
- void ExternalCallEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- writer->WriteString(NSTokens::Key::name, callEvt->FunctionName, NSTokens::Separator::CommaSeparator);
- #endif
- writer->WriteInt32(NSTokens::Key::rootNestingDepth, callEvt->RootNestingDepth, NSTokens::Separator::CommaSeparator);
- writer->WriteLengthValue(callEvt->ArgCount, NSTokens::Separator::CommaSeparator);
- writer->WriteSequenceStart_DefaultKey(NSTokens::Separator::CommaSeparator);
- for(uint32 i = 0; i < callEvt->ArgCount; ++i)
- {
- NSTokens::Separator sep = (i != 0) ? NSTokens::Separator::CommaSeparator : NSTokens::Separator::NoSeparator;
- NSSnapValues::EmitTTDVar(callEvt->ArgArray[i], writer, sep);
- }
- writer->WriteSequenceEnd();
- writer->WriteKey(NSTokens::Key::newTargetVal, NSTokens::Separator::CommaSeparator);
- NSSnapValues::EmitTTDVar(callEvt->NewTarget, writer, NSTokens::Separator::NoSeparator);
- writer->WriteKey(NSTokens::Key::argRetVal, NSTokens::Separator::CommaSeparator);
- NSSnapValues::EmitTTDVar(callEvt->ReturnValue, writer, NSTokens::Separator::NoSeparator);
- writer->WriteBool(NSTokens::Key::boolVal, callEvt->CheckExceptionStatus, NSTokens::Separator::CommaSeparator);
- writer->WriteInt64(NSTokens::Key::i64Val, callEvt->LastNestedEventTime, NSTokens::Separator::CommaSeparator);
- }
- void ExternalCallEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- ExternalCallEventLogEntry* callEvt = GetInlineEventDataAs<ExternalCallEventLogEntry, EventKind::ExternalCallTag>(evt);
- #if ENABLE_TTD_INTERNAL_DIAGNOSTICS
- reader->ReadString(NSTokens::Key::name, alloc, callEvt->FunctionName, true);
- #endif
- callEvt->RootNestingDepth = reader->ReadInt32(NSTokens::Key::rootNestingDepth, true);
- callEvt->ArgCount = reader->ReadLengthValue(true);
- callEvt->ArgArray = alloc.SlabAllocateArray<TTDVar>(callEvt->ArgCount);
- reader->ReadSequenceStart_WDefaultKey(true);
- for(uint32 i = 0; i < callEvt->ArgCount; ++i)
- {
- callEvt->ArgArray[i] = NSSnapValues::ParseTTDVar(i != 0, reader);
- }
- reader->ReadSequenceEnd();
- reader->ReadKey(NSTokens::Key::newTargetVal, true);
- callEvt->NewTarget = NSSnapValues::ParseTTDVar(false, reader);
- reader->ReadKey(NSTokens::Key::argRetVal, true);
- callEvt->ReturnValue = NSSnapValues::ParseTTDVar(false, reader);
- callEvt->CheckExceptionStatus = reader->ReadBool(NSTokens::Key::boolVal, true);
- callEvt->LastNestedEventTime = reader->ReadInt64(NSTokens::Key::i64Val, true);
- }
- //////////////////
- void ExplicitLogWriteEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- ; //We don't track any extra data with this
- }
- void ExplicitLogWriteEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- ; //We don't track any extra data with this
- }
- void TTDInnerLoopLogWriteEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const TTDInnerLoopLogWriteEventLogEntry* ilevt = GetInlineEventDataAs<TTDInnerLoopLogWriteEventLogEntry, EventKind::TTDInnerLoopLogWriteTag>(evt);
- writer->WriteLogTag(NSTokens::Key::sourceContextId, ilevt->SourceScriptLogId, NSTokens::Separator::CommaSeparator);
- writer->WriteInt64(NSTokens::Key::eventTime, ilevt->EventTime, NSTokens::Separator::CommaSeparator);
- writer->WriteInt64(NSTokens::Key::functionTime, ilevt->FunctionTime, NSTokens::Separator::CommaSeparator);
- writer->WriteInt64(NSTokens::Key::loopTime, ilevt->LoopTime, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::functionBodyId, ilevt->TopLevelBodyId, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::functionColumn, ilevt->FunctionLine, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::functionLine, ilevt->FunctionColumn, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::line, ilevt->Line, NSTokens::Separator::CommaSeparator);
- writer->WriteUInt32(NSTokens::Key::column, ilevt->Column, NSTokens::Separator::CommaSeparator);
- }
- void TTDInnerLoopLogWriteEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- TTDInnerLoopLogWriteEventLogEntry* ilevt = GetInlineEventDataAs<TTDInnerLoopLogWriteEventLogEntry, EventKind::TTDInnerLoopLogWriteTag>(evt);
- ilevt->SourceScriptLogId = reader->ReadLogTag(NSTokens::Key::sourceContextId, true);
- ilevt->EventTime = reader->ReadInt64(NSTokens::Key::eventTime, true);
- ilevt->FunctionTime = reader->ReadInt64(NSTokens::Key::functionTime, true);
- ilevt->LoopTime = reader->ReadInt64(NSTokens::Key::loopTime, true);
- ilevt->TopLevelBodyId = reader->ReadUInt32(NSTokens::Key::functionBodyId, true);
- ilevt->FunctionLine = reader->ReadUInt32(NSTokens::Key::functionColumn, true);
- ilevt->FunctionColumn = reader->ReadUInt32(NSTokens::Key::functionLine, true);
- ilevt->Line = reader->ReadUInt32(NSTokens::Key::line, true);
- ilevt->Column = reader->ReadUInt32(NSTokens::Key::column, true);
- }
- void TTDFetchAutoTraceStatusEventLogEntry_Emit(const EventLogEntry* evt, FileWriter* writer, ThreadContext* threadContext)
- {
- const TTDFetchAutoTraceStatusEventLogEntry* atfevt = GetInlineEventDataAs<TTDFetchAutoTraceStatusEventLogEntry, EventKind::TTDFetchAutoTraceStatusTag>(evt);
- writer->WriteLogTag(NSTokens::Key::boolVal, atfevt->IsEnabled, NSTokens::Separator::CommaSeparator);
- }
- void TTDFetchAutoTraceStatusEventLogEntry_Parse(EventLogEntry* evt, ThreadContext* threadContext, FileReader* reader, UnlinkableSlabAllocator& alloc)
- {
- TTDFetchAutoTraceStatusEventLogEntry* atfevt = GetInlineEventDataAs<TTDFetchAutoTraceStatusEventLogEntry, EventKind::TTDFetchAutoTraceStatusTag>(evt);
- atfevt->IsEnabled = reader->ReadLogTag(NSTokens::Key::boolVal, true);
- }
- }
- }
- #endif
|