void GetDynamicName(JSContext *cx, JSObject *scopeChain, JSString *str, Value *vp) { // Lookup a string on the scope chain, returning either the value found or // undefined through rval. This function is infallible, and cannot GC or // invalidate. JSAtom *atom; if (str->isAtom()) { atom = &str->asAtom(); } else { atom = AtomizeString<NoGC>(cx, str); if (!atom) { vp->setUndefined(); return; } } if (!frontend::IsIdentifier(atom) || frontend::FindKeyword(atom->chars(), atom->length())) { vp->setUndefined(); return; } Shape *shape = NULL; JSObject *scope = NULL, *pobj = NULL; if (LookupNameNoGC(cx, atom->asPropertyName(), scopeChain, &scope, &pobj, &shape)) { if (FetchNameNoGC(pobj, shape, MutableHandleValue::fromMarkedLocation(vp))) return; } vp->setUndefined(); }
JSFlatString * RegExpObject::toString(JSContext *cx) const { JSAtom *src = getSource(); StringBuffer sb(cx); if (size_t len = src->length()) { if (!sb.reserve(len + 2)) return NULL; sb.infallibleAppend('/'); sb.infallibleAppend(src->chars(), len); sb.infallibleAppend('/'); } else { if (!sb.append("/(?:)/")) return NULL; } if (global() && !sb.append('g')) return NULL; if (ignoreCase() && !sb.append('i')) return NULL; if (multiline() && !sb.append('m')) return NULL; if (sticky() && !sb.append('y')) return NULL; return sb.finishString(); }
/* * Convert string indexes that convert to int jsvals as ints to save memory. * Care must be taken to use this macro every time a property name is used, or * else double-sets, incorrect property cache misses, or other mistakes could * occur. */ jsid js_CheckForStringIndex(jsid id) { if (!JSID_IS_ATOM(id)) return id; JSAtom *atom = JSID_TO_ATOM(id); const jschar *s = atom->chars(); jschar ch = *s; JSBool negative = (ch == '-'); if (negative) ch = *++s; if (!JS7_ISDEC(ch)) return id; size_t n = atom->length() - negative; if (n > sizeof(JSBOXEDWORD_INT_MAX_STRING) - 1) return id; const jschar *cp = s; const jschar *end = s + n; jsuint index = JS7_UNDEC(*cp++); jsuint oldIndex = 0; jsuint c = 0; if (index != 0) { while (JS7_ISDEC(*cp)) { oldIndex = index; c = JS7_UNDEC(*cp); index = 10 * index + c; cp++; } } /* * Non-integer indexes can't be represented as integers. Also, distinguish * index "-0" from "0", because JSBOXEDWORD_INT cannot. */ if (cp != end || (negative && index == 0)) return id; if (negative) { if (oldIndex < -(JSID_INT_MIN / 10) || (oldIndex == -(JSID_INT_MIN / 10) && c <= (-JSID_INT_MIN % 10))) { id = INT_TO_JSID(-jsint(index)); } } else { if (oldIndex < JSID_INT_MAX / 10 || (oldIndex == JSID_INT_MAX / 10 && c <= (JSID_INT_MAX % 10))) { id = INT_TO_JSID(jsint(index)); } } return id; }