Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / LoopChecker.js
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25 "use strict";
26
27 class LoopChecker extends Visitor {
28     constructor()
29     {
30         super();
31         this._loopDepth = 0;
32         this._switchDepth = 0;
33     }
34
35     visitFuncDef(node)
36     {
37         if (this._loopDepth != 0)
38             throw new WTypeError(node.origin.originString, "LoopChecker does not understand nested functions.");
39         super.visitFuncDef(node);
40     }
41
42     visitWhileLoop(node)
43     {
44         node.conditional.visit(this);
45         ++this._loopDepth;
46         node.body.visit(this);
47         if (this._loopDepth == 0)
48             throw new WTypeError(node.origin.originString, "The number of nested loops is negative!");
49         --this._loopDepth;
50     }
51
52     visitDoWhileLoop(node)
53     {
54         ++this._loopDepth;
55         node.body.visit(this);
56         if (this._loopDepth == 0)
57             throw new WTypeError(node.origin.originString, "The number of nested loops is negative!");
58         --this._loopDepth;
59         node.conditional.visit(this);
60     }
61
62     visitForLoop(node)
63     {
64         if (node.initialization)
65             node.initialization.visit(this);
66         if (node.condition)
67             node.condition.visit(this);
68         if (node.increment)
69             node.increment.visit(this);
70         ++this._loopDepth;
71         node.body.visit(this);
72         if (this._loopDepth == 0)
73             throw new WTypeError(node.origin.originString, "The number of nested loops is negative!");
74         --this._loopDepth;
75     }
76     
77     visitSwitchStatement(node)
78     {
79         node.value.visit(this);
80         this._switchDepth++;
81         for (let switchCase of node.switchCases)
82             switchCase.visit(this);
83         this._switchDepth--;
84     }
85     
86     visitBreak(node)
87     {
88         if (this._loopDepth == 0 && this._switchDepth == 0)
89             throw new WTypeError(node.origin.originString, "Break statement without enclosing loop or switch!");
90         super.visitBreak(node);
91     }
92     
93     visitContinue(node)
94     {
95         if (this._loopDepth == 0)
96             throw new WTypeError(node.origin.originString, "Continue statement without enclosing loop!");
97         super.visitContinue(node);
98     }
99 }