Skip to content

Commit f3632d9

Browse files
committed
[1.10>master] [MERGE #5471 @aneeshdk] Fixing an issue with super restriction state in undodefer case
Merge pull request #5471 from aneeshdk:users/aneeshd/SuperUndoDeferIssue We currently store the status of whether super call is allowed or super property is allowed in the Parser. Because of this when we do an undodefer of a member function that state information gets lost. This change is to put that information in the function node itself and use it from there while parsing super references.
2 parents 8dae18a + 0a1d70b commit f3632d9

File tree

6 files changed

+65
-77
lines changed

6 files changed

+65
-77
lines changed

lib/Parser/Parse.cpp

Lines changed: 25 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ Parser::Parser(Js::ScriptContext* scriptContext, BOOL strictMode, PageAllocator
9797
m_funcInArray(0),
9898
m_scopeCountNoAst(0),
9999

100-
m_parsingSuperRestrictionState(ParsingSuperRestrictionState_SuperDisallowed),
101-
102100
m_funcParenExprDepth(0),
103101
m_deferEllipsisError(false),
104102
m_deferEllipsisErrorLoc(), // calls default initializer
@@ -330,11 +328,6 @@ HRESULT Parser::ParseSourceInternal(
330328

331329
try
332330
{
333-
if ((grfscr & fscrEvalCode) != 0)
334-
{
335-
this->m_parsingSuperRestrictionState = Parser::ParsingSuperRestrictionState_SuperPropertyAllowed;
336-
}
337-
338331
if ((grfscr & fscrIsModuleCode) != 0)
339332
{
340333
// Module source flag should not be enabled unless module is enabled
@@ -963,6 +956,7 @@ ParseNodeProg * Parser::CreateProgNode(bool isModuleSource, ULONG lineNumber)
963956
pnodeProg->cbStringMin = pnodeProg->cbMin;
964957
pnodeProg->lineNumber = lineNumber;
965958
pnodeProg->homeObjLocation = Js::Constants::NoRegister;
959+
pnodeProg->superRestrictionState = SuperRestrictionState::Disallowed;
966960
return pnodeProg;
967961
}
968962

@@ -3052,7 +3046,7 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall,
30523046
{
30533047
Assert((stub->fncFlags & kFunctionIsLambda) == kFunctionIsLambda);
30543048

3055-
pnode = ParseFncDeclCheckScope<true>(fFncLambda, /* resetParsingSuperRestrictionState*/ false);
3049+
pnode = ParseFncDeclCheckScope<true>(fFncLambda);
30563050
break;
30573051
}
30583052
}
@@ -3320,7 +3314,7 @@ ParseNodePtr Parser::ParseTerm(BOOL fAllowCall,
33203314
{
33213315
flags |= fFncAsync;
33223316
}
3323-
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, pNameHint, false, true, fUnaryOrParen);
3317+
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::Disallowed, pNameHint, false, true, fUnaryOrParen);
33243318
if (isAsyncExpr)
33253319
{
33263320
pnode->AsParseNodeFnc()->cbStringMin = iecpMin;
@@ -4287,10 +4281,8 @@ ParseNodeBin * Parser::ParseMemberGetSet(OpCode nop, LPCOLESTR* ppNameHint, size
42874281
flags |= fFncOneArg;
42884282
}
42894283

4290-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4291-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
4292-
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(flags, *ppNameHint,
4293-
/*needsPIDOnRCurlyScan*/ false, /*resetParsingSuperRestrictionState*/ false);
4284+
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::PropertyAllowed, *ppNameHint,
4285+
/*needsPIDOnRCurlyScan*/ false);
42944286

42954287
pnodeFnc->cbStringMin = iecpMin;
42964288

@@ -4630,10 +4622,8 @@ ParseNodePtr Parser::ParseMemberList(LPCOLESTR pNameHint, uint32* pNameHintLengt
46304622
// Rewind to the PID and parse a function expression.
46314623
this->GetScanner()->SeekTo(atPid);
46324624

4633-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4634-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
4635-
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isAsyncMethod ? fFncAsync : fFncNoFlgs), pFullNameHint,
4636-
/*needsPIDOnRCurlyScan*/ false, /*resetParsingSuperRestrictionState*/ false);
4625+
ParseNodeFnc * pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isAsyncMethod ? fFncAsync : fFncNoFlgs), SuperRestrictionState::PropertyAllowed, pFullNameHint,
4626+
/*needsPIDOnRCurlyScan*/ false);
46374627

46384628
if (isAsyncMethod || isGenerator)
46394629
{
@@ -4862,7 +4852,7 @@ BOOL Parser::IsDeferredFnc()
48624852
}
48634853

48644854
template<bool buildAST>
4865-
ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperRestrictionState, bool fAllowIn)
4855+
ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool fAllowIn)
48664856
{
48674857
ParseNodeBlock * pnodeFncBlockScope = nullptr;
48684858
ParseNodePtr *ppnodeScopeSave = nullptr;
@@ -4890,7 +4880,7 @@ ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperR
48904880
}
48914881
}
48924882

4893-
ParseNodeFnc * pnodeFnc = ParseFncDeclInternal<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan */ false, resetParsingSuperRestrictionState, /* fUnaryOrParen */ false, noStmtContext, fAllowIn);
4883+
ParseNodeFnc * pnodeFnc = ParseFncDeclInternal<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan */ false, /* fUnaryOrParen */ false, noStmtContext, SuperRestrictionState::Disallowed, fAllowIn);
48944884

48954885
if (pnodeFncBlockScope)
48964886
{
@@ -4909,22 +4899,15 @@ ParseNode * Parser::ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperR
49094899
}
49104900

49114901
template<bool buildAST>
4912-
ParseNodeFnc * Parser::ParseFncDeclNoCheckScope(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool fAllowIn)
4902+
ParseNodeFnc * Parser::ParseFncDeclNoCheckScope(ushort flags, SuperRestrictionState::State superRestrictionState, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool fAllowIn)
49134903
{
49144904
Assert((flags & fFncDeclaration) == 0);
4915-
return ParseFncDeclInternal<buildAST>(flags, pNameHint, needsPIDOnRCurlyScan, resetParsingSuperRestrictionState, fUnaryOrParen, /* noStmtContext */ false, fAllowIn);
4905+
return ParseFncDeclInternal<buildAST>(flags, pNameHint, needsPIDOnRCurlyScan, fUnaryOrParen, /* noStmtContext */ false, superRestrictionState, fAllowIn);
49164906
}
49174907

49184908
template<bool buildAST>
4919-
ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool noStmtContext, bool fAllowIn)
4909+
ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool noStmtContext, SuperRestrictionState::State superRestrictionState, bool fAllowIn)
49204910
{
4921-
AutoParsingSuperRestrictionStateRestorer restorer(this);
4922-
if (resetParsingSuperRestrictionState)
4923-
{
4924-
// ParseFncDecl will always reset m_parsingSuperRestrictionState to super disallowed unless explicitly disabled
4925-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperDisallowed;
4926-
}
4927-
49284911
ParseNodeFnc * pnodeFnc = nullptr;
49294912
ParseNodePtr *ppnodeVarSave = nullptr;
49304913

@@ -4961,6 +4944,7 @@ ParseNodeFnc * Parser::ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, c
49614944
pnodeFnc->cbMin = this->GetScanner()->IecpMinTok();
49624945
pnodeFnc->cbStringMin = pnodeFnc->cbMin;
49634946
pnodeFnc->functionId = (*m_nextFunctionId)++;
4947+
pnodeFnc->superRestrictionState = superRestrictionState;
49644948

49654949

49664950
// Push new parser state with this new function node
@@ -6730,7 +6714,7 @@ void Parser::ParseFncFormals(ParseNodeFnc * pnodeFnc, ParseNodeFnc * pnodeParent
67306714
template<bool buildAST>
67316715
ParseNodePtr Parser::GenerateModuleFunctionWrapper()
67326716
{
6733-
ParseNodePtr pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fFncModule, nullptr, false, true, true);
6717+
ParseNodePtr pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fFncModule, SuperRestrictionState::Disallowed, nullptr, false, true, true);
67346718
ParseNodePtr callNode = CreateCallNode(knopCall, pnodeFnc, nullptr);
67356719

67366720
return callNode;
@@ -7420,24 +7404,6 @@ LPCOLESTR Parser::ConstructFinalHintNode(IdentPtr pClassName, IdentPtr pMemberNa
74207404
return pFinalName;
74217405
}
74227406

7423-
class AutoParsingSuperRestrictionStateRestorer
7424-
{
7425-
public:
7426-
AutoParsingSuperRestrictionStateRestorer(Parser* parser) : m_parser(parser)
7427-
{
7428-
AssertMsg(this->m_parser != nullptr, "This just should not happen");
7429-
this->m_originalParsingSuperRestrictionState = this->m_parser->m_parsingSuperRestrictionState;
7430-
}
7431-
~AutoParsingSuperRestrictionStateRestorer()
7432-
{
7433-
AssertMsg(this->m_parser != nullptr, "This just should not happen");
7434-
this->m_parser->m_parsingSuperRestrictionState = m_originalParsingSuperRestrictionState;
7435-
}
7436-
private:
7437-
Parser * m_parser;
7438-
int m_originalParsingSuperRestrictionState;
7439-
};
7440-
74417407
template<bool buildAST>
74427408
ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint, uint32 *pHintLength, uint32 *pShortNameOffset)
74437409
{
@@ -7646,12 +7612,11 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
76467612
}
76477613

76487614
{
7649-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7650-
this->m_parsingSuperRestrictionState = hasExtends ? ParsingSuperRestrictionState_SuperCallAndPropertyAllowed : ParsingSuperRestrictionState_SuperPropertyAllowed;
7615+
SuperRestrictionState::State state = hasExtends ? SuperRestrictionState::CallAndPropertyAllowed : SuperRestrictionState::PropertyAllowed;
76517616

76527617
// Add the class constructor flag and base class constructor flag if pnodeExtends is nullptr
76537618
fncDeclFlags |= fFncClassConstructor | (hasExtends ? kFunctionNone : fFncBaseClassConstructor);
7654-
pnodeConstructor = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, pConstructorName, /* needsPIDOnRCurlyScan */ true, /* resetParsingSuperRestrictionState = */false);
7619+
pnodeConstructor = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, state, pConstructorName, /* needsPIDOnRCurlyScan */ true);
76557620
}
76567621

76577622
if (pnodeConstructor->IsGenerator())
@@ -7713,11 +7678,8 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
77137678

77147679
ParseNodeFnc * pnodeFnc = nullptr;
77157680
{
7716-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7717-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
77187681
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags | (isGetter ? fFncNoArg : fFncOneArg),
7719-
pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true,
7720-
/* resetParsingSuperRestrictionState */false);
7682+
SuperRestrictionState::PropertyAllowed, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true);
77217683
}
77227684

77237685
pnodeFnc->SetIsStaticMember(isStatic);
@@ -7745,14 +7707,11 @@ ParseNodeClass * Parser::ParseClassDecl(BOOL isDeclaration, LPCOLESTR pNameHint,
77457707

77467708
ParseNodeFnc * pnodeFnc = nullptr;
77477709
{
7748-
AutoParsingSuperRestrictionStateRestorer restorer(this);
7749-
this->m_parsingSuperRestrictionState = ParsingSuperRestrictionState_SuperPropertyAllowed;
7750-
77517710
if (isAsyncMethod)
77527711
{
77537712
fncDeclFlags |= fFncAsync;
77547713
}
7755-
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true, /* resetParsingSuperRestrictionState */false);
7714+
pnodeFnc = ParseFncDeclNoCheckScope<buildAST>(fncDeclFlags, SuperRestrictionState::PropertyAllowed, pidHint ? pidHint->Psz() : nullptr, /* needsPIDOnRCurlyScan */ true);
77567715
if (isAsyncMethod)
77577716
{
77587717
pnodeFnc->cbMin = iecpMin;
@@ -8871,7 +8830,7 @@ ParseNodePtr Parser::ParseExpr(int oplMin,
88718830
this->GetScanner()->SeekTo(termStart);
88728831
}
88738832
}
8874-
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, nullptr, /* needsPIDOnRCurlyScan = */false, /* resetParsingSuperRestrictionState = */false, /* fUnaryOrParen = */ false, fAllowIn);
8833+
pnode = ParseFncDeclNoCheckScope<buildAST>(flags, SuperRestrictionState::Disallowed, nullptr, /* needsPIDOnRCurlyScan = */false, /* fUnaryOrParen = */ false, fAllowIn);
88758834
if (isAsyncMethod)
88768835
{
88778836
pnode->AsParseNodeFnc()->cbStringMin = iecpMin;
@@ -11507,7 +11466,7 @@ ParseNodeProg * Parser::Parse(LPCUTF8 pszSrc, size_t offset, size_t length, char
1150711466
flags |= fFncLambda;
1150811467
}
1150911468

11510-
ParseNode * pnodeFnc = ParseFncDeclCheckScope<true>(flags, /* resetParsingSuperRestrictionState*/ false);
11469+
ParseNode * pnodeFnc = ParseFncDeclCheckScope<true>(flags);
1151111470
pnodeProg->pnodeBody = nullptr;
1151211471
AddToNodeList(&pnodeProg->pnodeBody, &lastNodeRef, pnodeFnc);
1151311472

@@ -12314,6 +12273,7 @@ template <bool buildAST>
1231412273
IdentPtr Parser::ParseSuper(bool fAllowCall)
1231512274
{
1231612275
ParseNodeFnc * currentNodeFunc = GetCurrentFunctionNode();
12276+
ParseNodeFnc * currentNonLambdaFunc = GetCurrentNonLambdaFunctionNode();
1231712277
IdentPtr superPid = nullptr;
1231812278

1231912279
switch (m_token.tk)
@@ -12345,12 +12305,14 @@ IdentPtr Parser::ParseSuper(bool fAllowCall)
1234512305
{
1234612306
Error(ERRInvalidSuper); // new super() is not allowed
1234712307
}
12348-
else if (this->m_parsingSuperRestrictionState == ParsingSuperRestrictionState_SuperCallAndPropertyAllowed)
12308+
else if ((currentNodeFunc->IsConstructor() && currentNodeFunc->superRestrictionState == SuperRestrictionState::CallAndPropertyAllowed)
12309+
|| (currentNonLambdaFunc != nullptr && currentNonLambdaFunc->superRestrictionState == SuperRestrictionState::CallAndPropertyAllowed))
1234912310
{
1235012311
// Any super access is good within a class constructor
1235112312
}
12352-
else if (this->m_parsingSuperRestrictionState == ParsingSuperRestrictionState_SuperPropertyAllowed)
12313+
else if ((this->m_grfscr & fscrEval) == fscrEval || currentNonLambdaFunc->superRestrictionState == SuperRestrictionState::PropertyAllowed)
1235312314
{
12315+
// Currently for eval cases during compile time we use propertyallowed and throw during runtime for error cases
1235412316
if (m_token.tk == tkLParen)
1235512317
{
1235612318
if ((this->m_grfscr & fscrEval) == fscrNil)

lib/Parser/Parse.h

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -493,15 +493,6 @@ class Parser
493493
charcount_t m_funcInArray;
494494
uint m_scopeCountNoAst;
495495

496-
/*
497-
* Parsing states for super restriction
498-
*/
499-
static const uint ParsingSuperRestrictionState_SuperDisallowed = 0;
500-
static const uint ParsingSuperRestrictionState_SuperCallAndPropertyAllowed = 1;
501-
static const uint ParsingSuperRestrictionState_SuperPropertyAllowed = 2;
502-
uint m_parsingSuperRestrictionState;
503-
friend class AutoParsingSuperRestrictionStateRestorer;
504-
505496
// Used for issuing spread and rest errors when there is ambiguity with lambda parameter lists and parenthesized expressions
506497
uint m_funcParenExprDepth;
507498
bool m_deferEllipsisError;
@@ -829,9 +820,9 @@ class Parser
829820

830821
template<bool buildAST> void ParseComputedName(ParseNodePtr* ppnodeName, LPCOLESTR* ppNameHint, LPCOLESTR* ppFullNameHint = nullptr, uint32 *pNameLength = nullptr, uint32 *pShortNameOffset = nullptr);
831822
template<bool buildAST> ParseNodeBin * ParseMemberGetSet(OpCode nop, LPCOLESTR* ppNameHint,size_t iecpMin, charcount_t ichMin);
832-
template<bool buildAST> ParseNode * ParseFncDeclCheckScope(ushort flags, bool resetParsingSuperRestrictionState = true, bool fAllowIn = true);
833-
template<bool buildAST> ParseNodeFnc * ParseFncDeclNoCheckScope(ushort flags, LPCOLESTR pNameHint = nullptr, const bool needsPIDOnRCurlyScan = false, bool resetParsingSuperRestrictionState = true, bool fUnaryOrParen = false, bool fAllowIn = true);
834-
template<bool buildAST> ParseNodeFnc * ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool resetParsingSuperRestrictionState, bool fUnaryOrParen, bool noStmtContext, bool fAllowIn = true);
823+
template<bool buildAST> ParseNode * ParseFncDeclCheckScope(ushort flags, bool fAllowIn = true);
824+
template<bool buildAST> ParseNodeFnc * ParseFncDeclNoCheckScope(ushort flags, SuperRestrictionState::State superRestrictionState = SuperRestrictionState::Disallowed, LPCOLESTR pNameHint = nullptr, const bool needsPIDOnRCurlyScan = false, bool fUnaryOrParen = false, bool fAllowIn = true);
825+
template<bool buildAST> ParseNodeFnc * ParseFncDeclInternal(ushort flags, LPCOLESTR pNameHint, const bool needsPIDOnRCurlyScan, bool fUnaryOrParen, bool noStmtContext, SuperRestrictionState::State superRestrictionState = SuperRestrictionState::Disallowed, bool fAllowIn = true);
835826
template<bool buildAST> void ParseFncName(ParseNodeFnc * pnodeFnc, ushort flags, IdentPtr* pFncNamePid = nullptr);
836827
template<bool buildAST> void ParseFncFormals(ParseNodeFnc * pnodeFnc, ParseNodeFnc * pnodeParentFnc, ushort flags, bool isTopLevelDeferredFunc = false);
837828
template<bool buildAST> void ParseFncDeclHelper(ParseNodeFnc * pnodeFnc, LPCOLESTR pNameHint, ushort flags, bool fUnaryOrParen, bool noStmtContext, bool *pNeedScanRCurly, bool skipFormals = false, IdentPtr* pFncNamePid = nullptr, bool fAllowIn = true);

lib/Parser/ptree.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,8 @@ ParseNodeFnc::ParseNodeFnc(OpCode nop, charcount_t ichMin, charcount_t ichLim)
434434
#endif
435435
this->pRestorePoint = nullptr;
436436
this->deferredStub = nullptr;
437-
438437
this->capturedNames = nullptr;
438+
this->superRestrictionState = SuperRestrictionState::Disallowed;
439439
}
440440

441441
ParseNodeClass::ParseNodeClass(OpCode nop, charcount_t ichMin, charcount_t ichLim)

lib/Parser/ptree.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,14 @@ enum FncFlags : uint
455455
struct RestorePoint;
456456
struct DeferredFunctionStub;
457457

458+
namespace SuperRestrictionState {
459+
enum State {
460+
Disallowed = 0,
461+
CallAndPropertyAllowed = 1,
462+
PropertyAllowed = 2
463+
};
464+
}
465+
458466
// function declaration
459467
class ParseNodeFnc : public ParseNode
460468
{
@@ -504,6 +512,8 @@ class ParseNodeFnc : public ParseNode
504512

505513
static const int32 MaxStackClosureAST = 800000;
506514

515+
SuperRestrictionState::State superRestrictionState;
516+
507517
static bool CanBeRedeferred(FncFlags flags) { return !(flags & (kFunctionIsGenerator | kFunctionIsAsync)); }
508518

509519
private:

test/Bugs/SuperUndoDeferIssue.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
var obj = {
7+
mSloppy() {
8+
try {
9+
super[
10+
__v_12000] = 55;
11+
} catch (__v_12004) {
12+
}
13+
try {
14+
} catch (__v_12005) {
15+
}
16+
}
17+
};
18+
// There shouldn't be any SyntaxError
19+
print("PASSED");

test/Bugs/rlexe.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,5 +505,11 @@
505505
<default>
506506
<files>bug_OS17614914.js</files>
507507
</default>
508-
</test>
508+
</test>
509+
<test>
510+
<default>
511+
<files>SuperUndoDeferIssue.js</files>
512+
<compile-flags>-forceundodefer</compile-flags>
513+
</default>
514+
</test>
509515
</regress-exe>

0 commit comments

Comments
 (0)