JSAtom * SavedFrame::getSource() { const Value &v = getReservedSlot(JSSLOT_SOURCE); JSString *s = v.toString(); return &s->asAtom(); }
JSAtom * SavedFrame::getFunctionDisplayName() { const Value &v = getReservedSlot(JSSLOT_FUNCTIONDISPLAYNAME); if (v.isNull()) return nullptr; JSString *s = v.toString(); return &s->asAtom(); }
JSAtom * js::ToAtom(ExclusiveContext *cx, typename MaybeRooted<Value, allowGC>::HandleType v) { if (!v.isString()) return ToAtomSlow<allowGC>(cx, v); JSString *str = v.toString(); if (str->isAtom()) return &str->asAtom(); return AtomizeString(cx, str); }
JSAtom* js::ToAtom(ExclusiveContext* cx, typename MaybeRooted<Value, allowGC>::HandleType v) { if (!v.isString()) return ToAtomSlow<allowGC>(cx, v); JSString* str = v.toString(); if (str->isAtom()) return &str->asAtom(); JSAtom* atom = AtomizeString(cx, str); if (!atom && !allowGC) { MOZ_ASSERT_IF(cx->isJSContext(), cx->asJSContext()->isThrowingOutOfMemory()); cx->recoverFromOutOfMemory(); } return atom; }
JSAtom * js::ToAtom(ExclusiveContext *cx, typename MaybeRooted<Value, allowGC>::HandleType v) { if (!v.isString()) { JSString *str = js::ToStringSlow<allowGC>(cx, v); if (!str) return NULL; JS::Anchor<JSString *> anchor(str); return AtomizeString<allowGC>(cx, str); } JSString *str = v.toString(); if (str->isAtom()) return &str->asAtom(); JS::Anchor<JSString *> anchor(str); return AtomizeString<allowGC>(cx, str); }
bool JSCompartment::wrap(JSContext* cx, MutableHandleString strp) { MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(this)); MOZ_ASSERT(cx->compartment() == this); /* If the string is already in this compartment, we are done. */ JSString* str = strp; if (str->zoneFromAnyThread() == zone()) return true; /* * If the string is an atom, we don't have to copy, but we do need to mark * the atom as being in use by the new zone. */ if (str->isAtom()) { cx->markAtom(&str->asAtom()); return true; } /* Check the cache. */ RootedValue key(cx, StringValue(str)); if (WrapperMap::Ptr p = crossCompartmentWrappers.lookup(CrossCompartmentKey(key))) { strp.set(p->value().get().toString()); return true; } /* No dice. Make a copy, and cache it. */ JSString* copy = CopyStringPure(cx, str); if (!copy) return false; if (!putWrapper(cx, CrossCompartmentKey(key), StringValue(copy))) return false; strp.set(copy); return true; }