static bool GCZeal(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); if (args.length() > 2) { RootedObject callee(cx, &args.callee()); ReportUsageError(cx, callee, "Too many arguments"); return false; } uint32_t zeal; if (!ToUint32(cx, args.get(0), &zeal)) return false; uint32_t frequency = JS_DEFAULT_ZEAL_FREQ; if (args.length() >= 2) { if (!ToUint32(cx, args.get(1), &frequency)) return false; } JS_SetGCZeal(cx, (uint8_t)zeal, frequency); args.rval().setUndefined(); return true; }
static bool InstantiateModule(JSContext* cx, unsigned argc, Value* vp) { MOZ_ASSERT(cx->runtime()->options().wasm()); CallArgs args = CallArgsFromVp(argc, vp); if (!args.get(0).isObject() || !args.get(0).toObject().is<TypedArrayObject>()) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_BUF_ARG); return false; } Rooted<TypedArrayObject*> code(cx, &args[0].toObject().as<TypedArrayObject>()); if (code->isSharedMemory()) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_BUF_ARG); return false; } RootedObject importObj(cx); if (!args.get(1).isUndefined()) { if (!args.get(1).isObject()) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_WASM_BAD_IMPORT_ARG); return false; } importObj = &args[1].toObject(); } RootedObject exportObj(cx); if (!Eval(cx, code, importObj, &exportObj)) return false; args.rval().setObject(*exportObj); return true; }
bool js::math_pow(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); return math_pow_handle(cx, args.get(0), args.get(1), args.rval()); }
static bool ExchangeOrStore(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); HandleValue objv = args.get(0); HandleValue idxv = args.get(1); HandleValue valv = args.get(2); MutableHandleValue r = args.rval(); Rooted<TypedArrayObject*> view(cx, nullptr); if (!GetSharedTypedArray(cx, objv, &view)) return false; uint32_t offset; if (!GetTypedArrayIndex(cx, idxv, view, &offset)) return false; double integerValue; if (!ToInteger(cx, valv, &integerValue)) return false; bool badType = false; int32_t result = ExchangeOrStore<op>(view->type(), JS::ToInt32(integerValue), view->viewDataShared(), offset, &badType); if (badType) return ReportBadArrayType(cx); if (op == DoStore) r.setNumber(integerValue); else if (view->type() == Scalar::Uint32) r.setNumber((double)(uint32_t)result); else r.setInt32(result); return true; }
// ES6 rev 24 (2014 Apr 27) 19.4.1.1 and 19.4.1.2 bool SymbolObject::construct(JSContext *cx, unsigned argc, Value *vp) { // According to a note in the draft standard, "Symbol has ordinary // [[Construct]] behaviour but the definition of its @@create method causes // `new Symbol` to throw a TypeError exception." We do not support @@create // yet, so just throw a TypeError. CallArgs args = CallArgsFromVp(argc, vp); if (args.isConstructing()) { JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_NOT_CONSTRUCTOR, "Symbol"); return false; } // steps 1-3 RootedString desc(cx); if (!args.get(0).isUndefined()) { desc = ToString(cx, args.get(0)); if (!desc) return false; } // step 4 RootedSymbol symbol(cx, JS::Symbol::new_(cx, JS::SymbolCode::UniqueSymbol, desc)); if (!symbol) return false; args.rval().setSymbol(symbol); return true; }
/* ES6 26.1.13 Reflect.set(target, propertyKey, V [, receiver]) */ static bool Reflect_set(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); // Step 1. RootedObject target(cx, NonNullObject(cx, args.get(0))); if (!target) return false; // Steps 2-3. RootedValue propertyKey(cx, args.get(1)); RootedId key(cx); if (!ToPropertyKey(cx, propertyKey, &key)) return false; // Step 4. RootedValue receiver(cx, args.length() > 3 ? args[3] : args.get(0)); // Step 5. ObjectOpResult result; RootedValue value(cx, args.get(2)); if (!SetProperty(cx, target, key, value, receiver, result)) return false; args.rval().setBoolean(bool(result)); return true; }
/* * ES6 26.1.3 Reflect.setPrototypeOf(target, proto) * * The specification is not quite similar enough to Object.setPrototypeOf to * share code. */ static bool Reflect_setPrototypeOf(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); // Step 1. RootedObject obj(cx, NonNullObject(cx, args.get(0))); if (!obj) return false; // Step 2. if (!args.get(1).isObjectOrNull()) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_NOT_EXPECTED_TYPE, "Reflect.setPrototypeOf", "an object or null", InformalValueTypeName(args.get(1))); return false; } RootedObject proto(cx, args.get(1).toObjectOrNull()); // Step 4. ObjectOpResult result; if (!SetPrototype(cx, obj, proto, result)) return false; args.rval().setBoolean(bool(result)); return true; }
/* ES6 26.1.3 Reflect.defineProperty(target, propertyKey, attributes) */ static bool Reflect_defineProperty(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); // Step 1. RootedObject obj(cx, NonNullObject(cx, args.get(0))); if (!obj) return false; // Steps 2-3. RootedValue propertyKey(cx, args.get(1)); RootedId key(cx); if (!ToPropertyKey(cx, propertyKey, &key)) return false; // Steps 4-5. Rooted<PropertyDescriptor> desc(cx); if (!ToPropertyDescriptor(cx, args.get(2), true, &desc)) return false; // Step 6. ObjectOpResult result; if (!DefineProperty(cx, obj, key, desc, result)) return false; args.rval().setBoolean(bool(result)); return true; }
static bool WasmEval(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); RootedObject callee(cx, &args.callee()); if (args.length() < 1 || args.length() > 2) { ReportUsageError(cx, callee, "Wrong number of arguments"); return false; } if (!args[0].isObject() || !args[0].toObject().is<ArrayBufferObject>()) { ReportUsageError(cx, callee, "First argument must be an ArrayBuffer"); return false; } RootedObject importObj(cx); if (!args.get(1).isUndefined()) { if (!args.get(1).isObject()) { ReportUsageError(cx, callee, "Second argument, if present, must be an Object"); return false; } importObj = &args[1].toObject(); } Rooted<ArrayBufferObject*> code(cx, &args[0].toObject().as<ArrayBufferObject>()); RootedObject exportObj(cx); if (!Eval(cx, code, importObj, &exportObj)) return false; args.rval().setObject(*exportObj); return true; }
/* ES6 B.2.5.1. */ MOZ_ALWAYS_INLINE bool regexp_compile_impl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsRegExpObject(args.thisv())); Rooted<RegExpObject*> regexp(cx, &args.thisv().toObject().as<RegExpObject>()); // Step 3. RootedValue patternValue(cx, args.get(0)); ESClassValue cls; if (!GetClassOfValue(cx, patternValue, &cls)) return false; if (cls == ESClass_RegExp) { // Step 3a. if (args.hasDefined(1)) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_NEWREGEXP_FLAGGED); return false; } // Beware! |patternObj| might be a proxy into another compartment, so // don't assume |patternObj.is<RegExpObject>()|. For the same reason, // don't reuse the RegExpShared below. RootedObject patternObj(cx, &patternValue.toObject()); RootedAtom sourceAtom(cx); RegExpFlag flags; { // Step 3b. RegExpGuard g(cx); if (!RegExpToShared(cx, patternObj, &g)) return false; sourceAtom = g->getSource(); flags = g->getFlags(); } // Step 5, minus lastIndex zeroing. regexp->initIgnoringLastIndex(sourceAtom, flags); } else { // Step 4. RootedValue P(cx, patternValue); RootedValue F(cx, args.get(1)); // Step 5, minus lastIndex zeroing. if (!RegExpInitializeIgnoringLastIndex(cx, regexp, P, F, UseRegExpStatics)) return false; } if (regexp->lookupPure(cx->names().lastIndex)->writable()) { regexp->zeroLastIndex(cx); } else { RootedValue zero(cx, Int32Value(0)); if (!SetProperty(cx, regexp, cx->names().lastIndex, zero)) return false; } args.rval().setObject(*regexp); return true; }
/** * Sends command to the remote client. */ static JSBool JSR_fn_sendCommand( JSContext *cx, unsigned argc, Value *vp ) { if( argc != 2 ) { JS_ReportError( cx, "Function should be called with exactly two arguments." ); return JS_FALSE; } Logger &log = LoggerFactory::getLogger(); // Gets engine for context. JSDebuggerEngine *engine = JSDebuggerEngine::getEngineForContext(cx); if( !engine ) { log.error("JSR_fn_sendCommand: There is no engine installed for given context." ); JS_ReportError( cx, "There is no engine installed for given context." ); return JS_FALSE; } CallArgs args = CallArgsFromVp(argc, vp); int clientId = args.get(0).toInt32(); // Convert object into UTF-16 string using standard stringify logic. Value jsCommandStr = args.get(1); MozJSUtils jsUtils(cx); string commandStr; if( !jsUtils.stringifyToUtf8( jsCommandStr, commandStr ) ) { if( jsUtils.getLastError() == MozJSUtils::ERROR_JS_STRINGIFY_FAILED ) { log.error("JSR_fn_sendCommand: Cannot stringify debugger command."); if( !JS_IsExceptionPending( cx ) ) { // Only if there is no exception from the stringify. JS_ReportError( cx, "Cannot stringify debugger command." ); } return JS_FALSE; } else if( jsUtils.getLastError() == MozJSUtils::ERROR_CHAR_ENCODING_FAILED ) { // Only if there is no exception from the stringify. log.error("JSR_fn_sendCommand: Cannot convert command string into UTF-8." ); JS_ReportError( cx, "Cannot convert command string into UTF-8." ); return JS_FALSE; } else { // Unknown error. log.error("JSR_fn_sendCommand: Stringify failed with error: %d", jsUtils.getLastError() ); JS_ReportError( cx, "Stringify failed with unsupported error code." ); return JS_FALSE; } } // Send command using provided handler. if( !engine->getEngineEventHandler().sendCommand( clientId, engine->getContextId(), commandStr ) ) { log.warn( "JSR_fn_sendCommand: Engine couldn't send a command for client: %d", clientId ); if( !JS_IsExceptionPending( cx ) ) { JS_ReportError( cx, "Cannot send command, probably client has already been disconnected." ); } return JS_FALSE; } return JS_TRUE; }
bool SharedArrayBufferObject::fun_isView(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().setBoolean(args.get(0).isObject() && JS_IsSharedTypedArrayObject(&args.get(0).toObject())); return true; }
/* ES6 draft 15.2.3.16 */ static bool obj_is(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); bool same; if (!SameValue(cx, args.get(0), args.get(1), &same)) return false; args.rval().setBoolean(same); return true; }
// ES6 draft rev27 (2014/08/24) 19.1.2.17 Object.seal(O) static bool obj_seal(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().set(args.get(0)); // Step 1. if (!args.get(0).isObject()) return true; // Steps 2-5. RootedObject obj(cx, &args.get(0).toObject()); return SetIntegrityLevel(cx, obj, IntegrityLevel::Sealed); }
// ES6 20141014 draft 19.1.2.15 Object.preventExtensions(O) static bool obj_preventExtensions(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); args.rval().set(args.get(0)); // Step 1. if (!args.get(0).isObject()) return true; // Steps 2-5. RootedObject obj(cx, &args.get(0).toObject()); return PreventExtensions(cx, obj); }
bool SimdTypeDescr::call(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); Rooted<SimdTypeDescr*> descr(cx, &args.callee().as<SimdTypeDescr>()); if (args.length() == 1) { // SIMD type used as a coercion if (!CheckVectorObject(args[0], descr->type())) { JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_SIMD_NOT_A_VECTOR); return false; } args.rval().setObject(args[0].toObject()); return true; } Rooted<TypedObject*> result(cx, TypedObject::createZeroed(cx, descr, 0)); if (!result) return false; switch (descr->type()) { case SimdTypeDescr::TYPE_INT32: { int32_t *mem = reinterpret_cast<int32_t*>(result->typedMem()); for (unsigned i = 0; i < 4; i++) { if (!ToInt32(cx, args.get(i), &mem[i])) return false; } break; } case SimdTypeDescr::TYPE_FLOAT32: { float *mem = reinterpret_cast<float*>(result->typedMem()); for (unsigned i = 0; i < 4; i++) { if (!RoundFloat32(cx, args.get(i), &mem[i])) return false; } break; } case SimdTypeDescr::TYPE_FLOAT64: { double *mem = reinterpret_cast<double*>(result->typedMem()); for (unsigned i = 0; i < 2; i++) { if (!ToNumber(cx, args.get(i), &mem[i])) return false; } break; } } args.rval().setObject(*result); return true; }
// ES2018 draft rev 7a2d3f053ecc2336fc19f377c55d52d78b11b296 // 23.4.3.3 WeakSet.prototype.delete ( value ) MOZ_ALWAYS_INLINE bool WeakSet_delete_impl(JSContext* cx, const CallArgs& args) { MOZ_ASSERT(IsWeakSet(args.thisv())); // Step 4. if (!args.get(0).isObject()) { args.rval().setBoolean(false); return true; } // Steps 5-6. if (ObjectValueMap* map = args.thisv().toObject().as<WeakSetObject>().getMap()) { JSObject* value = &args[0].toObject(); if (ObjectValueMap::Ptr ptr = map->lookup(value)) { map->remove(ptr); args.rval().setBoolean(true); return true; } } // Step 7. args.rval().setBoolean(false); return true; }
static bool ChangeHeap(JSContext *cx, AsmJSModule &module, CallArgs args) { HandleValue bufferArg = args.get(0); if (!IsArrayBuffer(bufferArg)) { ReportIncompatible(cx, args); return false; } Rooted<ArrayBufferObject*> newBuffer(cx, &bufferArg.toObject().as<ArrayBufferObject>()); uint32_t heapLength = newBuffer->byteLength(); if (heapLength & module.heapLengthMask() || heapLength < module.minHeapLength() || heapLength > module.maxHeapLength()) { args.rval().set(BooleanValue(false)); return true; } if (!module.hasArrayView()) { args.rval().set(BooleanValue(true)); return true; } MOZ_ASSERT(IsValidAsmJSHeapLength(heapLength)); MOZ_ASSERT(!IsDeprecatedAsmJSHeapLength(heapLength)); if (!ArrayBufferObject::prepareForAsmJS(cx, newBuffer, module.usesSignalHandlersForOOB())) return false; args.rval().set(BooleanValue(module.changeHeap(newBuffer, cx))); return true; }
/** * 12.2.1 Intl.DateTimeFormat([ locales [, options]]) * * ES2017 Intl draft rev 94045d234762ad107a3d09bb6f7381a65f1a2f9b */ static bool DateTimeFormat(JSContext* cx, const CallArgs& args, bool construct, DateTimeFormatOptions dtfOptions) { // Step 1 (Handled by OrdinaryCreateFromConstructor fallback code). // Step 2 (Inlined 9.1.14, OrdinaryCreateFromConstructor). RootedObject proto(cx); if (!GetPrototypeFromBuiltinConstructor(cx, args, &proto)) return false; if (!proto) { proto = GlobalObject::getOrCreateDateTimeFormatPrototype(cx, cx->global()); if (!proto) return false; } Rooted<DateTimeFormatObject*> dateTimeFormat(cx); dateTimeFormat = NewObjectWithGivenProto<DateTimeFormatObject>(cx, proto); if (!dateTimeFormat) return false; dateTimeFormat->setReservedSlot(DateTimeFormatObject::INTERNALS_SLOT, NullValue()); dateTimeFormat->setReservedSlot(DateTimeFormatObject::UDATE_FORMAT_SLOT, PrivateValue(nullptr)); RootedValue thisValue(cx, construct ? ObjectValue(*dateTimeFormat) : args.thisv()); HandleValue locales = args.get(0); HandleValue options = args.get(1); // Step 3. return intl::LegacyInitializeObject(cx, dateTimeFormat, cx->names().InitializeDateTimeFormat, thisValue, locales, options, dtfOptions, args.rval()); }
// ES2017 draft rev 6390c2f1b34b309895d31d8c0512eac8660a0210 // 24.2.2.1 SharedArrayBuffer( length ) bool SharedArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); // Step 1. if (!ThrowIfNotConstructing(cx, args, "SharedArrayBuffer")) return false; // Step 2. uint64_t byteLength; if (!ToIndex(cx, args.get(0), &byteLength)) return false; // Step 3 (Inlined 24.2.1.1 AllocateSharedArrayBuffer). // 24.2.1.1, step 1 (Inlined 9.1.14 OrdinaryCreateFromConstructor). RootedObject proto(cx); RootedObject newTarget(cx, &args.newTarget().toObject()); if (!GetPrototypeFromConstructor(cx, newTarget, &proto)) return false; // 24.2.1.1, step 3 (Inlined 6.2.7.2 CreateSharedByteDataBlock, step 2). // Refuse to allocate too large buffers, currently limited to ~2 GiB. if (byteLength > INT32_MAX) { JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_LENGTH); return false; } // 24.2.1.1, steps 1 and 4-6. JSObject* bufobj = New(cx, uint32_t(byteLength), proto); if (!bufobj) return false; args.rval().setObject(*bufobj); return true; }
bool SharedArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); if (!ThrowIfNotConstructing(cx, args, "SharedArrayBuffer")) return false; // Bugs 1068458, 1161298: Limit length to 2^31-1. uint32_t length; bool overflow_unused; if (!ToLengthClamped(cx, args.get(0), &length, &overflow_unused) || length > INT32_MAX) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_LENGTH); return false; } RootedObject proto(cx); RootedObject newTarget(cx, &args.newTarget().toObject()); if (!GetPrototypeFromConstructor(cx, newTarget, &proto)) return false; JSObject* bufobj = New(cx, length, proto); if (!bufobj) return false; args.rval().setObject(*bufobj); return true; }
// ES6 rev 25 (2014 May 22) 19.4.2.7 bool SymbolObject::keyFor(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); // step 1 HandleValue arg = args.get(0); if (!arg.isSymbol()) { js_ReportValueErrorFlags(cx, JSREPORT_ERROR, JSMSG_UNEXPECTED_TYPE, JSDVG_SEARCH_STACK, arg, js::NullPtr(), "not a symbol", nullptr); return false; } // step 2 if (arg.toSymbol()->code() == JS::SymbolCode::InSymbolRegistry) { #ifdef DEBUG RootedString desc(cx, arg.toSymbol()->description()); MOZ_ASSERT(Symbol::for_(cx, desc) == arg.toSymbol()); #endif args.rval().setString(arg.toSymbol()->description()); return true; } // step 3: omitted // step 4 args.rval().setUndefined(); return true; }
bool MapObject::construct(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); if (!ThrowIfNotConstructing(cx, args, "Map")) return false; RootedObject proto(cx); RootedObject newTarget(cx, &args.newTarget().toObject()); if (!GetPrototypeFromConstructor(cx, newTarget, &proto)) return false; Rooted<MapObject*> obj(cx, MapObject::create(cx, proto)); if (!obj) return false; if (!args.get(0).isNullOrUndefined()) { FixedInvokeArgs<1> args2(cx); args2[0].set(args[0]); RootedValue thisv(cx, ObjectValue(*obj)); if (!CallSelfHostedFunction(cx, cx->names().MapConstructorInit, thisv, args2, args2.rval())) return false; } args.rval().setObject(*obj); return true; }
static bool GCParameter(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); JSString *str = ToString(cx, args.get(0)); if (!str) return false; JSFlatString *flatStr = JS_FlattenString(cx, str); if (!flatStr) return false; size_t paramIndex = 0; for (;; paramIndex++) { if (paramIndex == ArrayLength(paramMap)) { JS_ReportError(cx, "the first argument must be one of " GC_PARAMETER_ARGS_LIST); return false; } if (JS_FlatStringEqualsAscii(flatStr, paramMap[paramIndex].name)) break; } JSGCParamKey param = paramMap[paramIndex].param; // Request mode. if (args.length() == 1) { uint32_t value = JS_GetGCParameter(cx->runtime(), param); args.rval().setNumber(value); return true; } if (param == JSGC_NUMBER || param == JSGC_BYTES) { JS_ReportError(cx, "Attempt to change read-only parameter %s", paramMap[paramIndex].name); return false; } uint32_t value; if (!ToUint32(cx, args[1], &value)) { JS_ReportError(cx, "the second argument must be convertable to uint32_t " "with non-zero value"); return false; } if (param == JSGC_MAX_BYTES) { uint32_t gcBytes = JS_GetGCParameter(cx->runtime(), JSGC_BYTES); if (value < gcBytes) { JS_ReportError(cx, "attempt to set maxBytes to the value less than the current " "gcBytes (%u)", gcBytes); return false; } } JS_SetGCParameter(cx->runtime(), param, value); args.rval().setUndefined(); return true; }
static bool Serialize(JSContext *cx, unsigned argc, jsval *vp) { CallArgs args = CallArgsFromVp(argc, vp); JSAutoStructuredCloneBuffer clonebuf; if (!clonebuf.write(cx, args.get(0), args.get(1))) return false; RootedObject obj(cx, CloneBufferObject::Create(cx, &clonebuf)); if (!obj) return false; args.rval().setObject(*obj); return true; }
// Sends command to a debugger engine. static JSBool JS_dbgFacade_fn_sendCommand( JSContext *context, unsigned int argc, Value *vp ) { CallArgs args = CallArgsFromVp(argc, vp); if( argc != 1 ) { JS_ReportError( context, "Bad args!" ); return JS_FALSE; } MozJSUtils jsUtils(context); DebuggeeScript *dbgScript = static_cast<DebuggeeScript*>(JS_GetContextPrivate( context )); if( !dbgScript ) { JS_ReportError( context, "There is no debuggee in the context's private data." ); return JS_FALSE; } string command; if( !jsUtils.stringifyToUtf8( args.get(0), command ) ) { JS_ReportError( context, "Cannot stringify command." ); return JS_FALSE; } DebuggerStateHint hint; if( !dbgScript->sendCommand( command, hint ) ) { JS_ReportError( context, "Command couldn't be called." ); return JS_FALSE; } args.rval().setInt32( static_cast<int32_t>(hint) ); return JS_TRUE; }
bool SharedArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); if (!args.isConstructing()) { if (args.hasDefined(0)) { ESClassValue cls; if (!GetClassOfValue(cx, args[0], &cls)) return false; if (cls == ESClass_SharedArrayBuffer) { args.rval().set(args[0]); return true; } } JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_OBJECT); return false; } // Bugs 1068458, 1161298: Limit length to 2^31-1. uint32_t length; bool overflow_unused; if (!ToLengthClamped(cx, args.get(0), &length, &overflow_unused) || length > INT32_MAX) { JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_LENGTH); return false; } JSObject* bufobj = New(cx, length); if (!bufobj) return false; args.rval().setObject(*bufobj); return true; }
bool SharedArrayBufferObject::class_constructor(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); if (!args.isConstructing()) { if (args.hasDefined(0) && IsObjectWithClass(args[0], ESClass_SharedArrayBuffer, cx)) { args.rval().set(args[0]); return true; } JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_OBJECT); return false; } uint32_t length; bool overflow; if (!ToLengthClamped(cx, args.get(0), &length, &overflow)) { // Bug 1068458: Limit length to 2^31-1. if (overflow || length > INT32_MAX) JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_SHARED_ARRAY_BAD_LENGTH); return false; } JSObject *bufobj = New(cx, length); if (!bufobj) return false; args.rval().setObject(*bufobj); return true; }
static bool WeakMap_construct(JSContext* cx, unsigned argc, Value* vp) { CallArgs args = CallArgsFromVp(argc, vp); // ES6 draft rev 31 (15 Jan 2015) 23.3.1.1 step 1. if (!ThrowIfNotConstructing(cx, args, "WeakMap")) return false; RootedObject proto(cx); if (!GetPrototypeFromBuiltinConstructor(cx, args, &proto)) return false; RootedObject obj(cx, NewObjectWithClassProto<WeakMapObject>(cx, proto)); if (!obj) return false; // Steps 5-6, 11. if (!args.get(0).isNullOrUndefined()) { FixedInvokeArgs<1> args2(cx); args2[0].set(args[0]); RootedValue thisv(cx, ObjectValue(*obj)); if (!CallSelfHostedFunction(cx, cx->names().WeakMapConstructorInit, thisv, args2, args2.rval())) return false; } args.rval().setObject(*obj); return true; }
bool js::IsAsmJSModule(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); bool rval = args.hasDefined(0) && IsMaybeWrappedNativeFunction(args.get(0), LinkAsmJS); args.rval().set(BooleanValue(rval)); return true; }