зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1526394: Treat self-hosted functions the same as non-interpreted functions in Debugger code. r=jorendorff
This commit is contained in:
Родитель
c4004ef40c
Коммит
3b306926a8
|
@ -125,7 +125,7 @@ const TEST_DATA = [ // eslint-disable-line
|
|||
"Bubbling",
|
||||
"DOM2",
|
||||
],
|
||||
handler: "function sort(arr, comparefn) {\n" +
|
||||
handler: "function sort(, ) {\n" +
|
||||
" [native code]\n" +
|
||||
"}",
|
||||
},
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
// The environment of self-hosted builtins is not exposed to the debugger and
|
||||
// instead is reported as |undefined| just like native builtins.
|
||||
|
||||
let g = newGlobal({newCompartment: true});
|
||||
|
||||
let dbg = new Debugger();
|
||||
let gw = dbg.addDebuggee(g);
|
||||
|
||||
// Array is a known native builtin function.
|
||||
let nativeBuiltin = gw.makeDebuggeeValue(g.Array);
|
||||
assertEq(nativeBuiltin.environment, undefined);
|
||||
|
||||
// Array.prototype[@@iterator] is a known self-hosted builtin function.
|
||||
let selfhostedBuiltin = gw.makeDebuggeeValue(g.Array.prototype[Symbol.iterator]);
|
||||
assertEq(selfhostedBuiltin.environment, undefined);
|
|
@ -0,0 +1,15 @@
|
|||
// The script of self-hosted builtins is not exposed to the debugger and
|
||||
// instead is reported as |undefined| just like native builtins.
|
||||
|
||||
let g = newGlobal({newCompartment: true});
|
||||
|
||||
let dbg = new Debugger();
|
||||
let gw = dbg.addDebuggee(g);
|
||||
|
||||
// Array is a known native builtin function.
|
||||
let nativeBuiltin = gw.makeDebuggeeValue(g.Array);
|
||||
assertEq(nativeBuiltin.script, undefined);
|
||||
|
||||
// Array.prototype[@@iterator] is a known self-hosted builtin function.
|
||||
let selfhostedBuiltin = gw.makeDebuggeeValue(g.Array.prototype[Symbol.iterator]);
|
||||
assertEq(selfhostedBuiltin.script, undefined);
|
|
@ -202,6 +202,10 @@ static const Class DebuggerSource_class = {
|
|||
|
||||
/*** Utils ******************************************************************/
|
||||
|
||||
static inline bool IsInterpretedNonSelfHostedFunction(JSFunction* fun) {
|
||||
return fun->isInterpreted() && !fun->isSelfHostedBuiltin();
|
||||
}
|
||||
|
||||
static inline bool EnsureFunctionHasScript(JSContext* cx, HandleFunction fun) {
|
||||
if (fun->isInterpretedLazy()) {
|
||||
AutoRealm ar(cx, fun);
|
||||
|
@ -212,7 +216,7 @@ static inline bool EnsureFunctionHasScript(JSContext* cx, HandleFunction fun) {
|
|||
|
||||
static inline JSScript* GetOrCreateFunctionScript(JSContext* cx,
|
||||
HandleFunction fun) {
|
||||
MOZ_ASSERT(fun->isInterpreted());
|
||||
MOZ_ASSERT(IsInterpretedNonSelfHostedFunction(fun));
|
||||
if (!EnsureFunctionHasScript(cx, fun)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -6332,8 +6336,8 @@ static bool DebuggerScript_getChildScripts(JSContext* cx, unsigned argc,
|
|||
for (const GCPtrObject& obj : script->objects()) {
|
||||
if (obj->is<JSFunction>()) {
|
||||
fun = &obj->as<JSFunction>();
|
||||
// The inner function could be a wasm native.
|
||||
if (fun->isNative()) {
|
||||
// The inner function could be an asm.js native.
|
||||
if (!IsInterpretedNonSelfHostedFunction(fun)) {
|
||||
continue;
|
||||
}
|
||||
funScript = GetOrCreateFunctionScript(cx, fun);
|
||||
|
@ -10318,7 +10322,7 @@ bool DebuggerObject::scriptGetter(JSContext* cx, unsigned argc, Value* vp) {
|
|||
}
|
||||
|
||||
RootedFunction fun(cx, &obj->as<JSFunction>());
|
||||
if (!fun->isInterpreted()) {
|
||||
if (!IsInterpretedNonSelfHostedFunction(fun)) {
|
||||
args.rval().setUndefined();
|
||||
return true;
|
||||
}
|
||||
|
@ -10357,7 +10361,7 @@ bool DebuggerObject::environmentGetter(JSContext* cx, unsigned argc,
|
|||
}
|
||||
|
||||
RootedFunction fun(cx, &obj->as<JSFunction>());
|
||||
if (!fun->isInterpreted()) {
|
||||
if (!IsInterpretedNonSelfHostedFunction(fun)) {
|
||||
args.rval().setUndefined();
|
||||
return true;
|
||||
}
|
||||
|
@ -11469,7 +11473,7 @@ bool DebuggerObject::getParameterNames(JSContext* cx,
|
|||
if (!result.growBy(referent->nargs())) {
|
||||
return false;
|
||||
}
|
||||
if (referent->isInterpreted()) {
|
||||
if (IsInterpretedNonSelfHostedFunction(referent)) {
|
||||
RootedScript script(cx, GetOrCreateFunctionScript(cx, referent));
|
||||
if (!script) {
|
||||
return false;
|
||||
|
|
Загрузка…
Ссылка в новой задаче