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 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); }
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; }
EncodedJSValue JSC_HOST_CALL webAssemblyModuleImports(ExecState* exec) { VM& vm = exec->vm(); auto* globalObject = exec->lexicalGlobalObject(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0)); if (!module) return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Module.imports called with non WebAssembly.Module argument"_s))); JSArray* result = constructEmptyArray(exec, nullptr, globalObject); RETURN_IF_EXCEPTION(throwScope, { }); const auto& imports = module->moduleInformation().imports; if (imports.size()) { Identifier module = Identifier::fromString(exec, "module"); Identifier name = Identifier::fromString(exec, "name"); Identifier kind = Identifier::fromString(exec, "kind"); for (const Wasm::Import& imp : imports) { JSObject* obj = constructEmptyObject(exec); RETURN_IF_EXCEPTION(throwScope, { }); obj->putDirect(vm, module, jsString(exec, String::fromUTF8(imp.module))); obj->putDirect(vm, name, jsString(exec, String::fromUTF8(imp.field))); obj->putDirect(vm, kind, jsString(exec, String(makeString(imp.kind)))); result->push(exec, obj); RETURN_IF_EXCEPTION(throwScope, { }); } } return JSValue::encode(result); }
EncodedJSValue JSC_HOST_CALL webAssemblyModuleCustomSections(ExecState* exec) { VM& vm = exec->vm(); auto* globalObject = exec->lexicalGlobalObject(); auto throwScope = DECLARE_THROW_SCOPE(vm); JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(vm, exec->argument(0)); if (!module) return JSValue::encode(throwException(exec, throwScope, createTypeError(exec, "WebAssembly.Module.customSections called with non WebAssembly.Module argument"_s))); const String sectionNameString = exec->argument(1).getString(exec); RETURN_IF_EXCEPTION(throwScope, { }); JSArray* result = constructEmptyArray(exec, nullptr, globalObject); RETURN_IF_EXCEPTION(throwScope, { }); const auto& customSections = module->moduleInformation().customSections; for (const Wasm::CustomSection& section : customSections) { if (String::fromUTF8(section.name) == sectionNameString) { auto buffer = ArrayBuffer::tryCreate(section.payload.data(), section.payload.size()); if (!buffer) return JSValue::encode(throwException(exec, throwScope, createOutOfMemoryError(exec))); result->push(exec, JSArrayBuffer::create(vm, globalObject->arrayBufferStructure(ArrayBufferSharingMode::Default), WTFMove(buffer))); RETURN_IF_EXCEPTION(throwScope, { }); } } return JSValue::encode(result); }
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 toJS(ExecState* exec, JSDOMGlobalObject* globalObject, IDBKey* key) { if (!key) return jsNull(); switch (key->type()) { case IDBKey::ArrayType: { const IDBKey::KeyArray& inArray = key->array(); size_t size = inArray.size(); JSArray* outArray = constructEmptyArray(exec, globalObject, size); JSGlobalData& globalData = exec->globalData(); for (size_t i = 0; i < size; ++i) { IDBKey* arrayKey = inArray.at(i).get(); outArray->initializeIndex(globalData, i, toJS(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 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 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 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); }
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; }
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; }
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); }
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; }
JSObject* constructArrayWithSizeQuirk(ExecState* exec, ArrayAllocationProfile* profile, JSGlobalObject* globalObject, JSValue length) { if (!length.isNumber()) return constructArray(exec, profile, globalObject, &length, 1); uint32_t n = length.toUInt32(exec); if (n != length.toNumber(exec)) return exec->vm().throwException(exec, createRangeError(exec, ASCIILiteral("Array size is not a small enough positive integer."))); return constructEmptyArray(exec, profile, globalObject, n); }
JSValue JSMessageEvent::ports(ExecState* exec) const { MessagePortArray* ports = static_cast<MessageEvent*>(impl())->ports(); if (!ports) return constructEmptyArray(exec, globalObject()); MarkedArgumentBuffer list; for (size_t i = 0; i < ports->size(); i++) list.append(toJS(exec, globalObject(), (*ports)[i].get())); return constructArray(exec, globalObject(), list); }
JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source) { JSGlobalData* globalData = &exec->globalData(); addErrorInfo(globalData, error, line, source); JSArray* stack = constructEmptyArray(exec); CallFrame* frame = exec; JSObject* stackFrame; CodeBlock* codeBlock; UString sourceURL; UString functionName; ReturnAddressPtr pc; while (!frame->hasHostCallFrameFlag()) { stackFrame = constructEmptyObject(exec); codeBlock = frame->codeBlock(); // sourceURL sourceURL = codeBlock->ownerExecutable()->sourceURL(); stackFrame->putWithAttributes( globalData, Identifier(globalData, sourceURLPropertyName), jsString(globalData, sourceURL), ReadOnly | DontDelete ); // line if (frame != exec) { line = codeBlock->lineNumberForBytecodeOffset(codeBlock->bytecodeOffset(pc)); } stackFrame->putWithAttributes( globalData, Identifier(globalData, linePropertyName), jsNumber(line), ReadOnly | DontDelete ); // function JSObject* function = frame->callee(); if (function && function->inherits(&JSFunction::s_info)) { functionName = asFunction(function)->calculatedDisplayName(exec); stackFrame->putWithAttributes( globalData, Identifier(globalData, functionPropertyName), jsString(globalData, functionName), ReadOnly | DontDelete ); } stack->push(exec, JSValue(stackFrame)); pc = frame->returnPC(); frame = frame->callerFrame(); } error->putWithAttributes(globalData, Identifier(globalData, stackPropertyName), stack, ReadOnly | DontDelete); return error; }
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; }
JSArray* JSBoundFunction::boundArgsCopy(ExecState* exec) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); JSArray* result = constructEmptyArray(exec, nullptr, globalObject()); RETURN_IF_EXCEPTION(scope, nullptr); for (unsigned i = 0; i < m_boundArgs->length(); ++i) { result->push(exec, m_boundArgs->getIndexQuickly(i)); RETURN_IF_EXCEPTION(scope, nullptr); } return result; }
// FIXME: Use the enumeration cache. EncodedJSValue JSC_HOST_CALL objectConstructorKeys(ExecState* exec) { if (!exec->argument(0).isObject()) return throwVMError(exec, createTypeError(exec, ASCIILiteral("Requested keys of a value that is not an object."))); PropertyNameArray properties(exec); asObject(exec->argument(0))->methodTable()->getOwnPropertyNames(asObject(exec->argument(0)), exec, properties, ExcludeDontEnumProperties); JSArray* keys = constructEmptyArray(exec, 0); size_t numProperties = properties.size(); for (size_t i = 0; i < numProperties; i++) keys->push(exec, jsOwnedString(exec, properties[i].string())); return JSValue::encode(keys); }
// FIXME: Use the enumeration cache. JSValue JSC_HOST_CALL objectConstructorKeys(ExecState* exec, JSObject*, JSValue, const ArgList& args) { if (!args.at(0).isObject()) return throwError(exec, TypeError, "Requested keys of a value that is not an object."); PropertyNameArray properties(exec); asObject(args.at(0))->getOwnPropertyNames(exec, properties); JSArray* keys = constructEmptyArray(exec); size_t numProperties = properties.size(); for (size_t i = 0; i < numProperties; i++) keys->push(exec, jsOwnedString(exec, properties[i].ustring())); return keys; }
// FIXME: Use the enumeration cache. EncodedJSValue JSC_HOST_CALL objectConstructorGetOwnPropertyNames(ExecState* exec) { if (!exec->argument(0).isObject()) return throwVMError(exec, createTypeError(exec, "Requested property names of a value that is not an object.")); PropertyNameArray properties(exec); asObject(exec->argument(0))->getOwnPropertyNames(exec, properties, IncludeDontEnumProperties); JSArray* names = constructEmptyArray(exec); size_t numProperties = properties.size(); for (size_t i = 0; i < numProperties; i++) names->push(exec, jsOwnedString(exec, properties[i].ustring())); return JSValue::encode(names); }
JSArray* ShadowChicken::functionsOnStack(ExecState* exec) { JSArray* result = constructEmptyArray(exec, 0); iterate( exec->vm(), exec, [&] (const Frame& frame) -> bool { result->push(exec, frame.callee); return true; }); return result; }