static bool EvalStringMightBeJSON(const mozilla::Range<const CharT> chars) { // If the eval string starts with '(' or '[' and ends with ')' or ']', it may be JSON. // Try the JSON parser first because it's much faster. If the eval string // isn't JSON, JSON parsing will probably fail quickly, so little time // will be lost. size_t length = chars.length(); if (length > 2 && ((chars[0] == '[' && chars[length - 1] == ']') || (chars[0] == '(' && chars[length - 1] == ')'))) { // Remarkably, JavaScript syntax is not a superset of JSON syntax: // strings in JavaScript cannot contain the Unicode line and paragraph // terminator characters U+2028 and U+2029, but strings in JSON can. // Rather than force the JSON parser to handle this quirk when used by // eval, we simply don't use the JSON parser when either character // appears in the provided string. See bug 657367. if (sizeof(CharT) > 1) { for (RangedPtr<const CharT> cp = chars.start() + 1, end = chars.end() - 1; cp < end; cp++) { char16_t c = *cp; if (c == 0x2028 || c == 0x2029) return false; } } return true; } return false; }
static bool ArgsAndBodySubstring(mozilla::Range<const CharT> chars, size_t *outOffset, size_t *outLen) { const CharT *const start = chars.start().get(); const CharT *const end = chars.end().get(); const CharT *s = start; uint8_t parenChomp = 0; if (s[0] == '(') { s++; parenChomp = 1; } /* Try to jump "function" keyword. */ s = js_strchr_limit(s, ' ', end); if (!s) return false; /* * Jump over the function's name: it can't be encoded as part * of an ECMA getter or setter. */ s = js_strchr_limit(s, '(', end); if (!s) return false; if (*s == ' ') s++; *outOffset = s - start; *outLen = end - s - parenChomp; MOZ_ASSERT(*outOffset + *outLen <= chars.length()); return true; }