зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1524590 part 1 - Fix or remove tests using 'clone' function. r=jorendorff
We want to remove JS::CloneFunctionObject. Most tests can use either cloneAndExecuteScript or evaluate instead. Differential Revision: https://phabricator.services.mozilla.com/D52978 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
5fd08f939a
Коммит
35b6a50aa1
|
@ -4361,7 +4361,6 @@ static bool ShellCloneAndExecuteScript(JSContext* cx, unsigned argc,
|
|||
|
||||
JS::CompileOptions options(cx);
|
||||
options.setFileAndLine(filename.get(), lineno);
|
||||
options.setNoScriptRval(true);
|
||||
|
||||
JS::SourceText<char16_t> srcBuf;
|
||||
if (!srcBuf.init(cx, src, srclen, SourceOwnership::Borrowed)) {
|
||||
|
@ -4383,14 +4382,19 @@ static bool ShellCloneAndExecuteScript(JSContext* cx, unsigned argc,
|
|||
return false;
|
||||
}
|
||||
|
||||
AutoRealm ar(cx, global);
|
||||
|
||||
JS::RootedValue rval(cx);
|
||||
if (!JS::CloneAndExecuteScript(cx, script, &rval)) {
|
||||
{
|
||||
AutoRealm ar(cx, global);
|
||||
if (!JS::CloneAndExecuteScript(cx, script, &rval)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cx->compartment()->wrap(cx, &rval)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
args.rval().setUndefined();
|
||||
args.rval().set(rval);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// |jit-test| error:AsmJS modules do not yet support cloning; skip-if: !isAsmJSCompilationAvailable()
|
||||
var g = newGlobal();
|
||||
g.evaluate(`
|
||||
cloneAndExecuteScript(`
|
||||
function h() {
|
||||
function f() {
|
||||
'use asm';
|
||||
|
@ -9,6 +9,4 @@ g.evaluate(`
|
|||
}
|
||||
return f;
|
||||
}
|
||||
`);
|
||||
var h = clone(g.h);
|
||||
h();
|
||||
`, g);
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
// |jit-test| error:Error; skip-if: !isAsmJSCompilationAvailable()
|
||||
// |jit-test| error:Error: AsmJS modules do not yet support cloning; skip-if: !isAsmJSCompilationAvailable()
|
||||
|
||||
var g = newGlobal({newCompartment: true});
|
||||
evaluate("function h() { function f() { 'use asm'; function g() { return 42 } return g } return f }", { global:g});
|
||||
var h = clone(g.h);
|
||||
assertEq(h()()(), 42);
|
||||
cloneAndExecuteScript("function h() { function f() { 'use asm'; function g() { return 42 } return g } return f }", g);
|
||||
|
|
|
@ -3,16 +3,12 @@
|
|||
var globals = [];
|
||||
for (var i = 0; i < 24; ++i) {
|
||||
var g = newGlobal();
|
||||
g.eval(`
|
||||
function f(){}
|
||||
var env = {};
|
||||
`);
|
||||
globals.push(g);
|
||||
}
|
||||
|
||||
var i = 0;
|
||||
oomTest(function() {
|
||||
globals[(i++) % globals.length].eval(`
|
||||
this.clone(this.f, this.env);
|
||||
evaluate("function f() {}", {envChainObject: this.env});
|
||||
`);
|
||||
});
|
||||
|
|
|
@ -23,4 +23,3 @@ this.gczeal(hits, 2);
|
|||
var fn = g.evaluate("(function (a) { return 5 + a; })");
|
||||
var g2 = newGlobal({newCompartment: true});
|
||||
dbg.addDebuggee(g2, dbg);
|
||||
g2.clone(fn);
|
||||
|
|
|
@ -10,11 +10,6 @@ var p = new Proxy(t, {
|
|||
},
|
||||
get(t, id) { return t[id]; }
|
||||
});
|
||||
evaluate(`function testFunc() {
|
||||
x += " x";
|
||||
}`);
|
||||
|
||||
var cloneFunc = clone(testFunc, p);
|
||||
cloneFunc();
|
||||
evaluate(`x += " x";`, {envChainObject: p});
|
||||
assertEq(hits, 2);
|
||||
assertEq(t.x, "undefined x");
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
// |jit-test| error: Error
|
||||
|
||||
var g = newGlobal();
|
||||
g.f = setJitCompilerOption;
|
||||
g.eval("clone(f)()(9)")
|
|
@ -1,4 +0,0 @@
|
|||
// |jit-test| error: can't clone
|
||||
var gv = newGlobal();
|
||||
gv.f = (class get {});
|
||||
gv.eval('f = clone(f);');
|
|
@ -1,7 +0,0 @@
|
|||
|
||||
load(libdir + "asserts.js");
|
||||
|
||||
function C(a, b) {}
|
||||
var f = C.bind(null, 2);
|
||||
var that = this;
|
||||
assertThrowsInstanceOf(function () { g = clone(f, that)}, TypeError);
|
|
@ -1,4 +0,0 @@
|
|||
var g = newGlobal();
|
||||
var f1 = g.evaluate("(function (x) { function inner() {}; })");
|
||||
gczeal(2, 1); // Exercise all the edge cases in cloning, please.
|
||||
var f2 = clone(f1);
|
|
@ -19,9 +19,9 @@ function test(str, arg, result)
|
|||
// test reflection logic
|
||||
Reflect.parse(got);
|
||||
|
||||
// test xdr by cloning a cross-compartment function
|
||||
// test script cloning
|
||||
var code = "(function (x) { " + str + " })";
|
||||
var c = clone(otherGlobal.evaluate(code));
|
||||
var c = cloneAndExecuteScript(code, otherGlobal);
|
||||
assertEq(c.toSource(), eval(code).toSource());
|
||||
|
||||
var got = fun(arg);
|
||||
|
|
|
@ -1,21 +1,22 @@
|
|||
var g = newGlobal();
|
||||
|
||||
g.f = new Function('return function(x) { return x };');
|
||||
assertEq(g.eval("clone(f)()(9)"), 9);
|
||||
var f;
|
||||
f = cloneAndExecuteScript('(function(x) { return x })', g);
|
||||
assertEq(f(9), 9);
|
||||
|
||||
g.f = new Function('return function(x) { { let y = x+1; return y } };');
|
||||
assertEq(g.eval("clone(f)()(9)"), 10);
|
||||
f = cloneAndExecuteScript('(function(x) { { let y = x+1; return y } })', g);
|
||||
assertEq(f(9), 10);
|
||||
|
||||
g.f = new Function('return function(x) { { let y = x, z = 1; return y+z } };');
|
||||
assertEq(g.eval("clone(f)()(9)"), 10);
|
||||
f = cloneAndExecuteScript('(function(x) { { let y = x, z = 1; return y+z } })', g);
|
||||
assertEq(f(9), 10);
|
||||
|
||||
g.f = new Function('return function(x) { return x.search(/ponies/) };');
|
||||
assertEq(g.eval("clone(f)()('123ponies')"), 3);
|
||||
f = cloneAndExecuteScript('(function(x) { return x.search(/ponies/) })', g);
|
||||
assertEq(f('123ponies'), 3);
|
||||
|
||||
g.f = new Function('return function(x,y) { return x.search(/a/) + y.search(/b/) };');
|
||||
assertEq(g.eval("clone(f)()('12a','foo')"), 1);
|
||||
f = cloneAndExecuteScript('(function(x, y) { return x.search(/a/) + y.search(/b/) })', g);
|
||||
assertEq(f('12a','foo'), 1);
|
||||
|
||||
g.f = new Function('return function(x) { switch(x) { case "a": return "b"; case null: return "c" } };');
|
||||
assertEq(g.eval("clone(f)()('a')"), "b");
|
||||
assertEq(g.eval("clone(f)()(null)"), "c");
|
||||
assertEq(g.eval("clone(f)()(3)"), undefined);
|
||||
f = cloneAndExecuteScript('(function(x) { switch(x) { case "a": return "b"; case null: return "c" } })', g);
|
||||
assertEq(f('a'), "b");
|
||||
assertEq(f(null), "c");
|
||||
assertEq(f(3), undefined);
|
||||
|
|
|
@ -6,20 +6,6 @@ function assertWithMessage(got, expected, message) {
|
|||
assertEq(message + ": " + got, message + ": " + expected);
|
||||
}
|
||||
|
||||
function testFunc() {
|
||||
assertWithMessage(checkNameLookup(), "local", "nameLookup");
|
||||
assertWithMessage(checkThisBinding(), "local", "thisBinding");
|
||||
|
||||
// Important: lambda needs to close over "reason", so it won't just get the
|
||||
// scope of testFunc as its scope. Instead it'll get the Call object
|
||||
// "reason" lives in.
|
||||
var reason = " in lambda in Call";
|
||||
(function() {
|
||||
assertWithMessage(checkNameLookup(), "local", "nameLookup" + reason);
|
||||
assertWithMessage(checkThisBinding(), "local", "thisBinding" + reason);
|
||||
})();
|
||||
}
|
||||
|
||||
var obj = {
|
||||
checkNameLookup: function() {
|
||||
return "local";
|
||||
|
@ -30,5 +16,16 @@ var obj = {
|
|||
},
|
||||
};
|
||||
|
||||
var cloneFunc = clone(testFunc, obj);
|
||||
cloneFunc();
|
||||
evaluate("(" + function() {
|
||||
assertWithMessage(checkNameLookup(), "local", "nameLookup");
|
||||
assertWithMessage(checkThisBinding(), "local", "thisBinding");
|
||||
|
||||
// Important: lambda needs to close over "reason", so it won't just get the
|
||||
// scope of testFunc as its scope. Instead it'll get the Call object
|
||||
// "reason" lives in.
|
||||
var reason = " in lambda in Call";
|
||||
(function() {
|
||||
assertWithMessage(checkNameLookup(), "local", "nameLookup" + reason);
|
||||
assertWithMessage(checkThisBinding(), "local", "thisBinding" + reason);
|
||||
})();
|
||||
} + ")()", {envChainObject: obj});
|
||||
|
|
Двоичные данные
js/src/jit-test/tests/binast/lazy/auto-regress/bug677977.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/auto-regress/bug677977.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/bug1405820.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/bug1405820.binjs
Двоичный файл не отображается.
|
@ -1 +0,0 @@
|
|||
// |jit-test| error: Error
|
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/bug751139.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/bug751139.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/function-cloning-1.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/function-cloning-1.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/testLet.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/testLet.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/testScriptCloning.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/testScriptCloning.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/weird-scopechains.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/basic/weird-scopechains.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/Source-invisible.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/Source-invisible.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/bug1406437.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/bug1406437.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/onNewScript-01.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/onNewScript-01.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/onNewScript-02.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/debug/onNewScript-02.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/lazy/gc/bug-1161968.binjs
Двоичные данные
js/src/jit-test/tests/binast/lazy/gc/bug-1161968.binjs
Двоичный файл не отображается.
|
@ -1 +0,0 @@
|
|||
// |jit-test| skip-if: !('gczeal' in this)
|
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/bug1405820.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/bug1405820.binjs
Двоичный файл не отображается.
|
@ -1 +0,0 @@
|
|||
// |jit-test| error: Error
|
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/bug751139.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/bug751139.binjs
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/testLet.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/basic/testLet.binjs
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/bug1406437.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/bug1406437.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/onNewScript-01.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/onNewScript-01.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/onNewScript-02.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/debug/onNewScript-02.binjs
Двоичный файл не отображается.
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/gc/bug-1161968.binjs
Двоичные данные
js/src/jit-test/tests/binast/nonlazy/gc/bug-1161968.binjs
Двоичный файл не отображается.
|
@ -1 +0,0 @@
|
|||
// |jit-test| skip-if: !('gczeal' in this)
|
|
@ -1,11 +1,9 @@
|
|||
// Looking at ScriptSourceObjects in invisible-to-debugger compartments is okay.
|
||||
|
||||
var gi = newGlobal({ newCompartment: true, invisibleToDebugger: true });
|
||||
gi.eval('function f() {}');
|
||||
|
||||
var gv = newGlobal({newCompartment: true});
|
||||
gv.f = gi.f;
|
||||
gv.eval('f = clone(f);');
|
||||
gi.cloneAndExecuteScript('function f() {}', gv);
|
||||
|
||||
var dbg = new Debugger;
|
||||
var gvw = dbg.addDebuggee(gv);
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
var g = newGlobal({newCompartment: true});
|
||||
g.f = function() {};
|
||||
g.eval('f = clone(f);');
|
||||
cloneAndExecuteScript('function f() {}', g);
|
||||
var dbg = new Debugger;
|
||||
var dg = dbg.addDebuggee(g);
|
||||
dg.getOwnPropertyDescriptor('f').value.script.source;
|
||||
|
|
|
@ -37,9 +37,8 @@ assertEq(fn(8), 13);
|
|||
assertEq(hits, 1);
|
||||
|
||||
// cloning functions across compartments
|
||||
fn = g.evaluate("(function(a) { return 5 + a; })");
|
||||
var g2 = newGlobal({newCompartment: true});
|
||||
dbg.addDebuggee(g2, dbg);
|
||||
hits = 0;
|
||||
g2.clone(fn);
|
||||
cloneAndExecuteScript("(function(a) { return 5 + a; })", g2);
|
||||
assertEq(hits, 1);
|
||||
|
|
|
@ -44,7 +44,7 @@ test(function () { g.eval("var obj = {get x() { return 1; }, set x(v) { print(v)
|
|||
test(function () { return g.Function("a", "b", "return b - a;"); });
|
||||
|
||||
// cloning a function with nested functions
|
||||
test(function () { g.clone(evaluate("(function(x) { return x + 1; })")); });
|
||||
test(function () { cloneAndExecuteScript("(function(x) { return x + 1; })", g); });
|
||||
|
||||
// eval declaring a star generator
|
||||
test(function () { g.eval("function* sg(n) { for (var i=0;i<n;i++) yield i; }"); });
|
||||
|
|
|
@ -5,10 +5,8 @@
|
|||
gczeal(2,21);
|
||||
|
||||
var gi = newGlobal();
|
||||
gi.eval('function f() {}');
|
||||
|
||||
var gv = newGlobal();
|
||||
gv.f = gi.f;
|
||||
gv.eval('f = clone(f);');
|
||||
gi.cloneAndExecuteScript('function f() {}', gv);
|
||||
|
||||
var dbg = new Debugger;
|
||||
|
|
|
@ -1,17 +1,4 @@
|
|||
// |reftest| skip-if(!xulRuntime.shell) -- needs clone, cloneAndExecuteScript, drainJobQueue
|
||||
|
||||
// Async functions can be cloned.
|
||||
let f = clone(async function f() {
|
||||
var a = await 1;
|
||||
var b = await 2;
|
||||
var c = await 3;
|
||||
return a + b + c;
|
||||
});
|
||||
|
||||
var V;
|
||||
f().then(v => V = v);
|
||||
drainJobQueue();
|
||||
assertEq(V, 6);
|
||||
// |reftest| skip-if(!xulRuntime.shell) -- needs cloneAndExecuteScript, drainJobQueue
|
||||
|
||||
// Async function source code scripts can be cloned.
|
||||
let g = newGlobal();
|
||||
|
|
|
@ -26,12 +26,10 @@ function test()
|
|||
else {
|
||||
expect = 'PASSED';
|
||||
|
||||
f = evaluate("(function () { return a * a; })");
|
||||
g = clone(f, {a: 3});
|
||||
f = null;
|
||||
f = evaluate("(function () { return a * a; })", {envChainObject: {a: 3}});
|
||||
gc();
|
||||
try {
|
||||
a_squared = g(2);
|
||||
a_squared = f(2);
|
||||
if (a_squared != 9)
|
||||
throw "Unexpected return from g: a_squared == " + a_squared;
|
||||
actual = "PASSED";
|
||||
|
|
|
@ -1,78 +0,0 @@
|
|||
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/*
|
||||
*
|
||||
* Date: 06 Mar 2002
|
||||
* SUMMARY: Testing cloned function objects
|
||||
* See http://bugzilla.mozilla.org/show_bug.cgi?id=127557
|
||||
*
|
||||
* Before this bug was fixed, this testcase would error when run:
|
||||
*
|
||||
* ReferenceError: h_peer is not defined
|
||||
*
|
||||
* The line |g.prototype = new Object| below is essential: this is
|
||||
* what was confusing the engine in its attempt to look up h_peer
|
||||
*/
|
||||
//-----------------------------------------------------------------------------
|
||||
var UBound = 0;
|
||||
var BUGNUMBER = 127557;
|
||||
var summary = 'Testing cloned function objects';
|
||||
var cnCOMMA = ',';
|
||||
var status = '';
|
||||
var statusitems = [];
|
||||
var actual = '';
|
||||
var actualvalues = [];
|
||||
var expect= '';
|
||||
var expectedvalues = [];
|
||||
|
||||
if (typeof clone == 'function')
|
||||
{
|
||||
status = inSection(1);
|
||||
var f = evaluate("(function(x, y) {\n" +
|
||||
" function h() { return h_peer(); }\n" +
|
||||
" function h_peer() { return (x + cnCOMMA + y); }\n" +
|
||||
" return h;\n" +
|
||||
"})");
|
||||
var g = clone(f);
|
||||
g.prototype = new Object;
|
||||
var h = g(5,6);
|
||||
actual = h();
|
||||
expect = '5,6';
|
||||
addThis();
|
||||
}
|
||||
else
|
||||
{
|
||||
reportCompare('Test not run', 'Test not run', 'shell only test requires clone()');
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
test();
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function addThis()
|
||||
{
|
||||
statusitems[UBound] = status;
|
||||
actualvalues[UBound] = actual;
|
||||
expectedvalues[UBound] = expect;
|
||||
UBound++;
|
||||
}
|
||||
|
||||
|
||||
function test()
|
||||
{
|
||||
printBugNumber(BUGNUMBER);
|
||||
printStatus(summary);
|
||||
|
||||
for (var i=0; i<UBound; i++)
|
||||
{
|
||||
reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
|
||||
}
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче