зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1165486 - Debug function to dump static scope chain of scripts. (r=efaust)
This commit is contained in:
Родитель
ea6cf2a6c7
Коммит
ce36264858
|
@ -4318,6 +4318,36 @@ ReflectTrackedOptimizations(JSContext* cx, unsigned argc, Value* vp)
|
|||
return true;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static bool
|
||||
DumpStaticScopeChain(JSContext* cx, unsigned argc, Value* vp)
|
||||
{
|
||||
CallArgs args = CallArgsFromVp(argc, vp);
|
||||
RootedObject callee(cx, &args.callee());
|
||||
|
||||
if (args.length() != 1) {
|
||||
ReportUsageError(cx, callee, "Wrong number of arguments");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!args[0].isObject() || !args[0].toObject().is<JSFunction>()) {
|
||||
ReportUsageError(cx, callee, "Argument must be an interpreted function");
|
||||
return false;
|
||||
}
|
||||
|
||||
RootedFunction fun(cx, &args[0].toObject().as<JSFunction>());
|
||||
if (!fun->isInterpreted()) {
|
||||
ReportUsageError(cx, callee, "Argument must be an interpreted function");
|
||||
return false;
|
||||
}
|
||||
|
||||
js::DumpStaticScopeChain(fun->getOrCreateScript(cx));
|
||||
|
||||
args.rval().setUndefined();
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace js {
|
||||
namespace shell {
|
||||
|
||||
|
@ -4966,6 +4996,12 @@ static const JSFunctionSpecWithHelp fuzzing_unsafe_functions[] = {
|
|||
" any. If |fun| is not a scripted function or has not been compiled by\n"
|
||||
" Ion, null is returned."),
|
||||
|
||||
#ifdef DEBUG
|
||||
JS_FN_HELP("dumpStaticScopeChain", DumpStaticScopeChain, 1, 0,
|
||||
"dumpStaticScopeChain(fun)",
|
||||
" Prints the static scope chain of an interpreted function fun."),
|
||||
#endif
|
||||
|
||||
JS_FS_HELP_END
|
||||
};
|
||||
|
||||
|
|
|
@ -2561,6 +2561,36 @@ js::HasNonSyntacticStaticScopeChain(JSObject* staticScope)
|
|||
|
||||
#ifdef DEBUG
|
||||
|
||||
void
|
||||
js::DumpStaticScopeChain(JSScript* script)
|
||||
{
|
||||
JSObject* enclosingScope = script->enclosingStaticScope();
|
||||
for (StaticScopeIter<NoGC> ssi(enclosingScope); !ssi.done(); ssi++) {
|
||||
switch (ssi.type()) {
|
||||
case StaticScopeIter<NoGC>::Function:
|
||||
fprintf(stdout, "function");
|
||||
break;
|
||||
case StaticScopeIter<NoGC>::Block:
|
||||
fprintf(stdout, "block");
|
||||
break;
|
||||
case StaticScopeIter<NoGC>::With:
|
||||
fprintf(stdout, "with");
|
||||
break;
|
||||
case StaticScopeIter<NoGC>::NamedLambda:
|
||||
fprintf(stdout, "named lambda");
|
||||
break;
|
||||
case StaticScopeIter<NoGC>::Eval:
|
||||
fprintf(stdout, "eval");
|
||||
break;
|
||||
case StaticScopeIter<NoGC>::NonSyntactic:
|
||||
fprintf(stdout, "non-syntactic");
|
||||
break;
|
||||
}
|
||||
fprintf(stdout, " -> ");
|
||||
}
|
||||
fprintf(stdout, "global\n");
|
||||
}
|
||||
|
||||
typedef HashSet<PropertyName*> PropertyNameSet;
|
||||
|
||||
static bool
|
||||
|
|
|
@ -1176,6 +1176,7 @@ CreateScopeObjectsForScopeChain(JSContext* cx, AutoObjectVector& scopeChain,
|
|||
bool HasNonSyntacticStaticScopeChain(JSObject* staticScope);
|
||||
|
||||
#ifdef DEBUG
|
||||
void DumpStaticScopeChain(JSScript* script);
|
||||
bool
|
||||
AnalyzeEntrainedVariables(JSContext* cx, HandleScript script);
|
||||
#endif
|
||||
|
|
Загрузка…
Ссылка в новой задаче