Bug 1147371 - Always decompile argument names in self-hosted code in the caller frame. (r=arai)

This commit is contained in:
Shu-yu Guo 2017-01-14 14:51:39 -08:00
Родитель dab57ae422
Коммит 75847f1a75
1 изменённых файлов: 28 добавлений и 4 удалений

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

@ -92,7 +92,8 @@ const char * const js::CodeName[] = {
/************************************************************************/
#define COUNTS_LEN 16
static bool
DecompileArgumentFromStack(JSContext* cx, int formalIndex, char** res);
size_t
js::GetVariableBytecodeLength(jsbytecode* pc)
@ -1258,6 +1259,24 @@ ExpressionDecompiler::decompilePC(jsbytecode* pc)
return write(loadAtom(pc));
case JSOP_GETARG: {
unsigned slot = GET_ARGNO(pc);
// For self-hosted scripts that are called from non-self-hosted code,
// decompiling the parameter name in the self-hosted script is
// unhelpful. Decompile the argument name instead.
if (script->selfHosted()) {
char* result;
if (!DecompileArgumentFromStack(cx, slot, &result))
return false;
// Note that decompiling the argument in the parent frame might
// not succeed.
if (result) {
bool ok = write(result);
js_free(result);
return ok;
}
}
JSAtom* atom = getArg(slot);
if (!atom)
return false;
@ -1598,12 +1617,17 @@ DecompileArgumentFromStack(JSContext* cx, int formalIndex, char** res)
MOZ_ASSERT(frameIter.script()->selfHosted());
/*
* Get the second-to-top frame, the caller of the builtin that called the
* intrinsic.
* Get the second-to-top frame, the non-self-hosted caller of the builtin
* that called the intrinsic.
*/
++frameIter;
if (frameIter.done() || !frameIter.hasScript() || frameIter.compartment() != cx->compartment())
if (frameIter.done() ||
!frameIter.hasScript() ||
frameIter.script()->selfHosted() ||
frameIter.compartment() != cx->compartment())
{
return true;
}
RootedScript script(cx, frameIter.script());
jsbytecode* current = frameIter.pc();