JSValue Database::toJS(ExecState* exec) const { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSObject* result = constructEmptyObject(exec); JSArray* bytecodes = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, JSValue()); for (unsigned i = 0; i < m_bytecodes.size(); ++i) bytecodes->putDirectIndex(exec, i, m_bytecodes[i].toJS(exec)); result->putDirect(vm, exec->propertyNames().bytecodes, bytecodes); JSArray* compilations = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, JSValue()); for (unsigned i = 0; i < m_compilations.size(); ++i) compilations->putDirectIndex(exec, i, m_compilations[i]->toJS(exec)); result->putDirect(vm, exec->propertyNames().compilations, compilations); JSArray* events = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, JSValue()); for (unsigned i = 0; i < m_events.size(); ++i) events->putDirectIndex(exec, i, m_events[i].toJS(exec)); result->putDirect(vm, exec->propertyNames().events, events); return result; }
void BytecodeSequence::addSequenceProperties(ExecState* exec, JSObject* result) const { JSArray* header = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_header.size(); ++i) header->putDirectIndex(exec, i, jsString(exec, String::fromUTF8(m_header[i]))); result->putDirect(exec->globalData(), exec->propertyNames().header, header); JSArray* sequence = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_sequence.size(); ++i) sequence->putDirectIndex(exec, i, m_sequence[i].toJS(exec)); result->putDirect(exec->globalData(), exec->propertyNames().bytecode, sequence); }
EncodedJSValue JSC_HOST_CALL privateFuncMapIteratorNext(ExecState* exec) { ASSERT(jsDynamicCast<JSMapIterator*>(exec->thisValue())); JSMapIterator* iterator = jsCast<JSMapIterator*>(exec->thisValue()); JSValue key, value; if (iterator->nextKeyValue(exec, key, value)) { JSArray* resultArray = jsCast<JSArray*>(exec->uncheckedArgument(0)); resultArray->putDirectIndex(exec, 0, key); resultArray->putDirectIndex(exec, 1, value); return JSValue::encode(jsBoolean(false)); } return JSValue::encode(jsBoolean(true)); }
JSValue Database::toJS(ExecState* exec) const { JSObject* result = constructEmptyObject(exec); JSArray* bytecodes = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_bytecodes.size(); ++i) bytecodes->putDirectIndex(exec, i, m_bytecodes[i].toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().bytecodes, bytecodes); JSArray* compilations = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_compilations.size(); ++i) compilations->putDirectIndex(exec, i, m_compilations[i]->toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().compilations, compilations); return result; }
static JSArray* getJSListenerFunctions(ExecState& state, Document* document, const EventListenerInfo& listenerInfo) { VM& vm = state.vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSArray* result = constructEmptyArray(&state, nullptr); RETURN_IF_EXCEPTION(scope, nullptr); size_t handlersCount = listenerInfo.eventListenerVector.size(); for (size_t i = 0, outputIndex = 0; i < handlersCount; ++i) { const JSEventListener* jsListener = JSEventListener::cast(&listenerInfo.eventListenerVector[i]->callback()); if (!jsListener) { ASSERT_NOT_REACHED(); continue; } // Hide listeners from other contexts. if (&jsListener->isolatedWorld() != ¤tWorld(&state)) continue; JSObject* function = jsListener->jsFunction(document); if (!function) continue; JSObject* listenerEntry = constructEmptyObject(&state); listenerEntry->putDirect(vm, Identifier::fromString(&state, "listener"), function); listenerEntry->putDirect(vm, Identifier::fromString(&state, "useCapture"), jsBoolean(listenerInfo.eventListenerVector[i]->useCapture())); result->putDirectIndex(&state, outputIndex++, JSValue(listenerEntry)); } return result; }
void JSCryptoKeySerializationJWK::buildJSONForRSAComponents(JSC::ExecState* exec, const CryptoKeyDataRSAComponents& data, JSC::JSObject* result) { addToJSON(exec, result, "kty", "RSA"); addToJSON(exec, result, "n", base64URLEncode(data.modulus())); addToJSON(exec, result, "e", base64URLEncode(data.exponent())); if (data.type() == CryptoKeyDataRSAComponents::Type::Public) return; addToJSON(exec, result, "d", base64URLEncode(data.privateExponent())); if (!data.hasAdditionalPrivateKeyParameters()) return; addToJSON(exec, result, "p", base64URLEncode(data.firstPrimeInfo().primeFactor)); addToJSON(exec, result, "q", base64URLEncode(data.secondPrimeInfo().primeFactor)); addToJSON(exec, result, "dp", base64URLEncode(data.firstPrimeInfo().factorCRTExponent)); addToJSON(exec, result, "dq", base64URLEncode(data.secondPrimeInfo().factorCRTExponent)); addToJSON(exec, result, "qi", base64URLEncode(data.secondPrimeInfo().factorCRTCoefficient)); if (data.otherPrimeInfos().isEmpty()) return; JSArray* oth = constructEmptyArray(exec, 0, exec->lexicalGlobalObject(), data.otherPrimeInfos().size()); for (size_t i = 0, size = data.otherPrimeInfos().size(); i < size; ++i) { JSObject* jsPrimeInfo = constructEmptyObject(exec); addToJSON(exec, jsPrimeInfo, "r", base64URLEncode(data.otherPrimeInfos()[i].primeFactor)); addToJSON(exec, jsPrimeInfo, "d", base64URLEncode(data.otherPrimeInfos()[i].factorCRTExponent)); addToJSON(exec, jsPrimeInfo, "t", base64URLEncode(data.otherPrimeInfos()[i].factorCRTCoefficient)); oth->putDirectIndex(exec, i, jsPrimeInfo); } result->putDirect(exec->vm(), Identifier(exec, "oth"), oth); }
static JSValue idbKeyToJSValue(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key) { if (!key) { // This should be undefined, not null. // Spec: http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#idl-def-IDBKeyRange return jsUndefined(); } switch (key->type()) { case IDBKey::ArrayType: { const IDBKey::KeyArray& inArray = key->array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(exec, 0, globalObject, size); for (size_t i = 0; i < size; ++i) { IDBKey* arrayKey = inArray.at(i).get(); outArray->putDirectIndex(exec, i, idbKeyToJSValue(exec, globalObject, arrayKey)); } return JSValue(outArray); } case IDBKey::StringType: return jsStringWithCache(exec, key->string()); case IDBKey::DateType: return jsDateOrNull(exec, key->date()); case IDBKey::NumberType: return jsNumber(key->number()); case IDBKey::MinType: case IDBKey::InvalidType: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }
JSValue JSInjectedScriptHost::weakSetEntries(ExecState* exec) { if (exec->argumentCount() < 1) return jsUndefined(); JSValue value = exec->uncheckedArgument(0); JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(value); if (!weakSet) return jsUndefined(); unsigned fetched = 0; unsigned numberToFetch = 100; JSValue numberToFetchArg = exec->argument(1); double fetchDouble = numberToFetchArg.toInteger(exec); if (fetchDouble >= 0) numberToFetch = static_cast<unsigned>(fetchDouble); JSArray* array = constructEmptyArray(exec, nullptr); for (auto it = weakSet->weakMapData()->begin(); it != weakSet->weakMapData()->end(); ++it) { JSObject* entry = constructEmptyObject(exec); entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), it->key); array->putDirectIndex(exec, fetched++, entry); if (numberToFetch && fetched >= numberToFetch) break; } return array; }
void finishCreation(VM& vm, const Vector<String>& arguments) { Base::finishCreation(vm); addFunction(vm, "debug", functionDebug, 1); addFunction(vm, "describe", functionDescribe, 1); addFunction(vm, "print", functionPrint, 1); addFunction(vm, "quit", functionQuit, 0); addFunction(vm, "gc", functionGC, 0); #ifndef NDEBUG addFunction(vm, "dumpCallFrame", functionDumpCallFrame, 0); addFunction(vm, "releaseExecutableMemory", functionReleaseExecutableMemory, 0); #endif addFunction(vm, "version", functionVersion, 1); addFunction(vm, "run", functionRun, 1); addFunction(vm, "load", functionLoad, 1); addFunction(vm, "readFile", functionReadFile, 1); addFunction(vm, "checkSyntax", functionCheckSyntax, 1); addFunction(vm, "jscStack", functionJSCStack, 1); addFunction(vm, "readline", functionReadline, 0); addFunction(vm, "preciseTime", functionPreciseTime, 0); addFunction(vm, "neverInlineFunction", functionNeverInlineFunction, 1); addFunction(vm, "noInline", functionNeverInlineFunction, 1); addFunction(vm, "numberOfDFGCompiles", functionNumberOfDFGCompiles, 1); addFunction(vm, "transferArrayBuffer", functionTransferArrayBuffer, 1); #if ENABLE(SAMPLING_FLAGS) addFunction(vm, "setSamplingFlags", functionSetSamplingFlags, 1); addFunction(vm, "clearSamplingFlags", functionClearSamplingFlags, 1); #endif JSArray* array = constructEmptyArray(globalExec(), 0); for (size_t i = 0; i < arguments.size(); ++i) array->putDirectIndex(globalExec(), i, jsString(globalExec(), arguments[i])); putDirect(vm, Identifier(globalExec(), "arguments"), array); }
EncodedJSValue JSC_HOST_CALL functionRun(ExecState* exec) { String fileName = exec->argument(0).toString(exec)->value(exec); Vector<char> script; if (!fillBufferWithContentsOfFile(fileName, script)) return JSValue::encode(exec->vm().throwException(exec, createError(exec, "Could not open file."))); GlobalObject* globalObject = GlobalObject::create(exec->vm(), GlobalObject::createStructure(exec->vm(), jsNull()), Vector<String>()); JSArray* array = constructEmptyArray(globalObject->globalExec(), 0); for (unsigned i = 1; i < exec->argumentCount(); ++i) array->putDirectIndex(globalObject->globalExec(), i - 1, exec->uncheckedArgument(i)); globalObject->putDirect( exec->vm(), Identifier(globalObject->globalExec(), "arguments"), array); JSValue exception; StopWatch stopWatch; stopWatch.start(); evaluate(globalObject->globalExec(), jscSource(script.data(), fileName), JSValue(), &exception); stopWatch.stop(); if (!!exception) { exec->vm().throwException(globalObject->globalExec(), exception); return JSValue::encode(jsUndefined()); } return JSValue::encode(jsNumber(stopWatch.getElapsedMS())); }
void BytecodeSequence::addSequenceProperties(ExecState* exec, JSObject* result) const { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSArray* header = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, void()); for (unsigned i = 0; i < m_header.size(); ++i) header->putDirectIndex(exec, i, jsString(exec, String::fromUTF8(m_header[i]))); result->putDirect(vm, exec->propertyNames().header, header); JSArray* sequence = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, void()); for (unsigned i = 0; i < m_sequence.size(); ++i) sequence->putDirectIndex(exec, i, m_sequence[i].toJS(exec)); result->putDirect(vm, exec->propertyNames().bytecode, sequence); }
static JSArray* getJSListenerFunctions(ExecState* exec, Document* document, const EventListenerInfo& listenerInfo) { JSArray* result = constructEmptyArray(exec, nullptr); size_t handlersCount = listenerInfo.eventListenerVector.size(); for (size_t i = 0, outputIndex = 0; i < handlersCount; ++i) { const JSEventListener* jsListener = JSEventListener::cast(listenerInfo.eventListenerVector[i].listener.get()); if (!jsListener) { ASSERT_NOT_REACHED(); continue; } // Hide listeners from other contexts. if (&jsListener->isolatedWorld() != ¤tWorld(exec)) continue; JSObject* function = jsListener->jsFunction(document); if (!function) continue; JSObject* listenerEntry = constructEmptyObject(exec); listenerEntry->putDirect(exec->vm(), Identifier::fromString(exec, "listener"), function); listenerEntry->putDirect(exec->vm(), Identifier::fromString(exec, "useCapture"), jsBoolean(listenerInfo.eventListenerVector[i].useCapture)); result->putDirectIndex(exec, outputIndex++, JSValue(listenerEntry)); } return result; }
JSValue JSInjectedScriptHost::iteratorEntries(ExecState* exec) { if (exec->argumentCount() < 1) return jsUndefined(); VM& vm = exec->vm(); JSValue iterator; JSValue value = exec->uncheckedArgument(0); if (JSMapIterator* mapIterator = jsDynamicCast<JSMapIterator*>(value)) iterator = mapIterator->clone(exec); else if (JSSetIterator* setIterator = jsDynamicCast<JSSetIterator*>(value)) iterator = setIterator->clone(exec); else if (JSStringIterator* stringIterator = jsDynamicCast<JSStringIterator*>(value)) iterator = stringIterator->clone(exec); else if (JSPropertyNameIterator* propertyNameIterator = jsDynamicCast<JSPropertyNameIterator*>(value)) { iterator = propertyNameIterator->clone(exec); if (UNLIKELY(vm.exception())) return JSValue(); } else { if (JSObject* iteratorObject = jsDynamicCast<JSObject*>(value)) { // Array Iterators are created in JS for performance reasons. Thus the only way to know we have one is to // look for a property that is unique to them. if (JSValue nextIndex = iteratorObject->getDirect(vm, vm.propertyNames->builtinNames().arrayIteratorNextIndexPrivateName())) iterator = cloneArrayIteratorObject(exec, vm, iteratorObject, nextIndex); } } if (!iterator) return jsUndefined(); unsigned numberToFetch = 5; JSValue numberToFetchArg = exec->argument(1); double fetchDouble = numberToFetchArg.toInteger(exec); if (fetchDouble >= 0) numberToFetch = static_cast<unsigned>(fetchDouble); JSArray* array = constructEmptyArray(exec, nullptr); if (UNLIKELY(vm.exception())) return jsUndefined(); for (unsigned i = 0; i < numberToFetch; ++i) { JSValue next = iteratorStep(exec, iterator); if (UNLIKELY(vm.exception())) break; if (next.isFalse()) break; JSValue nextValue = iteratorValue(exec, next); if (UNLIKELY(vm.exception())) break; JSObject* entry = constructEmptyObject(exec); entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), nextValue); array->putDirectIndex(exec, i, entry); } iteratorClose(exec, iterator); return array; }
void BytecodeSequence::addSequenceProperties(ExecState* exec, JSObject* result) const { VM& vm = exec->vm(); JSArray* header = constructEmptyArray(exec, 0); if (UNLIKELY(vm.exception())) return; for (unsigned i = 0; i < m_header.size(); ++i) header->putDirectIndex(exec, i, jsString(exec, String::fromUTF8(m_header[i]))); result->putDirect(vm, exec->propertyNames().header, header); JSArray* sequence = constructEmptyArray(exec, 0); if (UNLIKELY(vm.exception())) return; for (unsigned i = 0; i < m_sequence.size(); ++i) sequence->putDirectIndex(exec, i, m_sequence[i].toJS(exec)); result->putDirect(vm, exec->propertyNames().bytecode, sequence); }
JSValue Compilation::toJS(ExecState* exec) const { JSObject* result = constructEmptyObject(exec); result->putDirect(exec->vm(), exec->propertyNames().bytecodesID, jsNumber(m_bytecodes->id())); result->putDirect(exec->vm(), exec->propertyNames().compilationKind, jsString(exec, String::fromUTF8(toCString(m_kind)))); JSArray* profiledBytecodes = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_profiledBytecodes.size(); ++i) profiledBytecodes->putDirectIndex(exec, i, m_profiledBytecodes[i].toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().profiledBytecodes, profiledBytecodes); JSArray* descriptions = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_descriptions.size(); ++i) descriptions->putDirectIndex(exec, i, m_descriptions[i].toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().descriptions, descriptions); JSArray* counters = constructEmptyArray(exec, 0); for (auto it = m_counters.begin(), end = m_counters.end(); it != end; ++it) { JSObject* counterEntry = constructEmptyObject(exec); counterEntry->putDirect(exec->vm(), exec->propertyNames().origin, it->key.toJS(exec)); counterEntry->putDirect(exec->vm(), exec->propertyNames().executionCount, jsNumber(it->value->count())); counters->push(exec, counterEntry); } result->putDirect(exec->vm(), exec->propertyNames().counters, counters); JSArray* exitSites = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_osrExitSites.size(); ++i) exitSites->putDirectIndex(exec, i, m_osrExitSites[i].toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().osrExitSites, exitSites); JSArray* exits = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_osrExits.size(); ++i) exits->putDirectIndex(exec, i, m_osrExits[i].toJS(exec)); result->putDirect(exec->vm(), exec->propertyNames().osrExits, exits); result->putDirect(exec->vm(), exec->propertyNames().numInlinedGetByIds, jsNumber(m_numInlinedGetByIds)); result->putDirect(exec->vm(), exec->propertyNames().numInlinedPutByIds, jsNumber(m_numInlinedPutByIds)); result->putDirect(exec->vm(), exec->propertyNames().numInlinedCalls, jsNumber(m_numInlinedCalls)); result->putDirect(exec->vm(), exec->propertyNames().jettisonReason, jsString(exec, String::fromUTF8(toCString(m_jettisonReason)))); if (!m_additionalJettisonReason.isNull()) result->putDirect(exec->vm(), exec->propertyNames().additionalJettisonReason, jsString(exec, String::fromUTF8(m_additionalJettisonReason))); return result; }
JSValue OriginStack::toJS(ExecState* exec) const { JSArray* result = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_stack.size(); ++i) result->putDirectIndex(exec, i, m_stack[i].toJS(exec)); return result; }
JSValue OSRExitSite::toJS(ExecState* exec) const { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSArray* result = constructEmptyArray(exec, 0); RETURN_IF_EXCEPTION(scope, JSValue()); for (unsigned i = 0; i < m_codeAddresses.size(); ++i) result->putDirectIndex(exec, i, jsString(exec, toString(RawPointer(m_codeAddresses[i])))); return result; }
JSValue OSRExitSite::toJS(ExecState* exec) const { VM& vm = exec->vm(); JSArray* result = constructEmptyArray(exec, 0); if (UNLIKELY(vm.exception())) return jsUndefined(); for (unsigned i = 0; i < m_codeAddresses.size(); ++i) result->putDirectIndex(exec, i, jsString(exec, toString(RawPointer(m_codeAddresses[i])))); return result; }
EncodedJSValue JSC_HOST_CALL arrayConstructorOf(ExecState* exec) { ArgList args(exec); size_t length = args.size(); JSArray* result = constructEmptyArray(exec, nullptr, length); for (unsigned i = 0; i < length; i++) result->putDirectIndex(exec, i, args.at(i)); return JSValue::encode(result); }
JSValue OriginStack::toJS(ExecState* exec) const { VM& vm = exec->vm(); JSArray* result = constructEmptyArray(exec, 0); if (UNLIKELY(vm.exception())) return jsUndefined(); for (unsigned i = 0; i < m_stack.size(); ++i) result->putDirectIndex(exec, i, m_stack[i].toJS(exec)); return result; }
EncodedJSValue JSC_HOST_CALL moduleLoaderObjectRequestedModules(ExecState* exec) { JSModuleRecord* moduleRecord = jsDynamicCast<JSModuleRecord*>(exec->argument(0)); if (!moduleRecord) return JSValue::encode(constructEmptyArray(exec, nullptr)); JSArray* result = constructEmptyArray(exec, nullptr, moduleRecord->requestedModules().size()); size_t i = 0; for (auto& key : moduleRecord->requestedModules()) result->putDirectIndex(exec, i++, jsString(exec, key.get())); return JSValue::encode(result); }
EncodedJSValue JSC_HOST_CALL privateFuncSetIteratorNext(ExecState* exec) { ASSERT(jsDynamicCast<JSSetIterator*>(exec->thisValue())); JSSetIterator* iterator = jsCast<JSSetIterator*>(exec->thisValue()); JSValue result; if (iterator->next(exec, result)) { JSArray* resultArray = jsCast<JSArray*>(exec->uncheckedArgument(0)); resultArray->putDirectIndex(exec, 0, result); return JSValue::encode(jsBoolean(false)); } iterator->finish(); return JSValue::encode(jsBoolean(true)); }
JSValue Compilation::toJS(ExecState* exec) const { JSObject* result = constructEmptyObject(exec); result->putDirect(exec->globalData(), exec->propertyNames().bytecodesID, jsNumber(m_bytecodes->id())); result->putDirect(exec->globalData(), exec->propertyNames().compilationKind, jsString(exec, String::fromUTF8(toCString(m_kind)))); JSArray* profiledBytecodes = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_profiledBytecodes.size(); ++i) profiledBytecodes->putDirectIndex(exec, i, m_profiledBytecodes[i].toJS(exec)); result->putDirect(exec->globalData(), exec->propertyNames().profiledBytecodes, profiledBytecodes); JSArray* descriptions = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_descriptions.size(); ++i) descriptions->putDirectIndex(exec, i, m_descriptions[i].toJS(exec)); result->putDirect(exec->globalData(), exec->propertyNames().descriptions, descriptions); JSArray* counters = constructEmptyArray(exec, 0); HashMap<OriginStack, OwnPtr<ExecutionCounter> >::const_iterator end = m_counters.end(); for (HashMap<OriginStack, OwnPtr<ExecutionCounter> >::const_iterator iter = m_counters.begin(); iter != end; ++iter) { JSObject* counterEntry = constructEmptyObject(exec); counterEntry->putDirect(exec->globalData(), exec->propertyNames().origin, iter->key.toJS(exec)); counterEntry->putDirect(exec->globalData(), exec->propertyNames().executionCount, jsNumber(iter->value->count())); counters->push(exec, counterEntry); } result->putDirect(exec->globalData(), exec->propertyNames().counters, counters); JSArray* exitSites = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_osrExitSites.size(); ++i) exitSites->putDirectIndex(exec, i, m_osrExitSites[i].toJS(exec)); result->putDirect(exec->globalData(), exec->propertyNames().osrExitSites, exitSites); JSArray* exits = constructEmptyArray(exec, 0); for (unsigned i = 0; i < m_osrExits.size(); ++i) exits->putDirectIndex(exec, i, m_osrExits[i].toJS(exec)); result->putDirect(exec->globalData(), exec->propertyNames().osrExits, exits); return result; }
JSObject* IntlPluralRules::resolvedOptions(ExecState& exec) { VM& vm = exec.vm(); auto scope = DECLARE_THROW_SCOPE(vm); // 13.4.4 Intl.PluralRules.prototype.resolvedOptions () // https://tc39.github.io/ecma402/#sec-intl.pluralrules.prototype.resolvedoptions if (UNLIKELY(!m_initializedPluralRules)) { throwTypeError(&exec, scope, "Intl.PluralRules.prototype.resolvedOptions called on value that's not an object initialized as a PluralRules"_s); return nullptr; } JSObject* options = constructEmptyObject(&exec); options->putDirect(vm, vm.propertyNames->locale, jsNontrivialString(&exec, m_locale)); options->putDirect(vm, Identifier::fromString(&vm, "type"), jsNontrivialString(&exec, m_type == UPLURAL_TYPE_ORDINAL ? "ordinal"_s : "cardinal"_s)); options->putDirect(vm, Identifier::fromString(&vm, "minimumIntegerDigits"), jsNumber(m_minimumIntegerDigits)); options->putDirect(vm, Identifier::fromString(&vm, "minimumFractionDigits"), jsNumber(m_minimumFractionDigits)); options->putDirect(vm, Identifier::fromString(&vm, "maximumFractionDigits"), jsNumber(m_maximumFractionDigits)); if (m_minimumSignificantDigits) { options->putDirect(vm, Identifier::fromString(&vm, "minimumSignificantDigits"), jsNumber(m_minimumSignificantDigits.value())); options->putDirect(vm, Identifier::fromString(&vm, "maximumSignificantDigits"), jsNumber(m_maximumSignificantDigits.value())); } #if HAVE(ICU_PLURALRULES_KEYWORDS) JSGlobalObject* globalObject = exec.jsCallee()->globalObject(vm); JSArray* categories = JSArray::tryCreate(vm, globalObject->arrayStructureForIndexingTypeDuringAllocation(ArrayWithContiguous), 0); if (UNLIKELY(!categories)) { throwOutOfMemoryError(&exec, scope); return nullptr; } UErrorCode status = U_ZERO_ERROR; auto keywords = std::unique_ptr<UEnumeration, UEnumerationDeleter>(uplrules_getKeywords(m_pluralRules.get(), &status)); ASSERT(U_SUCCESS(status)); int32_t resultLength; // Category names are always ASCII, so use char[]. unsigned index = 0; while (const char* result = uenum_next(keywords.get(), &resultLength, &status)) { ASSERT(U_SUCCESS(status)); categories->putDirectIndex(&exec, index++, jsNontrivialString(&exec, String(result, resultLength))); RETURN_IF_EXCEPTION(scope, { }); } options->putDirect(vm, Identifier::fromString(&vm, "pluralCategories"), categories); #endif RELEASE_AND_RETURN(scope, options); }
JSValue JSInjectedScriptHost::iteratorEntries(ExecState* exec) { if (exec->argumentCount() < 1) return jsUndefined(); JSValue iterator; JSValue value = exec->uncheckedArgument(0); if (JSArrayIterator* arrayIterator = jsDynamicCast<JSArrayIterator*>(value)) iterator = arrayIterator->clone(exec); else if (JSMapIterator* mapIterator = jsDynamicCast<JSMapIterator*>(value)) iterator = mapIterator->clone(exec); else if (JSSetIterator* setIterator = jsDynamicCast<JSSetIterator*>(value)) iterator = setIterator->clone(exec); else if (JSStringIterator* stringIterator = jsDynamicCast<JSStringIterator*>(value)) iterator = stringIterator->clone(exec); else if (JSPropertyNameIterator* propertyNameIterator = jsDynamicCast<JSPropertyNameIterator*>(value)) iterator = propertyNameIterator->clone(exec); else return jsUndefined(); unsigned numberToFetch = 5; JSValue numberToFetchArg = exec->argument(1); double fetchDouble = numberToFetchArg.toInteger(exec); if (fetchDouble >= 0) numberToFetch = static_cast<unsigned>(fetchDouble); JSArray* array = constructEmptyArray(exec, nullptr); for (unsigned i = 0; i < numberToFetch; ++i) { JSValue next = iteratorStep(exec, iterator); if (exec->hadException()) break; if (next.isFalse()) break; JSValue nextValue = iteratorValue(exec, next); if (exec->hadException()) break; JSObject* entry = constructEmptyObject(exec); entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), nextValue); array->putDirectIndex(exec, i, entry); } iteratorClose(exec, iterator); return array; }
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); }
void finishCreation(JSGlobalData& globalData, const Vector<String>& arguments) { Base::finishCreation(globalData); addFunction(globalData, "debug", functionDebug, 1); addFunction(globalData, "describe", functionDescribe, 1); addFunction(globalData, "print", functionPrint, 1); addFunction(globalData, "quit", functionQuit, 0); addFunction(globalData, "gc", functionGC, 0); #ifndef NDEBUG addFunction(globalData, "dumpCallFrame", functionDumpCallFrame, 0); addFunction(globalData, "releaseExecutableMemory", functionReleaseExecutableMemory, 0); #endif addFunction(globalData, "version", functionVersion, 1); addFunction(globalData, "run", functionRun, 1); addFunction(globalData, "load", functionLoad, 1); addFunction(globalData, "checkSyntax", functionCheckSyntax, 1); addFunction(globalData, "jscStack", functionJSCStack, 1); #if !defined(__LB_SHELL__) addFunction(globalData, "readline", functionReadline, 0); #endif addFunction(globalData, "preciseTime", functionPreciseTime, 0); #if ENABLE(SAMPLING_FLAGS) addFunction(globalData, "setSamplingFlags", functionSetSamplingFlags, 1); addFunction(globalData, "clearSamplingFlags", functionClearSamplingFlags, 1); #endif addConstructableFunction(globalData, "Uint8Array", constructJSUint8Array, 1); addConstructableFunction(globalData, "Uint8ClampedArray", constructJSUint8ClampedArray, 1); addConstructableFunction(globalData, "Uint16Array", constructJSUint16Array, 1); addConstructableFunction(globalData, "Uint32Array", constructJSUint32Array, 1); addConstructableFunction(globalData, "Int8Array", constructJSInt8Array, 1); addConstructableFunction(globalData, "Int16Array", constructJSInt16Array, 1); addConstructableFunction(globalData, "Int32Array", constructJSInt32Array, 1); addConstructableFunction(globalData, "Float32Array", constructJSFloat32Array, 1); addConstructableFunction(globalData, "Float64Array", constructJSFloat64Array, 1); JSArray* array = constructEmptyArray(globalExec(), 0); for (size_t i = 0; i < arguments.size(); ++i) array->putDirectIndex(globalExec(), i, jsString(globalExec(), arguments[i])); putDirect(globalData, Identifier(globalExec(), "arguments"), array); }
static EncodedJSValue JSC_HOST_CALL promiseAllCountdownFunction(ExecState* exec) { JSValue x = exec->argument(0); VM& vm = exec->vm(); JSObject* F = exec->callee(); // 1. Let 'index' be the value of F's [[Index]] internal slot. uint32_t index = F->get(exec, vm.propertyNames->indexPrivateName).asUInt32(); // 2. Let 'values' be the value of F's [[Values]] internal slot.. JSArray* values = jsCast<JSArray*>(F->get(exec, vm.propertyNames->valuesPrivateName)); // 3. Let 'deferred' be the value of F's [[Deferred]] internal slot. JSPromiseDeferred* deferred = jsCast<JSPromiseDeferred*>(F->get(exec, vm.propertyNames->deferredPrivateName)); // 4. Let 'countdownHolder' be the value of F's [[CountdownHolder]] internal slot. NumberObject* countdownHolder = jsCast<NumberObject*>(F->get(exec, vm.propertyNames->countdownHolderPrivateName)); // 5. Let 'result' be the result of calling the [[DefineOwnProperty]] internal method // of 'values' with arguments 'index' and Property Descriptor { [[Value]]: x, // [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true }. values->putDirectIndex(exec, index, x); // 6. RejectIfAbrupt(result, deferred). if (exec->hadException()) abruptRejection(exec, deferred); // 7. Set countdownHolder.[[Countdown]] to countdownHolder.[[Countdown]] - 1. uint32_t newCountdownValue = countdownHolder->internalValue().asUInt32() - 1; countdownHolder->setInternalValue(vm, JSValue(newCountdownValue)); // 8. If countdownHolder.[[Countdown]] is 0, if (!newCountdownValue) { // i. Return the result of calling the [[Call]] internal method of deferred.[[Resolve]] // with undefined as thisArgument and a List containing 'values' as argumentsList. performDeferredResolve(exec, deferred, values); } // 9. Return. return JSValue::encode(jsUndefined()); }
static void addUsagesToJSON(ExecState* exec, JSObject* json, CryptoKeyUsage usages) { JSArray* keyOps = constructEmptyArray(exec, 0, exec->lexicalGlobalObject(), 0); unsigned index = 0; if (usages & CryptoKeyUsageSign) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("sign"))); if (usages & CryptoKeyUsageVerify) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("verify"))); if (usages & CryptoKeyUsageEncrypt) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("encrypt"))); if (usages & CryptoKeyUsageDecrypt) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("decrypt"))); if (usages & CryptoKeyUsageWrapKey) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("wrapKey"))); if (usages & CryptoKeyUsageUnwrapKey) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("unwrapKey"))); if (usages & CryptoKeyUsageDeriveKey) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("deriveKey"))); if (usages & CryptoKeyUsageDeriveBits) keyOps->putDirectIndex(exec, index++, jsString(exec, ASCIILiteral("deriveBits"))); json->putDirect(exec->vm(), Identifier(exec, "key_ops"), keyOps); }
JSValue idbKeyDataToJSValue(JSC::ExecState& exec, const IDBKeyData& keyData) { if (keyData.isNull()) return jsUndefined(); Locker<JSLock> locker(exec.vm().apiLock()); switch (keyData.type()) { case KeyType::Array: { const Vector<IDBKeyData>& inArray = keyData.array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(&exec, 0, exec.lexicalGlobalObject(), size); for (size_t i = 0; i < size; ++i) { auto& arrayKey = inArray.at(i); outArray->putDirectIndex(&exec, i, idbKeyDataToJSValue(exec, arrayKey)); } return JSValue(outArray); } case KeyType::String: return jsStringWithCache(&exec, keyData.string()); case KeyType::Date: return jsDateOrNull(&exec, keyData.date()); case KeyType::Number: return jsNumber(keyData.number()); case KeyType::Min: case KeyType::Max: case KeyType::Invalid: ASSERT_NOT_REACHED(); return jsUndefined(); } ASSERT_NOT_REACHED(); return jsUndefined(); }