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;
 }
Exemple #4
0
 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;
}
Exemple #10
0
    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);
}