@@ -234,7 +234,7 @@ CmdLineArgsParser::ParseInteger()
234234// /----------------------------------------------------------------------------
235235
236236void
237- CmdLineArgsParser::ParseRange (Js::Range *pRange)
237+ CmdLineArgsParser::ParseRange (Js::Range *pRange, Js::Range *oppositeRange )
238238{
239239 SourceFunctionNode r1 = ParseSourceFunctionIds ();
240240 SourceFunctionNode r2;
@@ -254,12 +254,12 @@ CmdLineArgsParser::ParseRange(Js::Range *pRange)
254254 throw Exception (_u (" Left functionId must be smaller than the Right functionId when Source file is the same" ));
255255 }
256256
257- pRange->Add (r1, r2);
257+ pRange->Add (r1, r2, oppositeRange );
258258 switch (CurChar ())
259259 {
260260 case ' ,' :
261261 NextChar ();
262- ParseRange (pRange);
262+ ParseRange (pRange, oppositeRange );
263263 break ;
264264
265265 case ' ' :
@@ -272,14 +272,14 @@ CmdLineArgsParser::ParseRange(Js::Range *pRange)
272272 break ;
273273
274274 case ' ,' :
275- pRange->Add (r1);
275+ pRange->Add (r1, oppositeRange );
276276 NextChar ();
277- ParseRange (pRange);
277+ ParseRange (pRange, oppositeRange );
278278 break ;
279279
280280 case ' ' :
281281 case 0 :
282- pRange->Add (r1);
282+ pRange->Add (r1, oppositeRange );
283283 break ;
284284
285285 default :
@@ -350,7 +350,7 @@ CmdLineArgsParser::ParseNumberRange(Js::NumberRange *pRange)
350350// /----------------------------------------------------------------------------
351351
352352void
353- CmdLineArgsParser::ParsePhase (Js::Phases *pPhaseList)
353+ CmdLineArgsParser::ParsePhase (Js::Phases *pPhaseList, Js::Phases *oppositePhase )
354354{
355355 char16 buffer[MaxTokenSize];
356356 ZeroMemory (buffer, sizeof (buffer));
@@ -365,14 +365,32 @@ CmdLineArgsParser::ParsePhase(Js::Phases *pPhaseList)
365365 switch (CurChar ())
366366 {
367367 case ' :' :
368+ {
368369 NextChar ();
369- ParseRange (pPhaseList->GetRange (phase));
370+ Js::Range* oppositeRange = nullptr ;
371+ if (oppositePhase && oppositePhase->IsEnabled (phase))
372+ {
373+ oppositeRange = oppositePhase->GetRange (phase);
374+ }
375+ ParseRange (pPhaseList->GetRange (phase), oppositeRange);
370376 break ;
377+ }
371378 case ' ,' :
372379 NextChar ();
373- ParsePhase (pPhaseList);
380+ if (oppositePhase)
381+ {
382+ // The whole phase is turned on/off so disable the opposite
383+ oppositePhase->Disable (phase);
384+ }
385+ ParsePhase (pPhaseList, oppositePhase);
374386 break ;
375387 default :
388+ if (oppositePhase)
389+ {
390+ // The whole phase is turned on/off so disable the opposite
391+ oppositePhase->Disable (phase);
392+ }
393+ pPhaseList->GetRange (phase)->Clear ();
376394 break ;
377395 }
378396}
@@ -512,8 +530,17 @@ CmdLineArgsParser::ParseFlag()
512530 switch (flagType)
513531 {
514532 case FlagPhases:
515- ParsePhase (this ->flagTable .GetAsPhase (flag));
533+ {
534+ Flag oppositeFlag = this ->flagTable .GetOppositePhaseFlag (flag);
535+ Phases* oppositePhase = nullptr ;
536+ if (oppositeFlag != InvalidFlag)
537+ {
538+ this ->flagTable .Enable (oppositeFlag);
539+ oppositePhase = this ->flagTable .GetAsPhase (oppositeFlag);
540+ }
541+ ParsePhase (this ->flagTable .GetAsPhase (flag), oppositePhase);
516542 break ;
543+ }
517544
518545 case FlagString:
519546 *this ->flagTable .GetAsString (flag) = ParseString (buffer, MaxTokenSize, false );
0 commit comments