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->AdditionalInfo->FunctionName); }
void JavascriptExternalFunction::ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) { Js::JavascriptString* nameString = this->GetDisplayName(); TTD::TTString* snapName = alloc.SlabAllocateStruct<TTD::TTString>(); alloc.CopyStringIntoWLength(nameString->GetSz(), nameString->GetLength(), *snapName); TTD::NSSnapObjects::StdExtractSetKindSpecificInfo<TTD::TTString*, TTD::NSSnapObjects::SnapObjectType::SnapExternalFunctionObject>(objData, snapName); }
void SwitchIRBuilder::BuildMultiBrCaseInstrForStrings(uint32 targetOffset) { Assert(m_caseNodes && m_caseNodes->Count() && m_profiledSwitchInstr && !m_isAsmJs); if (m_caseNodes->Count() < CONFIG_FLAG(MaxLinearStringCaseCount)) { int start = 0; int end = m_caseNodes->Count() - 1; BuildLinearTraverseInstr(start, end, targetOffset); ResetCaseNodes(); return; } IR::Opnd * srcOpnd = m_caseNodes->Item(0)->GetCaseInstr()->GetSrc1(); // Src1 is same in all the caseNodes IR::MultiBranchInstr * multiBranchInstr = IR::MultiBranchInstr::New(Js::OpCode::MultiBr, srcOpnd, m_func); uint32 lastCaseOffset = m_caseNodes->Item(m_caseNodes->Count() - 1)->GetOffset(); uint caseCount = m_caseNodes->Count(); bool generateDictionary = true; char16 minChar = USHORT_MAX; char16 maxChar = 0; // Either the jump table is within the limit (<= 128) or it is dense (<= 2 * case Count) uint const maxJumpTableSize = max<uint>(CONFIG_FLAG(MaxSingleCharStrJumpTableSize), CONFIG_FLAG(MaxSingleCharStrJumpTableRatio) * caseCount); if (this->m_seenOnlySingleCharStrCaseNodes) { generateDictionary = false; for (uint i = 0; i < caseCount; i++) { Js::JavascriptString * str = m_caseNodes->Item(i)->GetSrc2StringConstLocal(); Assert(str->GetLength() == 1); char16 currChar = str->GetString()[0]; minChar = min(minChar, currChar); maxChar = max(maxChar, currChar); if ((uint)(maxChar - minChar) > maxJumpTableSize) { generateDictionary = true; break; } } } if (generateDictionary) { multiBranchInstr->CreateBranchTargetsAndSetDefaultTarget(caseCount, IR::MultiBranchInstr::StrDictionary, targetOffset); //Adding normal cases to the instruction (except the default case, which we do it later) for (uint i = 0; i < caseCount; i++) { Js::JavascriptString * str = m_caseNodes->Item(i)->GetSrc2StringConstLocal(); uint32 caseTargetOffset = m_caseNodes->Item(i)->GetTargetOffset(); multiBranchInstr->AddtoDictionary(caseTargetOffset, str, m_caseNodes->Item(i)->GetSrc2StringConst()); } } else { // If we are only going to save 16 entries, just start from 0 so we don't have to subtract if (minChar < 16) { minChar = 0; } multiBranchInstr->m_baseCaseValue = minChar; multiBranchInstr->m_lastCaseValue = maxChar; uint jumpTableSize = maxChar - minChar + 1; multiBranchInstr->CreateBranchTargetsAndSetDefaultTarget(jumpTableSize, IR::MultiBranchInstr::SingleCharStrJumpTable, targetOffset); for (uint i = 0; i < jumpTableSize; i++) { // Initialize all the entries to the default target first. multiBranchInstr->AddtoJumpTable(targetOffset, i); } //Adding normal cases to the instruction (except the default case, which we do it later) for (uint i = 0; i < caseCount; i++) { Js::JavascriptString * str = m_caseNodes->Item(i)->GetSrc2StringConstLocal(); Assert(str->GetLength() == 1); uint32 caseTargetOffset = m_caseNodes->Item(i)->GetTargetOffset(); multiBranchInstr->AddtoJumpTable(caseTargetOffset, str->GetString()[0] - minChar); } } multiBranchInstr->m_isSwitchBr = true; m_adapter->CreateRelocRecord(multiBranchInstr, lastCaseOffset, targetOffset); m_adapter->AddInstr(multiBranchInstr, lastCaseOffset); BuildBailOnNotString(); ResetCaseNodes(); }