- Revision
- 221750
- Author
- [email protected]
- Date
- 2017-09-07 12:56:03 -0700 (Thu, 07 Sep 2017)
Log Message
WSL should check recursion
https://bugs.webkit.org/show_bug.cgi?id=176553
Reviewed by Michael Saboff and Mark Lam.
This adds a recursion checker. Previously, we would only check for recursion during inlining, but that
generally only happens when we call the function.
* WebGPUShadingLanguageRI/All.js:
* WebGPUShadingLanguageRI/CheckRecursion.js: Added.
(checkRecursion):
* WebGPUShadingLanguageRI/Prepare.js:
(prepare):
* WebGPUShadingLanguageRI/RecursionChecker.js: Added.
(RecursionChecker):
(RecursionChecker.prototype.visitFuncDef):
(RecursionChecker.prototype.visitCallExpression):
* WebGPUShadingLanguageRI/Test.html:
* WebGPUShadingLanguageRI/Test.js:
(TEST_simpleRecursion):
Modified Paths
Added Paths
Diff
Modified: trunk/Tools/ChangeLog (221749 => 221750)
--- trunk/Tools/ChangeLog 2017-09-07 19:51:58 UTC (rev 221749)
+++ trunk/Tools/ChangeLog 2017-09-07 19:56:03 UTC (rev 221750)
@@ -1,3 +1,26 @@
+2017-09-07 Filip Pizlo <[email protected]>
+
+ WSL should check recursion
+ https://bugs.webkit.org/show_bug.cgi?id=176553
+
+ Reviewed by Michael Saboff and Mark Lam.
+
+ This adds a recursion checker. Previously, we would only check for recursion during inlining, but that
+ generally only happens when we call the function.
+
+ * WebGPUShadingLanguageRI/All.js:
+ * WebGPUShadingLanguageRI/CheckRecursion.js: Added.
+ (checkRecursion):
+ * WebGPUShadingLanguageRI/Prepare.js:
+ (prepare):
+ * WebGPUShadingLanguageRI/RecursionChecker.js: Added.
+ (RecursionChecker):
+ (RecursionChecker.prototype.visitFuncDef):
+ (RecursionChecker.prototype.visitCallExpression):
+ * WebGPUShadingLanguageRI/Test.html:
+ * WebGPUShadingLanguageRI/Test.js:
+ (TEST_simpleRecursion):
+
2017-09-07 Chris Dumez <[email protected]>
[WK2] Notify client when downloads are redirected
Modified: trunk/Tools/WebGPUShadingLanguageRI/All.js (221749 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-09-07 19:51:58 UTC (rev 221749)
+++ trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-09-07 19:56:03 UTC (rev 221750)
@@ -44,6 +44,7 @@
load("CastExpression.js");
load("Check.js");
load("CheckLiteralTypes.js");
+load("CheckRecursion.js");
load("CheckReturns.js");
load("CheckUnreachableCode.js");
load("Checker.js");
@@ -91,6 +92,7 @@
load("ProtocolFuncDecl.js");
load("ProtocolRef.js");
load("PtrType.js");
+load("RecursionChecker.js");
load("ResolveNames.js");
load("ResolveOverloadImpl.js");
load("ResolveTypeDefs.js");
Added: trunk/Tools/WebGPUShadingLanguageRI/CheckRecursion.js (0 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/CheckRecursion.js (rev 0)
+++ trunk/Tools/WebGPUShadingLanguageRI/CheckRecursion.js 2017-09-07 19:56:03 UTC (rev 221750)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+"use strict";
+
+function checkRecursion(program)
+{
+ program.visit(new RecursionChecker(program));
+}
+
Modified: trunk/Tools/WebGPUShadingLanguageRI/Prepare.js (221749 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/Prepare.js 2017-09-07 19:51:58 UTC (rev 221749)
+++ trunk/Tools/WebGPUShadingLanguageRI/Prepare.js 2017-09-07 19:56:03 UTC (rev 221750)
@@ -36,6 +36,7 @@
checkLiteralTypes(program);
checkReturns(program);
checkUnreachableCode(program);
+ checkRecursion(program);
inline(program);
return program;
}
Added: trunk/Tools/WebGPUShadingLanguageRI/RecursionChecker.js (0 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/RecursionChecker.js (rev 0)
+++ trunk/Tools/WebGPUShadingLanguageRI/RecursionChecker.js 2017-09-07 19:56:03 UTC (rev 221750)
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+"use strict";
+
+class RecursionChecker extends Visitor {
+ constructor()
+ {
+ super();
+ this._visiting = new VisitingSet();
+ }
+
+ visitFuncDef(node)
+ {
+ this._visiting.doVisit(node, () => super.visitFuncDef(node));
+ }
+
+ visitCallExpression(node)
+ {
+ node.func.visit(this);
+ }
+}
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.html (221749 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.html 2017-09-07 19:51:58 UTC (rev 221749)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.html 2017-09-07 19:56:03 UTC (rev 221750)
@@ -20,6 +20,7 @@
<script src=""
<script src=""
<script src=""
+<script src=""
<script src=""
<script src=""
<script src=""
@@ -67,6 +68,7 @@
<script src=""
<script src=""
<script src=""
+<script src=""
<script src=""
<script src=""
<script src=""
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (221749 => 221750)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-07 19:51:58 UTC (rev 221749)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-07 19:56:03 UTC (rev 221750)
@@ -989,6 +989,18 @@
checkBool(program, callFunction(program, "foo", [], [makeBool(program, false)]), false);
}
+function TEST_simpleRecursion()
+{
+ checkFail(
+ () => doPrep(`
+ void foo<T>(T x)
+ {
+ foo(&x);
+ }
+ `),
+ (e) => e instanceof WTypeError);
+}
+
function TEST_protocolMonoSigPolyDef()
{
let program = doPrep(`