JavascriptSharedArrayBuffer* JavascriptSharedArrayBuffer::Create(SharedContents *sharedContents, DynamicType * type) { AssertOrFailFast(!sharedContents || !sharedContents->IsWebAssembly()); Recycler* recycler = type->GetScriptContext()->GetRecycler(); JavascriptSharedArrayBuffer* result = RecyclerNewFinalized(recycler, JavascriptSharedArrayBuffer, sharedContents, type); return result; }
JavascriptSharedArrayBuffer* JavascriptSharedArrayBuffer::Create(uint32 length, DynamicType * type) { Recycler* recycler = type->GetScriptContext()->GetRecycler(); JavascriptSharedArrayBuffer* result = RecyclerNewFinalized(recycler, JavascriptSharedArrayBuffer, length, type); Assert(result); recycler->AddExternalMemoryUsage(length); return result; }
WebAssemblySharedArrayBuffer* WebAssemblySharedArrayBuffer::Create(SharedContents *sharedContents, DynamicType * type) { AssertOrFailFast(Wasm::Threads::IsEnabled()); AssertOrFailFast(sharedContents && sharedContents->IsWebAssembly()); Recycler* recycler = type->GetScriptContext()->GetRecycler(); WebAssemblySharedArrayBuffer* result = RecyclerNewFinalized(recycler, WebAssemblySharedArrayBuffer, sharedContents, type); return result; }
RegexPattern *RegexPattern::New(Js::ScriptContext *scriptContext, Program* program, bool isLiteral) { return RecyclerNewFinalized( scriptContext->GetRecycler(), RegexPattern, scriptContext->GetLibrary(), program, isLiteral); }
WebAssemblySharedArrayBuffer* WebAssemblySharedArrayBuffer::Create(uint32 length, uint32 maxLength, DynamicType * type) { AssertOrFailFast(Wasm::Threads::IsEnabled()); Recycler* recycler = type->GetScriptContext()->GetRecycler(); WebAssemblySharedArrayBuffer* result = RecyclerNewFinalized(recycler, WebAssemblySharedArrayBuffer, type); result->Init(length, maxLength); result->sharedContents->SetIsWebAssembly(); result->ValidateBuffer(); recycler->AddExternalMemoryUsage(length); return result; }
JavascriptSharedArrayBuffer* JavascriptSharedArrayBuffer::Create(SharedContents *sharedContents, DynamicType * type) { Recycler* recycler = type->GetScriptContext()->GetRecycler(); JavascriptSharedArrayBuffer* result = RecyclerNewFinalized(recycler, JavascriptSharedArrayBuffer, sharedContents, type); Assert(result != nullptr); if (sharedContents != nullptr) { // REVIEW : why do we need to increase this? it is the same memory we are sharing. recycler->AddExternalMemoryUsage(sharedContents->bufferLength); } return result; }
SourceTextModuleRecord* SourceTextModuleRecord::Create(ScriptContext* scriptContext) { Recycler* recycler = scriptContext->GetRecycler(); SourceTextModuleRecord* childModuleRecord; childModuleRecord = RecyclerNewFinalized(recycler, Js::SourceTextModuleRecord, scriptContext); // There is no real reference to lifetime management in ecmascript // The life time of a module record should be controlled by the module registry as defined in WHATWG module loader spec // in practice the modulerecord lifetime should be the same as the scriptcontext so it could be retrieved for the same // site. Host might hold a reference to the module as well after initializing the module. // In our implementation, we'll use the moduleId in bytecode to identify the module. childModuleRecord->moduleId = scriptContext->GetLibrary()->EnsureModuleRecordList()->Add(childModuleRecord); return childModuleRecord; }
WebAssemblyMemory * WebAssemblyMemory::CreateMemoryObject(uint32 initial, uint32 maximum, ScriptContext * scriptContext) { if (initial > maximum || initial > Wasm::Limits::GetMaxMemoryInitialPages() || maximum > Wasm::Limits::GetMaxMemoryMaximumPages()) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange); } // This shouldn't overflow since we checked in the module, but just to be safe uint32 byteLength = UInt32Math::Mul<WebAssembly::PageSize>(initial); WebAssemblyArrayBuffer* buffer = scriptContext->GetLibrary()->CreateWebAssemblyArrayBuffer(byteLength); Assert(buffer); if (byteLength > 0 && buffer->GetByteLength() == 0) { // Failed to allocate buffer return nullptr; } return RecyclerNewFinalized(scriptContext->GetRecycler(), WebAssemblyMemory, buffer, initial, maximum, scriptContext->GetLibrary()->GetWebAssemblyMemoryType()); }
/* static */ JsrtExternalObject* JsrtExternalObject::Create(void *data, JsFinalizeCallback finalizeCallback, Js::RecyclableObject * prototype, Js::ScriptContext *scriptContext) { Js::DynamicType * dynamicType = scriptContext->GetLibrary()->GetCachedJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback)); if (dynamicType == nullptr) { dynamicType = RecyclerNew(scriptContext->GetRecycler(), JsrtExternalType, scriptContext, finalizeCallback); scriptContext->GetLibrary()->CacheJsrtExternalType(reinterpret_cast<uintptr_t>(finalizeCallback), dynamicType); } Assert(dynamicType->IsJsrtExternal()); Assert(dynamicType->GetIsShared()); JsrtExternalObject * externalObject = RecyclerNewFinalized(scriptContext->GetRecycler(), JsrtExternalObject, static_cast<JsrtExternalType*>(dynamicType), data); if (prototype != nullptr) { externalObject->SetPrototype(prototype); } return externalObject; }
Utf8SourceInfo* Utf8SourceInfo::NewWithHolder(ScriptContext* scriptContext, ISourceHolder* sourceHolder, int32 length, SRCINFO const* srcInfo) { // TODO: make this finalizable? Or have a finalizable version which would HeapDelete the string? Is this needed? DWORD_PTR secondaryHostSourceContext = Js::Constants::NoHostSourceContext; if (srcInfo->sourceContextInfo->IsDynamic()) { secondaryHostSourceContext = scriptContext->GetThreadContext()->GetDebugManager()->AllocateSecondaryHostSourceContext(); } Recycler * recycler = scriptContext->GetRecycler(); Utf8SourceInfo* toReturn = RecyclerNewFinalized(recycler, Utf8SourceInfo, sourceHolder, length, SRCINFO::Copy(recycler, srcInfo), secondaryHostSourceContext, scriptContext); if (scriptContext->IsInDebugMode()) { toReturn->debugModeSource = sourceHolder->GetSource(L"Debug Mode Loading"); toReturn->debugModeSourceLength = sourceHolder->GetByteLength(L"Debug Mode Loading"); toReturn->debugModeSourceIsEmpty = toReturn->debugModeSource == nullptr || sourceHolder->IsEmpty(); } return toReturn; }
/* static */ JsrtContextCore *JsrtContextCore::New(JsrtRuntime * runtime) { return RecyclerNewFinalized(runtime->GetThreadContext()->EnsureRecycler(), JsrtContextCore, runtime); }