/* Legacy ExecuteRegExp behavior is baked into the JSAPI. */ bool js::ExecuteRegExpLegacy(JSContext *cx, RegExpStatics *res, RegExpObject &reobj, Handle<JSLinearString*> input, const jschar *chars, size_t length, size_t *lastIndex, bool test, MutableHandleValue rval) { RegExpGuard shared(cx); if (!reobj.getShared(cx, &shared)) return false; ScopedMatchPairs matches(&cx->tempLifoAlloc()); MatchConduit conduit(&matches); RegExpRunStatus status = ExecuteRegExpImpl(cx, res, *shared, input, chars, length, lastIndex, conduit); if (status == RegExpRunStatus_Error) return false; if (status == RegExpRunStatus_Success_NotFound) { /* ExecuteRegExp() previously returned an array or null. */ rval.setNull(); return true; } if (test) { /* Forbid an array, as an optimization. */ rval.setBoolean(true); return true; } return CreateRegExpMatchResult(cx, input, chars, length, matches, rval); }
bool js::ProxyHasOwn(JSContext* cx, HandleObject proxy, HandleValue idVal, MutableHandleValue result) { RootedId id(cx); if (!ValueToId<CanGC>(cx, idVal, &id)) return false; bool hasOwn; if (!Proxy::hasOwn(cx, proxy, id, &hasOwn)) return false; result.setBoolean(hasOwn); return true; }
static bool PreprocessValue(JSContext *cx, HandleObject holder, KeyType key, MutableHandleValue vp, StringifyContext *scx) { RootedString keyStr(cx); /* Step 2. */ if (vp.isObject()) { RootedValue toJSON(cx); RootedObject obj(cx, &vp.toObject()); if (!JSObject::getProperty(cx, obj, obj, cx->names().toJSON, &toJSON)) return false; if (js_IsCallable(toJSON)) { keyStr = KeyStringifier<KeyType>::toString(cx, key); if (!keyStr) return false; InvokeArgs args(cx); if (!args.init(1)) return false; args.setCallee(toJSON); args.setThis(vp); args[0].setString(keyStr); if (!Invoke(cx, args)) return false; vp.set(args.rval()); } } /* Step 3. */ if (scx->replacer && scx->replacer->isCallable()) { if (!keyStr) { keyStr = KeyStringifier<KeyType>::toString(cx, key); if (!keyStr) return false; } InvokeArgs args(cx); if (!args.init(2)) return false; args.setCallee(ObjectValue(*scx->replacer)); args.setThis(ObjectValue(*holder)); args[0].setString(keyStr); args[1].set(vp); if (!Invoke(cx, args)) return false; vp.set(args.rval()); } /* Step 4. */ if (vp.get().isObject()) { RootedObject obj(cx, &vp.get().toObject()); if (ObjectClassIs(obj, ESClass_Number, cx)) { double d; if (!ToNumber(cx, vp, &d)) return false; vp.set(NumberValue(d)); } else if (ObjectClassIs(obj, ESClass_String, cx)) { JSString *str = ToStringSlow<CanGC>(cx, vp); if (!str) return false; vp.set(StringValue(str)); } else if (ObjectClassIs(obj, ESClass_Boolean, cx)) { vp.setBoolean(BooleanGetPrimitiveValue(obj, cx)); } } return true; }
bool JavaScriptShared::fromVariant(JSContext* cx, const JSVariant& from, MutableHandleValue to) { switch (from.type()) { case JSVariant::TUndefinedVariant: to.set(UndefinedValue()); return true; case JSVariant::TNullVariant: to.set(NullValue()); return true; case JSVariant::TObjectVariant: { JSObject* obj = fromObjectVariant(cx, from.get_ObjectVariant()); if (!obj) return false; to.set(ObjectValue(*obj)); return true; } case JSVariant::TSymbolVariant: { Symbol* sym = fromSymbolVariant(cx, from.get_SymbolVariant()); if (!sym) return false; to.setSymbol(sym); return true; } case JSVariant::Tdouble: to.set(JS_NumberValue(from.get_double())); return true; case JSVariant::Tbool: to.setBoolean(from.get_bool()); return true; case JSVariant::TnsString: { const nsString& old = from.get_nsString(); JSString* str = JS_NewUCStringCopyN(cx, old.BeginReading(), old.Length()); if (!str) return false; to.set(StringValue(str)); return true; } case JSVariant::TJSIID: { nsID iid; const JSIID& id = from.get_JSIID(); ConvertID(id, &iid); JSCompartment* compartment = GetContextCompartment(cx); RootedObject global(cx, JS_GetGlobalForCompartmentOrNull(cx, compartment)); JSObject* obj = xpc_NewIDObject(cx, global, iid); if (!obj) return false; to.set(ObjectValue(*obj)); return true; } default: MOZ_CRASH("NYI"); return false; } }