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:
Jan de Mooij 2019-11-27 07:47:02 +00:00
Родитель 5fd08f939a
Коммит 35b6a50aa1
49 изменённых файлов: 53 добавлений и 188 удалений

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

@ -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});

Двоичный файл не отображается.

Двоичный файл не отображается.

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

@ -1 +0,0 @@
// |jit-test| error: Error

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

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

@ -1 +0,0 @@
// |jit-test| skip-if: !('gczeal' in this)

Двоичный файл не отображается.

Двоичный файл не отображается.

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

@ -1 +0,0 @@
// |jit-test| error: Error

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

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

@ -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]);
}
}