static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyTable(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSObject* memoryDescriptor; { JSValue argument = exec->argument(0); if (!argument.isObject()) return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Table expects its first argument to be an object")))); memoryDescriptor = jsCast<JSObject*>(argument); } { Identifier elementIdent = Identifier::fromString(&vm, "element"); JSValue elementValue = memoryDescriptor->get(exec, elementIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); String elementString = elementValue.toWTFString(exec); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (elementString != "anyfunc") return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Table expects its 'element' field to be the string 'anyfunc'")))); } Identifier initialIdent = Identifier::fromString(&vm, "initial"); JSValue initialSizeValue = memoryDescriptor->get(exec, initialIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); uint32_t initial = toNonWrappingUint32(exec, initialSizeValue); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); std::optional<uint32_t> maximum; Identifier maximumIdent = Identifier::fromString(&vm, "maximum"); bool hasProperty = memoryDescriptor->hasProperty(exec, maximumIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (hasProperty) { JSValue maxSizeValue = memoryDescriptor->get(exec, maximumIdent); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); maximum = toNonWrappingUint32(exec, maxSizeValue); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (initial > *maximum) { return JSValue::encode(throwException(exec, throwScope, createRangeError(exec, ASCIILiteral("'maximum' property must be greater than or equal to the 'initial' property")))); } } throwScope.release(); return JSValue::encode(JSWebAssemblyTable::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyTableStructure(), initial, maximum)); }
static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncSet(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyTable* table = getTable(exec, vm, exec->thisValue()); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); JSValue value = exec->argument(1); WebAssemblyFunction* wasmFunction; WebAssemblyWrapperFunction* wasmWrapperFunction; if (!value.isNull() && !isWebAssemblyHostFunction(vm, value, wasmFunction, wasmWrapperFunction)) return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Table.prototype.set expects the second argument to be null or an instance of WebAssembly.Function"_s))); uint32_t index = toNonWrappingUint32(exec, exec->argument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (index >= table->length()) return JSValue::encode(throwException(exec, throwScope, createRangeError(exec, "WebAssembly.Table.prototype.set expects an integer less than the length of the table"_s))); if (value.isNull()) table->clearFunction(index); else { ASSERT(value.isObject() && isWebAssemblyHostFunction(vm, jsCast<JSObject*>(value), wasmFunction, wasmWrapperFunction)); ASSERT(!!wasmFunction || !!wasmWrapperFunction); if (wasmFunction) table->setFunction(vm, index, wasmFunction); else table->setFunction(vm, index, wasmWrapperFunction); } return JSValue::encode(jsUndefined()); }
static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGet(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyTable* table = getTable(exec, vm, exec->thisValue()); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); uint32_t index = toNonWrappingUint32(exec, exec->argument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); if (index >= table->length()) return JSValue::encode(throwException(exec, throwScope, createRangeError(exec, "WebAssembly.Table.prototype.get expects an integer less than the length of the table"_s))); if (JSObject* result = table->getFunction(index)) return JSValue::encode(result); return JSValue::encode(jsNull()); }
static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncGrow(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyTable* table = getTable(exec, vm, exec->thisValue()); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); uint32_t delta = toNonWrappingUint32(exec, exec->argument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); uint32_t oldLength = table->length(); if (!table->grow(delta)) return JSValue::encode(throwException(exec, throwScope, createRangeError(exec, "WebAssembly.Table.prototype.grow could not grow the table"_s))); return JSValue::encode(jsNumber(oldLength)); }