Js::JavascriptNumber * CodeGenNumberAllocator::Alloc() { Assert(!finalized); if (currentChunkNumberCount == CodeGenNumberChunk::MaxNumberCount) { CodeGenNumberChunk * newChunk = threadAlloc? threadAlloc->AllocChunk() : RecyclerNewStructZ(recycler, CodeGenNumberChunk); // Need to always put the new chunk last, as when we flush // pages, new chunk's page might not be full yet, and won't // be flushed, and we will have a broken link in the link list. newChunk->next = nullptr; if (this->chunkTail != nullptr) { this->chunkTail->next = newChunk; } else { this->chunk = newChunk; } this->chunkTail = newChunk; this->currentChunkNumberCount = 0; } Js::JavascriptNumber * newNumber = threadAlloc? threadAlloc->AllocNumber() : Js::JavascriptNumber::NewUninitialized(recycler); this->chunkTail->numbers[this->currentChunkNumberCount++] = newNumber; return newNumber; }
void JsBuiltInEngineInterfaceExtensionObject::EnsureJsBuiltInByteCode(ScriptContext * scriptContext) { if (jsBuiltInByteCode == nullptr) { SourceContextInfo* sourceContextInfo = RecyclerNewStructZ(scriptContext->GetRecycler(), SourceContextInfo); sourceContextInfo->dwHostSourceContext = Js::Constants::JsBuiltInSourceContext; sourceContextInfo->isHostDynamicDocument = true; sourceContextInfo->sourceContextId = Js::Constants::JsBuiltInSourceContextId; Assert(sourceContextInfo != nullptr); SRCINFO si; memset(&si, 0, sizeof(si)); si.sourceContextInfo = sourceContextInfo; SRCINFO *hsi = scriptContext->AddHostSrcInfo(&si); uint32 flags = fscrJsBuiltIn | (CONFIG_FLAG(CreateFunctionProxy) && !scriptContext->IsProfiling() ? fscrAllowFunctionProxy : 0); HRESULT hr = Js::ByteCodeSerializer::DeserializeFromBuffer(scriptContext, flags, (LPCUTF8)nullptr, hsi, (byte*)Library_Bytecode_JsBuiltIn, nullptr, &jsBuiltInByteCode); IfFailAssertMsgAndThrowHr(hr, "Failed to deserialize JsBuiltIn.js bytecode - very probably the bytecode needs to be rebuilt."); this->SetHasBytecode(); } }