Bug 879079 - Fix static root analysis hazards around ValueToSource; r=sfink

--HG--
extra : rebase_source : 2f31fdefdcdd6bb95beace105f6b79458d3a407f
This commit is contained in:
Terrence Cole 2013-06-26 14:44:51 -07:00
Родитель a6435e62f3
Коммит cde5f72fa0
3 изменённых файлов: 26 добавлений и 12 удалений

Просмотреть файл

@ -1339,7 +1339,8 @@ ExpressionDecompiler::decompilePC(jsbytecode *pc)
JSObject *obj = (op == JSOP_REGEXP)
? script->getRegExp(GET_UINT32_INDEX(pc))
: script->getObject(GET_UINT32_INDEX(pc));
JSString *str = ValueToSource(cx, ObjectValue(*obj));
RootedValue objv(cx, ObjectValue(*obj));
JSString *str = ValueToSource(cx, objv);
if (!str)
return false;
return write(str);
@ -2120,7 +2121,7 @@ js::GetPCCountScriptSummary(JSContext *cx, size_t index)
AppendJSONProperty(buf, "file", NO_COMMA);
JSString *str = JS_NewStringCopyZ(cx, script->filename());
if (!str || !(str = ValueToSource(cx, StringValue(str))))
if (!str || !(str = StringToSource(cx, str)))
return NULL;
buf.append(str);
@ -2131,7 +2132,7 @@ js::GetPCCountScriptSummary(JSContext *cx, size_t index)
JSAtom *atom = script->function()->displayAtom();
if (atom) {
AppendJSONProperty(buf, "name");
if (!(str = ValueToSource(cx, StringValue(atom))))
if (!(str = StringToSource(cx, atom)))
return NULL;
buf.append(str);
}
@ -2218,7 +2219,7 @@ GetPCCountJSON(JSContext *cx, const ScriptAndCounts &sac, StringBuffer &buf)
AppendJSONProperty(buf, "text", NO_COMMA);
JSString *str = JS_DecompileScript(cx, script, NULL, 0);
if (!str || !(str = ValueToSource(cx, StringValue(str))))
if (!str || !(str = StringToSource(cx, str)))
return false;
buf.append(str);
@ -2274,7 +2275,7 @@ GetPCCountJSON(JSContext *cx, const ScriptAndCounts &sac, StringBuffer &buf)
AppendJSONProperty(buf, "text");
JSString *str = JS_NewStringCopyZ(cx, text);
js_free(text);
if (!str || !(str = ValueToSource(cx, StringValue(str))))
if (!str || !(str = StringToSource(cx, str)))
return false;
buf.append(str);
}
@ -2335,7 +2336,7 @@ GetPCCountJSON(JSContext *cx, const ScriptAndCounts &sac, StringBuffer &buf)
AppendJSONProperty(buf, "code");
JSString *str = JS_NewStringCopyZ(cx, block.code());
if (!str || !(str = ValueToSource(cx, StringValue(str))))
if (!str || !(str = StringToSource(cx, str)))
return false;
buf.append(str);

Просмотреть файл

@ -343,7 +343,7 @@ static JSBool
str_uneval(JSContext *cx, unsigned argc, Value *vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
JSString *str = ValueToSource(cx, args.get(0));
JSString *str = ValueToSource(cx, args.handleOrUndefinedAt(0));
if (!str)
return false;
@ -3804,7 +3804,7 @@ template JSString *
js::ToStringSlow<NoGC>(JSContext *cx, Value arg);
JSString *
js::ValueToSource(JSContext *cx, const Value &v)
js::ValueToSource(JSContext *cx, HandleValue v)
{
JS_CHECK_RECURSION(cx, return NULL);
assertSameCompartment(cx, v);
@ -3812,7 +3812,7 @@ js::ValueToSource(JSContext *cx, const Value &v)
if (v.isUndefined())
return cx->names().void0;
if (v.isString())
return js_QuoteString(cx, v.toString(), '"');
return StringToSource(cx, v.toString());
if (v.isPrimitive()) {
/* Special case to preserve negative zero, _contra_ toString. */
if (v.isDouble() && IsNegativeZero(v.toDouble())) {
@ -3821,8 +3821,7 @@ js::ValueToSource(JSContext *cx, const Value &v)
return js_NewStringCopyN<CanGC>(cx, js_negzero_ucNstr, 2);
}
RootedValue vRoot(cx, v);
return ToString<CanGC>(cx, vRoot);
return ToString<CanGC>(cx, v);
}
RootedValue rval(cx, NullValue());
@ -3838,6 +3837,12 @@ js::ValueToSource(JSContext *cx, const Value &v)
return ToString<CanGC>(cx, rval);
}
JSString *
js::StringToSource(JSContext *cx, JSString *str)
{
return js_QuoteString(cx, str, '"');
}
bool
js::EqualStrings(JSContext *cx, JSString *str1, JSString *str2, bool *result)
{

Просмотреть файл

@ -165,7 +165,15 @@ namespace js {
* an error, otherwise returning a new string reference.
*/
extern JSString *
ValueToSource(JSContext *cx, const js::Value &v);
ValueToSource(JSContext *cx, HandleValue v);
/*
* Convert a JSString to its source expression; returns null after reporting an
* error, otherwise returns a new string reference. No Handle needed since the
* input is dead after the GC.
*/
extern JSString *
StringToSource(JSContext *cx, JSString *str);
/*
* Test if strings are equal. The caller can call the function even if str1