Diff
Modified: trunk/Tools/ChangeLog (221447 => 221448)
--- trunk/Tools/ChangeLog 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/ChangeLog 2017-08-31 22:15:18 UTC (rev 221448)
@@ -1,5 +1,47 @@
2017-08-31 Filip Pizlo <fpi...@apple.com>
+ WSL EPtr does not need to carry around the type
+ https://bugs.webkit.org/show_bug.cgi?id=176188
+
+ Reviewed by Saam Barati.
+
+ To validate that the interpreter is modeling a statically typed execution environment, it's
+ really best if values don't know their types at all. A pointer is just a pointer (i.e a buffer
+ and offset in our world), and it's the job of the AST node that uses it to figure out what its
+ type should be.
+
+ I think this makes the code simpler overall.
+
+ * WebGPUShadingLanguageRI/All.js:
+ * WebGPUShadingLanguageRI/CallFunction.js:
+ (callFunctionByRef):
+ (callFunction):
+ * WebGPUShadingLanguageRI/Checker.js:
+ (Checker.prototype.visitProtocolDecl.set throw):
+ * WebGPUShadingLanguageRI/EBufferBuilder.js:
+ (EBufferBuilder.prototype._createEPtr):
+ * WebGPUShadingLanguageRI/EPtr.js:
+ (EPtr):
+ (EPtr.box):
+ (EPtr.prototype.copyFrom):
+ (EPtr.prototype.toString):
+ * WebGPUShadingLanguageRI/EValue.js: Removed.
+ * WebGPUShadingLanguageRI/Evaluator.js:
+ (Evaluator.prototype.visitFunctionLikeBlock):
+ (Evaluator.prototype.visitVariableDecl):
+ (Evaluator.prototype.visitAssignment):
+ (Evaluator.prototype.visitIntLiteral):
+ * WebGPUShadingLanguageRI/Intrinsics.js:
+ (Intrinsics):
+ * WebGPUShadingLanguageRI/Rewriter.js:
+ (Rewriter.prototype.visitAssignment):
+ * WebGPUShadingLanguageRI/StructType.js:
+ (StructType.prototype.instantiate):
+ * WebGPUShadingLanguageRI/Test.js:
+ (checkInt):
+
+2017-08-31 Filip Pizlo <fpi...@apple.com>
+
WSL doesn't need to wrap primitives like ints and floats in specialized classes like EInt and EFloat
https://bugs.webkit.org/show_bug.cgi?id=176184
Modified: trunk/Tools/WebGPUShadingLanguageRI/All.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/All.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -31,7 +31,6 @@
load("_expression_.js");
load("Rewriter.js");
load("Visitor.js");
-load("EValue.js");
load("AddressSpace.js");
load("ArrayRefType.js");
Modified: trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/CallFunction.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -27,18 +27,14 @@
// This allows you to pass structs and arrays in-place, but it's a more annoying API.
function callFunctionByRef(program, name, typeArguments, argumentList)
{
- let argumentTypes = argumentList.map(argument => {
- let result = argument.type.elementType;
- if (!result)
- throw new Error("Argument has no element type: " + argument);
- return result;
- });
+ let argumentTypes = argumentList.map(argument => argument.type);
let func = resolveInlinedFunction(program, name, typeArguments, argumentTypes);
if (!func)
throw new WTypeError("<callFunction>", "Cannot resolve function call " + name + "<" + typeArguments + ">(" + argumentList + ")");
for (let i = 0; i < func.parameters.length; ++i)
- func.parameters[i].ePtr.copyFrom(argumentList[i]);
- return new Evaluator(program).visitFunctionBody(func.body);
+ func.parameters[i].ePtr.copyFrom(argumentList[i].value, argumentTypes[i].size);
+ let result = new Evaluator(program).visitFunctionBody(func.body);
+ return new TypedValue(func.returnType, result);
}
// This uses the simplified TypedValue object for wrapping values like integers and doubles.
@@ -46,6 +42,6 @@
{
let result = callFunctionByRef(
program, name, typeArguments,
- argumentList.map(argument => EPtr.box(argument.type, argument.value)));
- return new TypedValue(result.type.elementType, result.loadValue());
+ argumentList.map(argument => new TypedValue(argument.type, EPtr.box(argument.value))));
+ return new TypedValue(result.type, result.value.loadValue());
}
Modified: trunk/Tools/WebGPUShadingLanguageRI/Checker.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/Checker.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Checker.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -128,6 +128,7 @@
let rhsType = node.rhs.visit(this);
if (!lhsType.equals(rhsType))
throw new WTypeError(node.origin.originString, "Type mismatch in assignment: " + lhsType + " versus " + rhsType);
+ node.type = lhsType;
return lhsType;
}
Modified: trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EBufferBuilder.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -36,7 +36,7 @@
type = type.instantiatedType;
let buffer = new EBuffer(type.size);
type.populateDefaultValue(buffer, 0);
- return new EPtr(new PtrType(null, "thread", type), buffer, 0);
+ return new EPtr(buffer, 0);
}
_createEPtrForNode(node)
Modified: trunk/Tools/WebGPUShadingLanguageRI/EPtr.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/EPtr.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EPtr.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -24,12 +24,9 @@
*/
"use strict";
-class EPtr extends EValue {
- constructor(type, buffer, offset)
+class EPtr {
+ constructor(buffer, offset)
{
- super(type);
- if (!(type.unifyNode instanceof PtrType))
- throw new Error("Cannot create EPtr with non-ptr type: " + type);
this._buffer = buffer;
this._offset = offset;
}
@@ -39,13 +36,11 @@
// function is here to help.
//
// In a real execution environment, uses of this manifest as SSA temporaries.
- static box(type, value)
+ static box(value)
{
- if (!type || !value)
- throw new Error("Need both type and value");
let buffer = new EBuffer(1);
buffer.set(0, value);
- return new EPtr(new PtrType(null, "thread", type), buffer, 0);
+ return new EPtr(buffer, 0);
}
get buffer() { return this._buffer; }
@@ -56,12 +51,9 @@
return this.buffer.get(this.offset);
}
- copyFrom(other)
+ copyFrom(other, size)
{
- let elementType = this.type.elementType;
- if (!elementType)
- throw new Error("No element type: " + this);
- for (let i = elementType.size; i--;)
+ for (let i = size; i--;)
this.buffer.set(i, other.buffer.get(i));
}
@@ -69,7 +61,7 @@
{
if (!this.buffer)
return "null";
- return this.type + "B" + this.buffer.index + ":" + this.offset;
+ return "B" + this.buffer.index + ":" + this.offset;
}
}
Deleted: trunk/Tools/WebGPUShadingLanguageRI/EValue.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/EValue.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/EValue.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -1,37 +0,0 @@
-/*
- * 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 EValue {
- constructor(type)
- {
- if (!type)
- throw new Error("No type");
- this._type = type.unifyNode;
- }
-
- get type() { return this._type; }
-}
-
Modified: trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Evaluator.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -50,8 +50,11 @@
visitFunctionLikeBlock(node)
{
- for (let i = 0; i < node.argumentList.length; ++i)
- node.parameters[i].ePtr.copyFrom(node.argumentList[i].visit(this));
+ for (let i = 0; i < node.argumentList.length; ++i) {
+ node.parameters[i].ePtr.copyFrom(
+ node.argumentList[i].visit(this),
+ node.parameters[i].type.size);
+ }
return this.visitFunctionBody(node.body);
}
@@ -62,15 +65,17 @@
visitVariableDecl(node)
{
+ if (!node.ePtr.buffer)
+ throw new Error("eptr without buffer in " + node);
node.type.populateDefaultValue(node.ePtr.buffer, node.ePtr.offset);
if (node.initializer)
- node.ePtr.copyFrom(node.initializer.visit(this));
+ node.ePtr.copyFrom(node.initializer.visit(this), node.type.size);
}
visitAssignment(node)
{
let result = node.lhs.visit(this);
- result.copyFrom(node.rhs.visit(this));
+ result.copyFrom(node.rhs.visit(this), node.type.size);
return result;
}
@@ -89,7 +94,7 @@
visitIntLiteral(node)
{
- return EPtr.box(this._program.intrinsics.int32, node.value);
+ return EPtr.box(node.value);
}
visitCallExpression(node)
Modified: trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Intrinsics.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -62,7 +62,7 @@
"native int operator+<>(int,int)",
(func) => {
func.implementation =
- ([left, right]) => EPtr.box(this.int32, (left.loadValue() + right.loadValue()) | 0);
+ ([left, right]) => EPtr.box((left.loadValue() + right.loadValue()) | 0);
});
}
Modified: trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -138,7 +138,9 @@
visitAssignment(node)
{
- return new Assignment(node.origin, node.lhs.visit(this), node.rhs.visit(this));
+ let result = new Assignment(node.origin, node.lhs.visit(this), node.rhs.visit(this));
+ result.type = node.type.visit(this);
+ return result;
}
visitVariableRef(node)
Modified: trunk/Tools/WebGPUShadingLanguageRI/StructType.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/StructType.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/StructType.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -61,6 +61,9 @@
if (typeArguments.length != this.typeParameters.length)
throw new WTypeError(origin.originString, "Wrong number of type arguments to instantiation");
+ if (!typeArguments.length)
+ return this;
+
let substitution = Substitution.mapping(this.typeParameters, typeArguments);
let instantiateImmediates = new InstantiateImmediates();
let result = new StructType(this.origin, this.name, []);
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (221447 => 221448)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-08-31 21:55:17 UTC (rev 221447)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-08-31 22:15:18 UTC (rev 221448)
@@ -38,7 +38,7 @@
function checkInt(program, result, expected)
{
- if (result.type != program.intrinsics.int32)
+ if (!result.type.equals(program.intrinsics.int32))
throw new Error("Wrong result type; result: " + result);
if (result.value != expected)
throw new Error("Wrong result: " + result + " (expected " + expected + ")");