- Revision
- 221860
- Author
- [email protected]
- Date
- 2017-09-11 10:20:49 -0700 (Mon, 11 Sep 2017)
Log Message
IntLiteral should prefer int32 during overload resolution
https://bugs.webkit.org/show_bug.cgi?id=176675
Reviewed by Myles Maxfield.
This makes intLiteralType prefer to resolve to int over other types.
This also adds tests that if you pass intLiteral to T, then you can make it work by saying
int(intLiteral).
* WebGPUShadingLanguageRI/IntLiteralType.js:
(IntLiteralType):
(IntLiteralType.prototype.conversionCost):
* WebGPUShadingLanguageRI/Node.js:
(Node.prototype.conversionCost):
* WebGPUShadingLanguageRI/ResolveOverloadImpl.js:
(resolveOverloadImpl):
* WebGPUShadingLanguageRI/Rewriter.js:
(Rewriter.prototype.visitIntLiteralType):
* WebGPUShadingLanguageRI/Test.js:
(TEST_intOverloadResolution):
(TEST_intOverloadResolutionReverseOrder):
(TEST_intOverloadResolutionGeneric):
(TEST_intLiteralGeneric):
* WebGPUShadingLanguageRI/UnificationContext.js:
(UnificationContext.prototype.get conversionCost):
* WebGPUShadingLanguageRI/Visitor.js:
(Visitor.prototype.visitIntLiteralType):
Modified Paths
Diff
Modified: trunk/Tools/ChangeLog (221859 => 221860)
--- trunk/Tools/ChangeLog 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/ChangeLog 2017-09-11 17:20:49 UTC (rev 221860)
@@ -1,5 +1,36 @@
2017-09-10 Filip Pizlo <[email protected]>
+ IntLiteral should prefer int32 during overload resolution
+ https://bugs.webkit.org/show_bug.cgi?id=176675
+
+ Reviewed by Myles Maxfield.
+
+ This makes intLiteralType prefer to resolve to int over other types.
+
+ This also adds tests that if you pass intLiteral to T, then you can make it work by saying
+ int(intLiteral).
+
+ * WebGPUShadingLanguageRI/IntLiteralType.js:
+ (IntLiteralType):
+ (IntLiteralType.prototype.conversionCost):
+ * WebGPUShadingLanguageRI/Node.js:
+ (Node.prototype.conversionCost):
+ * WebGPUShadingLanguageRI/ResolveOverloadImpl.js:
+ (resolveOverloadImpl):
+ * WebGPUShadingLanguageRI/Rewriter.js:
+ (Rewriter.prototype.visitIntLiteralType):
+ * WebGPUShadingLanguageRI/Test.js:
+ (TEST_intOverloadResolution):
+ (TEST_intOverloadResolutionReverseOrder):
+ (TEST_intOverloadResolutionGeneric):
+ (TEST_intLiteralGeneric):
+ * WebGPUShadingLanguageRI/UnificationContext.js:
+ (UnificationContext.prototype.get conversionCost):
+ * WebGPUShadingLanguageRI/Visitor.js:
+ (Visitor.prototype.visitIntLiteralType):
+
+2017-09-10 Filip Pizlo <[email protected]>
+
WSL should be able to handle a simple constexpr type parameter
https://bugs.webkit.org/show_bug.cgi?id=176676
Modified: trunk/Tools/WebGPUShadingLanguageRI/IntLiteralType.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/IntLiteralType.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/IntLiteralType.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -30,6 +30,7 @@
super();
this._origin = origin;
this._value = value;
+ this.intType = new TypeRef(origin, "int", []);
}
get origin() { return this._origin; }
@@ -62,6 +63,14 @@
throw new Error("IntLiteralType should never be used as a type parameter");
}
+ conversionCost(unificationContext)
+ {
+ let realThis = unificationContext.find(this);
+ if (realThis.equals(this.intType))
+ return 0;
+ return 1;
+ }
+
commitUnification(unificationContext)
{
this.type = TypeRef.wrap(unificationContext.find(this));
Modified: trunk/Tools/WebGPUShadingLanguageRI/Node.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/Node.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/Node.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -79,6 +79,8 @@
get isNative() { return false; }
+ conversionCost(unificationContext) { return 0; }
+
equals(other)
{
let unificationContext = new UnificationContext();
Modified: trunk/Tools/WebGPUShadingLanguageRI/ResolveOverloadImpl.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/ResolveOverloadImpl.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/ResolveOverloadImpl.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -39,18 +39,19 @@
if (!successes.length)
return {failures: failures};
+ let minimumConversionCost = successes.reduce(
+ (result, overload) => Math.min(result, overload.unificationContext.conversionCost),
+ Infinity);
+ successes = successes.filter(
+ overload => overload.unificationContext.conversionCost == minimumConversionCost);
+
// If any of the signatures are restricted then we consider those first. This is an escape mechanism for
// built-in things.
// FIXME: It should be an error to declare a function that is at least as specific as a restricted function.
// https://bugs.webkit.org/show_bug.cgi?id=176580
- let hasRestricted = false;
- for (let overload of successes) {
- if (overload.func.isRestricted) {
- hasRestricted = true;
- break;
- }
- }
-
+ let hasRestricted = successes.reduce(
+ (result, overload) => result || overload.func.isRestricted,
+ false);
if (hasRestricted)
successes = successes.filter(overload => overload.func.isRestricted);
Modified: trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/Rewriter.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -221,6 +221,7 @@
{
let result = new IntLiteralType(node.origin, node.value);
result.type = node.type ? node.type.visit(this) : null;
+ result.intType = node.intType.visit(this);
return result;
}
Modified: trunk/Tools/WebGPUShadingLanguageRI/Test.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/Test.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -1423,6 +1423,57 @@
`);
}
+function TEST_intOverloadResolution()
+{
+ let program = doPrep(`
+ int foo(int) { return 1; }
+ int foo(uint) { return 2; }
+ int foo(double) { return 3; }
+ int bar() { return foo(42); }
+ `);
+ checkInt(program, callFunction(program, "bar", [], []), 1);
+}
+
+function TEST_intOverloadResolutionReverseOrder()
+{
+ let program = doPrep(`
+ int foo(double) { return 3; }
+ int foo(uint) { return 2; }
+ int foo(int) { return 1; }
+ int bar() { return foo(42); }
+ `);
+ checkInt(program, callFunction(program, "bar", [], []), 1);
+}
+
+function TEST_intOverloadResolutionGeneric()
+{
+ let program = doPrep(`
+ int foo(int) { return 1; }
+ int foo<T>(T) { return 2; }
+ int bar() { return foo(42); }
+ `);
+ checkInt(program, callFunction(program, "bar", [], []), 1);
+}
+
+function TEST_intLiteralGeneric()
+{
+ checkFail(
+ () => doPrep(`
+ int foo<T>(T) { return 1; }
+ int bar() { return foo(42); }
+ `),
+ (e) => e instanceof WTypeError);
+}
+
+function TEST_intLiteralGeneric()
+{
+ let program = doPrep(`
+ T foo<T>(T x) { return x; }
+ int bar() { return foo(int(42)); }
+ `);
+ checkInt(program, callFunction(program, "bar", [], []), 42);
+}
+
function TEST_simpleConstexpr()
{
let program = doPrep(`
Modified: trunk/Tools/WebGPUShadingLanguageRI/UnificationContext.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/UnificationContext.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/UnificationContext.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -106,6 +106,14 @@
return argumentSet.size == numTypeVariableArguments;
}
+ get conversionCost()
+ {
+ let result = 0;
+ for (let typeArgument of this.typeArguments())
+ result += typeArgument.conversionCost(this);
+ return result;
+ }
+
commit()
{
for (let typeArgument of this.typeArguments())
Modified: trunk/Tools/WebGPUShadingLanguageRI/Visitor.js (221859 => 221860)
--- trunk/Tools/WebGPUShadingLanguageRI/Visitor.js 2017-09-11 17:18:38 UTC (rev 221859)
+++ trunk/Tools/WebGPUShadingLanguageRI/Visitor.js 2017-09-11 17:20:49 UTC (rev 221860)
@@ -251,6 +251,7 @@
{
if (node.type)
node.type.visit(this);
+ node.intType.visit(this);
}
visitUintLiteral(node)