mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
[INFER] Add rejoins for call sites that can trigger GC, bug 671943.
This commit is contained in:
parent
14ffb09713
commit
2291066d7c
12
js/src/jit-test/tests/jaeger/recompile/bug671943-1.js
Normal file
12
js/src/jit-test/tests/jaeger/recompile/bug671943-1.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
gczeal(2);
|
||||||
|
o1 = Iterator;
|
||||||
|
var o2 = (function() { return arguments; })();
|
||||||
|
function f(o) {
|
||||||
|
for(var j=0; j<20; j++) {
|
||||||
|
Object.seal(o2);
|
||||||
|
(function() { return eval(o); })() == o1;
|
||||||
|
(function() { return {x: arguments}.x; })();
|
||||||
|
if (false) {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
f({});
|
9
js/src/jit-test/tests/jaeger/recompile/bug671943-2.js
Normal file
9
js/src/jit-test/tests/jaeger/recompile/bug671943-2.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
schedulegc(11);
|
||||||
|
function foo(n) {
|
||||||
|
if (n == 10)
|
||||||
|
foo.apply = function(a, b) { return b[0]; }
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
function bar() { return foo.apply(null, arguments); }
|
||||||
|
for (var i = 0; i < 20; i++)
|
||||||
|
assertEq(bar(i), i);
|
@ -739,7 +739,7 @@ mjit::Compiler::generatePrologue()
|
|||||||
/* Create the call object. */
|
/* Create the call object. */
|
||||||
if (script->fun->isHeavyweight()) {
|
if (script->fun->isHeavyweight()) {
|
||||||
prepareStubCall(Uses(0));
|
prepareStubCall(Uses(0));
|
||||||
INLINE_STUBCALL(stubs::CreateFunCallObject, REJOIN_NONE);
|
INLINE_STUBCALL(stubs::CreateFunCallObject, REJOIN_CREATE_CALL_OBJECT);
|
||||||
}
|
}
|
||||||
|
|
||||||
j.linkTo(masm.label(), &masm);
|
j.linkTo(masm.label(), &masm);
|
||||||
@ -2634,7 +2634,7 @@ mjit::Compiler::generateMethod()
|
|||||||
JSObject *regex = script->getRegExp(fullAtomIndex(PC));
|
JSObject *regex = script->getRegExp(fullAtomIndex(PC));
|
||||||
prepareStubCall(Uses(0));
|
prepareStubCall(Uses(0));
|
||||||
masm.move(ImmPtr(regex), Registers::ArgReg1);
|
masm.move(ImmPtr(regex), Registers::ArgReg1);
|
||||||
INLINE_STUBCALL(stubs::RegExp, REJOIN_NONE);
|
INLINE_STUBCALL(stubs::RegExp, REJOIN_PUSH_OBJECT);
|
||||||
frame.takeReg(Registers::ReturnReg);
|
frame.takeReg(Registers::ReturnReg);
|
||||||
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
|
frame.pushTypedPayload(JSVAL_TYPE_OBJECT, Registers::ReturnReg);
|
||||||
}
|
}
|
||||||
@ -3310,7 +3310,7 @@ mjit::Compiler::checkCallApplySpeculation(uint32 callImmArgc, uint32 speculatedA
|
|||||||
|
|
||||||
int32 frameDepthAdjust;
|
int32 frameDepthAdjust;
|
||||||
if (applyTricks == LazyArgsObj) {
|
if (applyTricks == LazyArgsObj) {
|
||||||
OOL_STUBCALL(stubs::Arguments, REJOIN_NONE);
|
OOL_STUBCALL(stubs::Arguments, REJOIN_RESUME);
|
||||||
frameDepthAdjust = +1;
|
frameDepthAdjust = +1;
|
||||||
} else {
|
} else {
|
||||||
frameDepthAdjust = 0;
|
frameDepthAdjust = 0;
|
||||||
|
@ -1435,13 +1435,19 @@ js_InternalInterpret(void *returnData, void *returnType, void *returnReg, js::VM
|
|||||||
*/
|
*/
|
||||||
if (!CheckStackQuota(f))
|
if (!CheckStackQuota(f))
|
||||||
return js_InternalThrow(f);
|
return js_InternalThrow(f);
|
||||||
|
|
||||||
|
SetValueRangeToUndefined(fp->slots(), script->nfixed);
|
||||||
|
|
||||||
if (fp->fun()->isHeavyweight()) {
|
if (fp->fun()->isHeavyweight()) {
|
||||||
if (!js::CreateFunCallObject(cx, fp))
|
if (!js::CreateFunCallObject(cx, fp))
|
||||||
return js_InternalThrow(f);
|
return js_InternalThrow(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
}
|
||||||
|
|
||||||
|
case REJOIN_CREATE_CALL_OBJECT: {
|
||||||
fp->scopeChain();
|
fp->scopeChain();
|
||||||
SetValueRangeToUndefined(fp->slots(), script->nfixed);
|
|
||||||
|
|
||||||
/* Construct the 'this' object for the frame if necessary. */
|
/* Construct the 'this' object for the frame if necessary. */
|
||||||
if (!ScriptPrologueOrGeneratorResume(cx, fp, types::UseNewTypeAtEntry(cx, fp)))
|
if (!ScriptPrologueOrGeneratorResume(cx, fp, types::UseNewTypeAtEntry(cx, fp)))
|
||||||
|
@ -289,6 +289,9 @@ enum RejoinState {
|
|||||||
*/
|
*/
|
||||||
REJOIN_CHECK_ARGUMENTS,
|
REJOIN_CHECK_ARGUMENTS,
|
||||||
|
|
||||||
|
/* A GC while making a call object occurred, discarding the script's jitcode. */
|
||||||
|
REJOIN_CREATE_CALL_OBJECT,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* State after calling a stub which returns a JIT code pointer for a call
|
* State after calling a stub which returns a JIT code pointer for a call
|
||||||
* or NULL for an already-completed call.
|
* or NULL for an already-completed call.
|
||||||
|
Loading…
Reference in New Issue
Block a user