static EncodedJSValue JSC_HOST_CALL IntlCollatorFuncCompare(ExecState* state) { VM& vm = state->vm(); auto scope = DECLARE_THROW_SCOPE(vm); // 10.3.4 Collator Compare Functions (ECMA-402 2.0) // 1. Let collator be the this value. // 2. Assert: Type(collator) is Object and collator has an [[initializedCollator]] internal slot whose value is true. IntlCollator* collator = jsCast<IntlCollator*>(state->thisValue()); // 3. If x is not provided, let x be undefined. // 4. If y is not provided, let y be undefined. // 5. Let X be ToString(x). JSString* x = state->argument(0).toString(state); // 6. ReturnIfAbrupt(X). RETURN_IF_EXCEPTION(scope, encodedJSValue()); // 7. Let Y be ToString(y). JSString* y = state->argument(1).toString(state); // 8. ReturnIfAbrupt(Y). RETURN_IF_EXCEPTION(scope, encodedJSValue()); // 9. Return CompareStrings(collator, X, Y). auto xViewWithString = x->viewWithUnderlyingString(*state); RETURN_IF_EXCEPTION(scope, encodedJSValue()); auto yViewWithString = y->viewWithUnderlyingString(*state); RETURN_IF_EXCEPTION(scope, encodedJSValue()); scope.release(); return JSValue::encode(collator->compareStrings(*state, xViewWithString.view, yViewWithString.view)); }
// https://tc39.github.io/ecma262/#sec-reflect.defineproperty EncodedJSValue JSC_HOST_CALL reflectObjectDefineProperty(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue target = exec->argument(0); if (!target.isObject()) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.defineProperty requires the first argument be an object"))); auto propertyName = exec->argument(1).toPropertyKey(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); PropertyDescriptor descriptor; bool success = toPropertyDescriptor(exec, exec->argument(2), descriptor); ASSERT(!scope.exception() == success); if (UNLIKELY(!success)) return encodedJSValue(); ASSERT((descriptor.attributes() & Accessor) || (!descriptor.isAccessorDescriptor())); ASSERT(!scope.exception()); // Reflect.defineProperty should not throw an error when the defineOwnProperty operation fails. bool shouldThrow = false; JSObject* targetObject = asObject(target); scope.release(); return JSValue::encode(jsBoolean(targetObject->methodTable(vm)->defineOwnProperty(targetObject, exec, propertyName, descriptor, shouldThrow))); }
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()); }
EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeParseModule(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); const Identifier moduleKey = exec->argument(0).toPropertyKey(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); auto* jsSourceCode = jsDynamicCast<JSSourceCode*>(vm, exec->argument(1)); if (!jsSourceCode) return throwVMTypeError(exec, scope); SourceCode sourceCode = jsSourceCode->sourceCode(); CodeProfiling profile(sourceCode); ParserError error; std::unique_ptr<ModuleProgramNode> moduleProgramNode = parse<ModuleProgramNode>( &vm, sourceCode, Identifier(), JSParserBuiltinMode::NotBuiltin, JSParserStrictMode::Strict, JSParserScriptMode::Module, SourceParseMode::ModuleAnalyzeMode, SuperBinding::NotNeeded, error); if (error.isValid()) { throwVMError(exec, scope, error.toErrorObject(exec->lexicalGlobalObject(), sourceCode)); return JSValue::encode(jsUndefined()); } ASSERT(moduleProgramNode); ModuleAnalyzer moduleAnalyzer(exec, moduleKey, sourceCode, moduleProgramNode->varDeclarations(), moduleProgramNode->lexicalVariables()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); JSModuleRecord* moduleRecord = moduleAnalyzer.analyze(*moduleProgramNode); return JSValue::encode(moduleRecord); }
static EncodedJSValue JSC_HOST_CALL constructWeakSet(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSGlobalObject* globalObject = asInternalFunction(exec->jsCallee())->globalObject(); Structure* weakSetStructure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), globalObject->weakSetStructure()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); JSWeakSet* weakSet = JSWeakSet::create(exec, weakSetStructure); JSValue iterable = exec->argument(0); if (iterable.isUndefinedOrNull()) return JSValue::encode(weakSet); JSValue adderFunction = weakSet->JSObject::get(exec, vm.propertyNames->add); RETURN_IF_EXCEPTION(scope, encodedJSValue()); CallData adderFunctionCallData; CallType adderFunctionCallType = getCallData(adderFunction, adderFunctionCallData); if (adderFunctionCallType == CallType::None) return JSValue::encode(throwTypeError(exec, scope)); scope.release(); forEachInIterable(exec, iterable, [&](VM&, ExecState* exec, JSValue nextValue) { MarkedArgumentBuffer arguments; arguments.append(nextValue); call(exec, adderFunction, adderFunctionCallType, adderFunctionCallData, weakSet, arguments); }); return JSValue::encode(weakSet); }
// HTMLAllCollections are strange objects, they support both get and call. static EncodedJSValue JSC_HOST_CALL callHTMLAllCollection(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); if (exec->argumentCount() < 1) return JSValue::encode(jsUndefined()); // Do not use thisObj here. It can be the JSHTMLDocument, in the document.forms(i) case. JSHTMLAllCollection* jsCollection = jsCast<JSHTMLAllCollection*>(exec->callee()); HTMLAllCollection& collection = jsCollection->wrapped(); // Also, do we need the TypeError test here ? if (exec->argumentCount() == 1) { // Support for document.all(<index>) etc. String string = exec->argument(0).toString(exec)->value(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); if (Optional<uint32_t> index = parseIndex(*string.impl())) return JSValue::encode(toJS(exec, jsCollection->globalObject(), collection.item(index.value()))); // Support for document.images('<name>') etc. return JSValue::encode(namedItems(*exec, jsCollection, Identifier::fromString(exec, string))); } // The second arg, if set, is the index of the item we want String string = exec->argument(0).toString(exec)->value(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); if (Optional<uint32_t> index = parseIndex(*exec->argument(1).toWTFString(exec).impl())) { if (auto* item = collection.namedItemWithIndex(string, index.value())) return JSValue::encode(toJS(exec, jsCollection->globalObject(), *item)); } return JSValue::encode(jsUndefined()); }
static EncodedJSValue JSC_HOST_CALL constructArrayBuffer(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSArrayBufferConstructor* constructor = jsCast<JSArrayBufferConstructor*>(exec->jsCallee()); unsigned length; if (exec->argumentCount()) { length = exec->uncheckedArgument(0).toIndex(exec, "length"); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } else { // Although the documentation doesn't say so, it is in fact correct to say // "new ArrayBuffer()". The result is the same as allocating an array buffer // with a zero length. length = 0; } auto buffer = ArrayBuffer::tryCreate(length, 1); if (!buffer) return JSValue::encode(throwOutOfMemoryError(exec, scope)); if (constructor->sharingMode() == ArrayBufferSharingMode::Shared) buffer->makeShared(); ASSERT(constructor->sharingMode() == buffer->sharingMode()); Structure* arrayBufferStructure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), constructor->globalObject()->arrayBufferStructure(constructor->sharingMode())); RETURN_IF_EXCEPTION(scope, encodedJSValue()); JSArrayBuffer* result = JSArrayBuffer::create(vm, arrayBufferStructure, WTFMove(buffer)); return JSValue::encode(result); }
// ECMA-262 5.1, 15.11.4.4 EncodedJSValue JSC_HOST_CALL errorProtoFuncToString(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); // 1. Let O be the this value. JSValue thisValue = exec->thisValue(); // 2. If Type(O) is not Object, throw a TypeError exception. if (!thisValue.isObject()) return throwVMTypeError(exec, scope); JSObject* thisObj = asObject(thisValue); // Guard against recursion! StringRecursionChecker checker(exec, thisObj); ASSERT(!scope.exception() || checker.earlyReturnValue()); if (JSValue earlyReturnValue = checker.earlyReturnValue()) return JSValue::encode(earlyReturnValue); // 3. Let name be the result of calling the [[Get]] internal method of O with argument "name". JSValue name = thisObj->get(exec, exec->propertyNames().name); RETURN_IF_EXCEPTION(scope, encodedJSValue()); // 4. If name is undefined, then let name be "Error"; else let name be ToString(name). String nameString; if (name.isUndefined()) nameString = ASCIILiteral("Error"); else { nameString = name.toWTFString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } // 5. Let msg be the result of calling the [[Get]] internal method of O with argument "message". JSValue message = thisObj->get(exec, exec->propertyNames().message); RETURN_IF_EXCEPTION(scope, encodedJSValue()); // (sic) // 6. If msg is undefined, then let msg be the empty String; else let msg be ToString(msg). // 7. If msg is undefined, then let msg be the empty String; else let msg be ToString(msg). String messageString; if (message.isUndefined()) messageString = String(); else { messageString = message.toWTFString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } // 8. If name is the empty String, return msg. if (!nameString.length()) return JSValue::encode(message.isString() ? message : jsString(exec, messageString)); // 9. If msg is the empty String, return name. if (!messageString.length()) return JSValue::encode(name.isString() ? name : jsString(exec, nameString)); // 10. Return the result of concatenating name, ":", a single space character, and msg. scope.release(); return JSValue::encode(jsMakeNontrivialString(exec, nameString, ": ", messageString)); }
EncodedJSValue JSC_HOST_CALL symbolConstructorFor(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSString* stringKey = exec->argument(0).toString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); String string = stringKey->value(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(Symbol::create(exec->vm(), exec->vm().symbolRegistry().symbolForKey(string))); }
// https://tc39.github.io/ecma262/#sec-reflect.construct EncodedJSValue JSC_HOST_CALL reflectObjectConstruct(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue target = exec->argument(0); if (!target.isObject()) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.construct requires the first argument be a constructor"))); ConstructData constructData; ConstructType constructType; if (!target.isConstructor(constructType, constructData)) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.construct requires the first argument be a constructor"))); JSValue newTarget = target; if (exec->argumentCount() >= 3) { newTarget = exec->argument(2); if (!newTarget.isConstructor()) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.construct requires the third argument be a constructor if present"))); } MarkedArgumentBuffer arguments; JSObject* argumentsObject = jsDynamicCast<JSObject*>(exec->argument(1)); if (!argumentsObject) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.construct requires the second argument be an object"))); createListFromArrayLike(exec, argumentsObject, RuntimeTypeMaskAllTypes, ASCIILiteral("This error must not be raised"), [&] (JSValue value, RuntimeType) -> bool { arguments.append(value); return false; }); RETURN_IF_EXCEPTION(scope, encodedJSValue()); scope.release(); return JSValue::encode(construct(exec, target, constructType, constructData, arguments, newTarget)); }
EncodedJSValue JSC_HOST_CALL IntlCollatorPrototypeGetterCompare(ExecState* state) { VM& vm = state->vm(); auto scope = DECLARE_THROW_SCOPE(vm); // 10.3.3 Intl.Collator.prototype.compare (ECMA-402 2.0) // 1. Let collator be this Collator object. IntlCollator* collator = jsDynamicCast<IntlCollator*>(state->thisValue()); if (!collator) return JSValue::encode(throwTypeError(state, scope, ASCIILiteral("Intl.Collator.prototype.compare called on value that's not an object initialized as a Collator"))); JSBoundFunction* boundCompare = collator->boundCompare(); // 2. If collator.[[boundCompare]] is undefined, if (!boundCompare) { JSGlobalObject* globalObject = collator->globalObject(); // a. Let F be a new built-in function object as defined in 11.3.4. // b. The value of F’s length property is 2. JSFunction* targetObject = JSFunction::create(vm, globalObject, 2, ASCIILiteral("compare"), IntlCollatorFuncCompare, NoIntrinsic); // c. Let bc be BoundFunctionCreate(F, «this value»). boundCompare = JSBoundFunction::create(vm, state, globalObject, targetObject, collator, nullptr, 2, ASCIILiteral("compare")); RETURN_IF_EXCEPTION(scope, encodedJSValue()); // d. Set collator.[[boundCompare]] to bc. collator->setBoundCompare(vm, boundCompare); } // 3. Return collator.[[boundCompare]]. return JSValue::encode(boundCompare); }
EncodedJSValue JSC_HOST_CALL mathProtoFuncHypot(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); unsigned argsCount = exec->argumentCount(); double max = 0; Vector<double, 8> args; args.reserveInitialCapacity(argsCount); for (unsigned i = 0; i < argsCount; ++i) { args.uncheckedAppend(exec->uncheckedArgument(i).toNumber(exec)); RETURN_IF_EXCEPTION(scope, encodedJSValue()); if (std::isinf(args[i])) return JSValue::encode(jsDoubleNumber(+std::numeric_limits<double>::infinity())); max = std::max(fabs(args[i]), max); } if (!max) max = 1; // Kahan summation algorithm significantly reduces the numerical error in the total obtained. double sum = 0; double compensation = 0; for (double argument : args) { double scaledArgument = argument / max; double summand = scaledArgument * scaledArgument - compensation; double preliminary = sum + summand; compensation = (preliminary - sum) - summand; sum = preliminary; } return JSValue::encode(jsDoubleNumber(sqrt(sum) * max)); }
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()); }
EncodedJSValue JSC_HOST_CALL mathProtoFuncClz32(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); uint32_t value = exec->argument(0).toUInt32(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(JSValue(clz32(value))); }
template<> EncodedJSValue JSC_HOST_CALL JSTestPromiseRejectionEventConstructor::construct(ExecState* state) { VM& vm = state->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); UNUSED_PARAM(throwScope); auto* castedThis = jsCast<JSTestPromiseRejectionEventConstructor*>(state->jsCallee()); ASSERT(castedThis); if (UNLIKELY(state->argumentCount() < 2)) return throwVMError(state, throwScope, createNotEnoughArgumentsError(state)); auto type = convert<IDLDOMString>(*state, state->uncheckedArgument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); auto eventInitDict = convert<IDLDictionary<TestPromiseRejectionEvent::Init>>(*state, state->uncheckedArgument(1)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); auto object = TestPromiseRejectionEvent::create(*state, WTFMove(type), WTFMove(eventInitDict)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); return JSValue::encode(toJSNewlyCreated<IDLInterface<TestPromiseRejectionEvent>>(*state, *castedThis->globalObject(), WTFMove(object))); }
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)); }
static EncodedJSValue JSC_HOST_CALL webAssemblyTableProtoFuncLength(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyTable* table = getTable(exec, vm, exec->thisValue()); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); return JSValue::encode(jsNumber(table->length())); }
static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyRuntimeError(ExecState* state) { auto& vm = state->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue message = state->argument(0); auto* structure = InternalFunction::createSubclassStructure(state, state->newTarget(), asInternalFunction(state->callee())->globalObject()->WebAssemblyRuntimeErrorStructure()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(JSWebAssemblyRuntimeError::create(state, structure, message, false)); }
static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyModule(ExecState* exec) { VM& vm = exec->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); auto* structure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), exec->lexicalGlobalObject()->WebAssemblyModuleStructure()); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); throwScope.release(); return JSValue::encode(WebAssemblyModuleConstructor::createModule(exec, structure)); }
EncodedJSValue setData(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSDataView* dataView = jsDynamicCast<JSDataView*>(exec->thisValue()); if (!dataView) return throwVMTypeError(exec, scope, ASCIILiteral("Receiver of DataView method must be a DataView")); unsigned byteOffset = exec->argument(0).toIndex(exec, "byteOffset"); RETURN_IF_EXCEPTION(scope, encodedJSValue()); const unsigned dataSize = sizeof(typename Adaptor::Type); union { typename Adaptor::Type value; uint8_t rawBytes[dataSize]; } u; u.value = toNativeFromValue<Adaptor>(exec, exec->argument(1)); RETURN_IF_EXCEPTION(scope, encodedJSValue()); bool littleEndian = false; unsigned elementSize = sizeof(typename Adaptor::Type); if (elementSize > 1 && exec->argumentCount() >= 3) { littleEndian = exec->uncheckedArgument(2).toBoolean(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } unsigned byteLength = dataView->length(); if (elementSize > byteLength || byteOffset > byteLength - elementSize) return throwVMError(exec, scope, createRangeError(exec, ASCIILiteral("Out of bounds access"))); uint8_t* dataPtr = static_cast<uint8_t*>(dataView->vector()) + byteOffset; if (needToFlipBytesIfLittleEndian(littleEndian)) { for (unsigned i = dataSize; i--;) *dataPtr++ = u.rawBytes[i]; } else { for (unsigned i = 0; i < dataSize; i++) *dataPtr++ = u.rawBytes[i]; } return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeRequestedModules(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSModuleRecord* moduleRecord = jsDynamicCast<JSModuleRecord*>(vm, exec->argument(0)); if (!moduleRecord) { scope.release(); return JSValue::encode(constructEmptyArray(exec, nullptr)); } JSArray* result = constructEmptyArray(exec, nullptr, moduleRecord->requestedModules().size()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); size_t i = 0; for (auto& key : moduleRecord->requestedModules()) { result->putDirectIndex(exec, i++, jsString(exec, key.get())); RETURN_IF_EXCEPTION(scope, encodedJSValue()); } return JSValue::encode(result); }
EncodedJSValue JSC_HOST_CALL mathProtoFuncIMul(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); int32_t left = exec->argument(0).toInt32(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); scope.release(); int32_t right = exec->argument(1).toInt32(exec); return JSValue::encode(jsNumber(left * right)); }
static EncodedJSValue JSC_HOST_CALL functionPrint(ExecState* exec) { auto scope = DECLARE_THROW_SCOPE(exec->vm()); for (unsigned i = 0; i < exec->argumentCount(); ++i) { String argStr = exec->uncheckedArgument(i).toWTFString(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); dataLog(argStr); } return JSValue::encode(jsUndefined()); }
// ECMA 15.6.2 static EncodedJSValue JSC_HOST_CALL constructWithBooleanConstructor(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue boolean = jsBoolean(exec->argument(0).toBoolean(exec)); Structure* booleanStructure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), asInternalFunction(exec->callee())->globalObject()->booleanObjectStructure()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); BooleanObject* obj = BooleanObject::create(vm, booleanStructure); obj->setInternalValue(vm, boolean); return JSValue::encode(obj); }
static inline JSC::EncodedJSValue jsTestEventTargetPrototypeFunctionItemBody(JSC::ExecState* state, typename IDLOperation<JSTestEventTarget>::ClassParameter castedThis, JSC::ThrowScope& throwScope) { UNUSED_PARAM(state); UNUSED_PARAM(throwScope); auto& impl = castedThis->wrapped(); if (UNLIKELY(state->argumentCount() < 1)) return throwVMError(state, throwScope, createNotEnoughArgumentsError(state)); auto index = convert<IDLUnsignedLong>(*state, state->uncheckedArgument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); return JSValue::encode(toJS<IDLInterface<Node>>(*state, *castedThis->globalObject(), impl.item(WTFMove(index)))); }
static inline JSC::EncodedJSValue jsTestActiveDOMObjectPrototypeFunctionPostMessageBody(JSC::ExecState* state, typename IDLOperation<JSTestActiveDOMObject>::ClassParameter castedThis, JSC::ThrowScope& throwScope) { UNUSED_PARAM(state); UNUSED_PARAM(throwScope); auto& impl = castedThis->wrapped(); if (UNLIKELY(state->argumentCount() < 1)) return throwVMError(state, throwScope, createNotEnoughArgumentsError(state)); auto message = convert<IDLDOMString>(*state, state->uncheckedArgument(0)); RETURN_IF_EXCEPTION(throwScope, encodedJSValue()); impl.postMessage(WTFMove(message)); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL moduleLoaderPrototypeGetModuleNamespaceObject(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); auto* loader = jsDynamicCast<JSModuleLoader*>(vm, exec->thisValue()); if (!loader) return JSValue::encode(jsUndefined()); auto* moduleNamespaceObject = loader->getModuleNamespaceObject(exec, exec->argument(0)); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(moduleNamespaceObject); }
// ECMA 15.7.1 static EncodedJSValue JSC_HOST_CALL constructWithNumberConstructor(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); double n = exec->argumentCount() ? exec->uncheckedArgument(0).toNumber(exec) : 0; Structure* structure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), exec->lexicalGlobalObject()->numberObjectStructure()); RETURN_IF_EXCEPTION(scope, encodedJSValue()); NumberObject* object = NumberObject::create(exec->vm(), structure); object->setInternalValue(exec->vm(), jsNumber(n)); return JSValue::encode(object); }
// https://tc39.github.io/ecma262/#sec-reflect.isextensible EncodedJSValue JSC_HOST_CALL reflectObjectIsExtensible(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue target = exec->argument(0); if (!target.isObject()) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.isExtensible requires the first argument be an object"))); bool isExtensible = asObject(target)->isExtensible(exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(jsBoolean(isExtensible)); }
// https://tc39.github.io/ecma262/#sec-reflect.preventextensions EncodedJSValue JSC_HOST_CALL reflectObjectPreventExtensions(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSValue target = exec->argument(0); if (!target.isObject()) return JSValue::encode(throwTypeError(exec, scope, ASCIILiteral("Reflect.preventExtensions requires the first argument be an object"))); JSObject* object = asObject(target); bool result = object->methodTable(vm)->preventExtensions(object, exec); RETURN_IF_EXCEPTION(scope, encodedJSValue()); return JSValue::encode(jsBoolean(result)); }