void DynamicObject::InitSlots(DynamicObject * instance, ScriptContext * scriptContext) { Recycler * recycler = scriptContext->GetRecycler(); int slotCapacity = GetTypeHandler()->GetSlotCapacity(); int inlineSlotCapacity = GetTypeHandler()->GetInlineSlotCapacity(); if (slotCapacity > inlineSlotCapacity) { instance->auxSlots = RecyclerNewArrayZ(recycler, Var, slotCapacity - inlineSlotCapacity); } }
WebAssemblyTable * WebAssemblyTable::Create(uint32 initial, uint32 maximum, ScriptContext * scriptContext) { if (initial > maximum || initial > Wasm::Limits::GetMaxTableSize() || maximum > Wasm::Limits::GetMaxTableSize()) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange); } Field(Var) * values = nullptr; if (initial > 0) { values = RecyclerNewArrayZ(scriptContext->GetRecycler(), Field(Var), initial); } return RecyclerNew(scriptContext->GetRecycler(), WebAssemblyTable, values, initial, initial, maximum, scriptContext->GetLibrary()->GetWebAssemblyTableType()); }
Var WebAssemblyTable::EntryGrow(RecyclableObject* function, CallInfo callInfo, ...) { PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); ARGUMENTS(args, callInfo); ScriptContext* scriptContext = function->GetScriptContext(); Assert(!(callInfo.Flags & CallFlags_New)); if (args.Info.Count == 0 || !WebAssemblyTable::Is(args[0])) { JavascriptError::ThrowTypeError(scriptContext, WASMERR_NeedTableObject); } WebAssemblyTable * table = WebAssemblyTable::FromVar(args[0]); uint32 oldLength = table->m_currentLength; Var deltaVar = args.Info.Count >= 2 ? args[1] : scriptContext->GetLibrary()->GetUndefined(); uint32 delta = WebAssembly::ToNonWrappingUint32(deltaVar, scriptContext); if (delta > 0) { uint32 newLength = 0; if (UInt32Math::Add(table->m_currentLength, delta, &newLength) || newLength > table->m_maxLength) { JavascriptError::ThrowRangeError(scriptContext, JSERR_ArgumentOutOfRange); } Field(Var) * newValues = RecyclerNewArrayZ(scriptContext->GetRecycler(), Field(Var), newLength); CopyArray(newValues, newLength, table->m_values, table->m_currentLength); table->m_values = newValues; table->m_currentLength = newLength; } return JavascriptNumber::ToVar(oldLength, scriptContext); }