Diff
Modified: trunk/Tools/ChangeLog (222198 => 222199)
--- trunk/Tools/ChangeLog 2017-09-19 02:55:33 UTC (rev 222198)
+++ trunk/Tools/ChangeLog 2017-09-19 03:19:22 UTC (rev 222199)
@@ -1,3 +1,32 @@
+2017-09-18 Filip Pizlo <[email protected]>
+
+ WSL prepare() should cache the parsed standard library
+ https://bugs.webkit.org/show_bug.cgi?id=177118
+
+ Reviewed by Myles Maxfield.
+
+ The execution time of Test.js is too damn high!
+
+ So I made it 2x faster by caching the parsed standard library.
+
+ * WebGPUShadingLanguageRI/All.js:
+ * WebGPUShadingLanguageRI/CloneProgram.js: Added.
+ (cloneProgram):
+ * WebGPUShadingLanguageRI/Prepare.js:
+ (let.prepare):
+ (prepare): Deleted.
+ * WebGPUShadingLanguageRI/StatementCloner.js: Added.
+ (StatementCloner.prototype.visitFuncDef):
+ (StatementCloner.prototype.visitNativeFunc):
+ (StatementCloner.prototype.visitNativeType):
+ (StatementCloner.prototype.visitTypeDef):
+ (StatementCloner.prototype.visitStructType):
+ (StatementCloner.prototype.visitConstexprTypeParameter):
+ (StatementCloner.prototype.visitProtocolDecl):
+ * WebGPUShadingLanguageRI/Test.html:
+ * WebGPUShadingLanguageRI/Test.js:
+ (doTest):
+
2017-09-18 Michael Catanzaro <[email protected]>
[CMake] Rename WebKit target to WebKitLegacy and rename WebKit2 target to WebKit
Modified: trunk/Tools/WebGPUShadingLanguageRI/All.js (222198 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-09-19 02:55:33 UTC (rev 222198)
+++ trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-09-19 03:19:22 UTC (rev 222199)
@@ -54,6 +54,7 @@
load("CheckUnreachableCode.js");
load("CheckWrapped.js");
load("Checker.js");
+load("CloneProgram.js");
load("CommaExpression.js");
load("ConstexprTypeParameter.js");
load("Continue.js");
@@ -129,6 +130,7 @@
load("ReturnChecker.js");
load("ReturnException.js");
load("StandardLibrary.js");
+load("StatementCloner.js");
load("StructLayoutBuilder.js");
load("StructType.js");
load("Substitution.js");
Added: trunk/Tools/WebGPUShadingLanguageRI/CloneProgram.js (0 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/CloneProgram.js (rev 0)
+++ trunk/Tools/WebGPUShadingLanguageRI/CloneProgram.js 2017-09-19 03:19:22 UTC (rev 222199)
@@ -0,0 +1,38 @@
+/*
+ * 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";
+
+// This is only currently used to clone programs just after parsing, so it doesn't really need to be
+// able to handle all aspects of what Rewriter would need to do.
+
+function cloneProgram(program)
+{
+ let result = new Program();
+ let cloner = new StatementCloner();
+ for (let statement of program.topLevelStatements)
+ result.add(statement.visit(cloner));
+ return result;
+}
+
Modified: trunk/Tools/WebGPUShadingLanguageRI/Prepare.js (222198 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/Prepare.js 2017-09-19 02:55:33 UTC (rev 222198)
+++ trunk/Tools/WebGPUShadingLanguageRI/Prepare.js 2017-09-19 03:19:22 UTC (rev 222199)
@@ -24,39 +24,44 @@
*/
"use strict";
-function prepare(origin, lineNumberOffset, text)
-{
- let program = new Program();
-
- parse(program, "/internal/stdlib", "native", 27, standardLibrary);
- parse(program, origin, "user", lineNumberOffset, text);
-
- let nameResolver = createNameResolver(program);
- resolveNamesInTypes(program, nameResolver);
- resolveNamesInProtocols(program, nameResolver);
- resolveTypeDefsInTypes(program);
- resolveTypeDefsInProtocols(program);
- // FIXME: Need to verify that structre are not cyclic.
- // https://bugs.webkit.org/show_bug.cgi?id=177044
- synthesizeStructAccessors(program);
- resolveNamesInFunctions(program, nameResolver);
- resolveTypeDefsInFunctions(program);
-
- flattenProtocolExtends(program);
- check(program);
- checkLiteralTypes(program);
- resolveProperties(program);
- findHighZombies(program);
- checkLiteralTypes(program);
- checkProgramWrapped(program);
- checkReturns(program);
- checkUnreachableCode(program);
- checkLoops(program);
- checkRecursion(program);
- checkProgramWrapped(program);
- findHighZombies(program);
- inline(program);
-
- return program;
-}
+let prepare = (() => {
+ let standardProgram;
+ return (origin, lineNumberOffset, text) => {
+ if (!standardProgram) {
+ standardProgram = new Program();
+ parse(standardProgram, "/internal/stdlib", "native", 27, standardLibrary);
+ }
+
+ let program = cloneProgram(standardProgram);
+ parse(program, origin, "user", lineNumberOffset, text);
+
+ let nameResolver = createNameResolver(program);
+ resolveNamesInTypes(program, nameResolver);
+ resolveNamesInProtocols(program, nameResolver);
+ resolveTypeDefsInTypes(program);
+ resolveTypeDefsInProtocols(program);
+ // FIXME: Need to verify that structre are not cyclic.
+ // https://bugs.webkit.org/show_bug.cgi?id=177044
+ synthesizeStructAccessors(program);
+ resolveNamesInFunctions(program, nameResolver);
+ resolveTypeDefsInFunctions(program);
+
+ flattenProtocolExtends(program);
+ check(program);
+ checkLiteralTypes(program);
+ resolveProperties(program);
+ findHighZombies(program);
+ checkLiteralTypes(program);
+ checkProgramWrapped(program);
+ checkReturns(program);
+ checkUnreachableCode(program);
+ checkLoops(program);
+ checkRecursion(program);
+ checkProgramWrapped(program);
+ findHighZombies(program);
+ inline(program);
+
+ return program;
+ };
+})();
Added: trunk/Tools/WebGPUShadingLanguageRI/StatementCloner.js (0 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/StatementCloner.js (rev 0)
+++ trunk/Tools/WebGPUShadingLanguageRI/StatementCloner.js 2017-09-19 03:19:22 UTC (rev 222199)
@@ -0,0 +1,113 @@
+/*
+ * 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 StatementCloner extends Rewriter {
+ visitFuncDef(node)
+ {
+ let result = new FuncDef(
+ node.origin, node.name,
+ node.returnType.visit(this),
+ node.typeParameters.map(typeParameter => typeParameter.visit(this)),
+ node.parameters.map(parameter => parameter.visit(this)),
+ node.body.visit(this),
+ node.isCast, node.shaderType);
+ result.isRestricted = node.isRestricted;
+ return result;
+ }
+
+ visitNativeFunc(node)
+ {
+ let result = new NativeFunc(
+ node.origin, node.name,
+ node.returnType.visit(this),
+ node.typeParameters.map(typeParameter => typeParameter.visit(this)),
+ node.parameters.map(parameter => parameter.visit(this)),
+ node.isCast, node.shaderType);
+ result.isRestricted = node.isRestricted;
+ return result;
+ }
+
+ visitNativeType(node)
+ {
+ return new NativeType(
+ node.origin, node.name, node.isPrimitive,
+ node.typeParameters.map(typeParameter => typeParameter.visit(this)));
+ }
+
+ visitTypeDef(node)
+ {
+ return new TypeDef(
+ node.origin, node.name,
+ node.typeParameters.map(typeParameter => typeParameter.visit(this)),
+ node.type.visit(this));
+ }
+
+ visitStructType(node)
+ {
+ let result = new StructType(
+ node.origin, node.name,
+ node.typeParameters.map(typeParameter => typeParameter.visit(this)));
+ for (let field of node.fields)
+ result.add(field.visit(this));
+ return result;
+ }
+
+ visitConstexprTypeParameter(node)
+ {
+ return new ConstexprTypeParameter(node.origin, node.name, node.type.visit(this));
+ }
+
+ visitProtocolDecl(node)
+ {
+ let result = new ProtocolDecl(node.origin, node.name);
+ for (let protocol of node.extends)
+ result.addExtends(protocol.visit(this));
+ for (let signature of node.signatures)
+ result.add(signature.visit(this));
+ return result;
+ }
+
+ visitTypeVariable(node)
+ {
+ return new TypeVariable(node.origin, node.name, Node.visit(node.protocol, this));
+ }
+
+ visitProtocolRef(node)
+ {
+ return new ProtocolRef(node.origin, node.name);
+ }
+
+ visitBoolLiteral(node)
+ {
+ return new BoolLiteral(node.origin, node.value);
+ }
+
+ visitTypeOrVariableRef(node)
+ {
+ return new TypeOrVariableRef(node.origin, node.name);
+ }
+}
+
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.html (222198 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.html 2017-09-19 02:55:33 UTC (rev 222198)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.html 2017-09-19 03:19:22 UTC (rev 222199)
@@ -31,6 +31,7 @@
<script src=""
<script src=""
<script src=""
+<script src=""
<script src=""
<script src=""
<script src=""
@@ -107,6 +108,7 @@
<script src=""
<script src=""
<script src=""
+<script src=""
<script src=""
<script src=""
<script src=""
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (222198 => 222199)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-19 02:55:33 UTC (rev 222198)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-19 03:19:22 UTC (rev 222199)
@@ -3914,9 +3914,9 @@
for (let s in object) {
if (s.startsWith("TEST_") && s.match(filter)) {
print(s + "...");
+ yield;
object[s]();
print(" OK!");
- yield;
}
}