WebKit Bugzilla
Attachment 346958 Details for
Bug 178981
: [WHLSL] Ternary expressions are unimplemented
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-178981-20180810213751.patch (text/plain), 12.00 KB, created by
Myles C. Maxfield
on 2018-08-10 21:37:52 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Myles C. Maxfield
Created:
2018-08-10 21:37:52 PDT
Size:
12.00 KB
patch
obsolete
>Subversion Revision: 234777 >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index cf2a4a57e25ccac46386d887f9696e18ce930765..412915dda0218ba5c1463fcabdf104d319b4512d 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,36 @@ >+2018-08-10 Myles C. Maxfield <mmaxfield@apple.com> >+ >+ [WSL] Ternary expressions appear to be unimplemented >+ https://bugs.webkit.org/show_bug.cgi?id=178981 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Implement ternary statements. These can be both lvalues and rvalues. (a ? b : c ? d : e) >+ is parsed as (a ? b : (c ? d : e)). >+ >+ * WebGPUShadingLanguageRI/All.js: >+ * WebGPUShadingLanguageRI/Checker.js: >+ (Checker.prototype.visitTernaryExpression): >+ * WebGPUShadingLanguageRI/Evaluator.js: >+ (Evaluator.prototype.visitTernaryExpression): >+ * WebGPUShadingLanguageRI/NormalUsePropertyResolver.js: >+ (NormalUsePropertyResolver.prototype.visitTernaryExpression): >+ (NormalUsePropertyResolver): >+ * WebGPUShadingLanguageRI/Parse.js: >+ (parsePossibleTernaryConditional): >+ * WebGPUShadingLanguageRI/PropertyResolver.js: >+ (PropertyResolver.prototype._visitRValuesWithinLValue.RValueFinder.prototype.visitTernaryExpression): >+ (PropertyResolver.prototype._visitRValuesWithinLValue.RValueFinder): >+ (PropertyResolver.prototype._visitRValuesWithinLValue): >+ * WebGPUShadingLanguageRI/Rewriter.js: >+ (Rewriter.prototype.visitTernaryExpression): >+ * WebGPUShadingLanguageRI/SPIRV.html: >+ * WebGPUShadingLanguageRI/Test.html: >+ * WebGPUShadingLanguageRI/Test.js: >+ * WebGPUShadingLanguageRI/Visitor.js: >+ (Visitor.prototype.visitProtocolDecl): >+ * WebGPUShadingLanguageRI/index.html: >+ > 2018-08-10 Daniel Bates <dabates@apple.com> > > webkit-patch setup-git-clone should set Git core editor to commit-log-editor >diff --git a/Tools/WebGPUShadingLanguageRI/All.js b/Tools/WebGPUShadingLanguageRI/All.js >index 15dd7ccab94692a32acd27b9dac96c8a8f55d658..1f0f23ae5cc7d423ec50fce6788a36231f019f75 100644 >--- a/Tools/WebGPUShadingLanguageRI/All.js >+++ b/Tools/WebGPUShadingLanguageRI/All.js >@@ -149,6 +149,7 @@ load("SwitchCase.js"); > load("SwitchStatement.js"); > load("SynthesizeEnumFunctions.js"); > load("SynthesizeStructAccessors.js"); >+load("TernaryExpression.js"); > load("TrapStatement.js"); > load("TypeDef.js"); > load("TypeDefResolver.js"); >diff --git a/Tools/WebGPUShadingLanguageRI/Checker.js b/Tools/WebGPUShadingLanguageRI/Checker.js >index 8d55c50d836c15486fd2580c58e9606cad596ecb..5e6e0e967d8888fb8d1fe4e5d60c6264639af832 100644 >--- a/Tools/WebGPUShadingLanguageRI/Checker.js >+++ b/Tools/WebGPUShadingLanguageRI/Checker.js >@@ -672,6 +672,21 @@ class Checker extends Visitor { > result = expression.visit(this); > return result; > } >+ >+ visitTernaryExpression(node) >+ { >+ this._requireBool(node.predicate); >+ let bodyType = node.bodyExpression.visit(this); >+ let elseType = node.elseExpression.visit(this); >+ if (!bodyType) >+ throw new Error("Ternary expression body has no type: " + node.bodyExpression); >+ if (!elseType) >+ throw new Error("Ternary expression else has no type: " + node.elseExpression); >+ if (!bodyType.equalsWithCommit(elseType)) >+ throw new WTypeError("Body and else clause of ternary statement don't have the same type: " + node); >+ node.isLValue = node.bodyExpression.isLValue && node.elseExpression.isLValue; >+ return bodyType; >+ } > > visitCallExpression(node) > { >diff --git a/Tools/WebGPUShadingLanguageRI/Evaluator.js b/Tools/WebGPUShadingLanguageRI/Evaluator.js >index 58ced89b7e47770023c7d8e1e81928751262eb38..d0899736fa69ba5e44677b7b896ccaff5e73551b 100644 >--- a/Tools/WebGPUShadingLanguageRI/Evaluator.js >+++ b/Tools/WebGPUShadingLanguageRI/Evaluator.js >@@ -142,6 +142,14 @@ class Evaluator extends Visitor { > // This should almost snapshot, except that tail-returning a pointer is totally OK. > return result; > } >+ >+ visitTernaryExpression(node) >+ { >+ if (node.predicate.visit(this).loadValue()) >+ return node.bodyExpression.visit(this); >+ return node.elseExpression.visit(this); >+ >+ } > > visitVariableRef(node) > { >diff --git a/Tools/WebGPUShadingLanguageRI/NormalUsePropertyResolver.js b/Tools/WebGPUShadingLanguageRI/NormalUsePropertyResolver.js >index df45d7e4eb1149bef31582961515f7f96f4e0115..9af19ee0e7e2fa4c56a40d0bbb59cd7a8c8afea1 100644 >--- a/Tools/WebGPUShadingLanguageRI/NormalUsePropertyResolver.js >+++ b/Tools/WebGPUShadingLanguageRI/NormalUsePropertyResolver.js >@@ -34,5 +34,12 @@ class NormalUsePropertyResolver extends Rewriter { > { > return super.visitIndexExpression(node).rewriteAfterCloning(); > } >+ >+ visitTernaryExpression(node) >+ { >+ let result = super.visitTernaryExpression(node); >+ result.isLValue = node.isLValue; >+ return result; >+ } > } > >diff --git a/Tools/WebGPUShadingLanguageRI/Parse.js b/Tools/WebGPUShadingLanguageRI/Parse.js >index 6d2b431615601ab9dd3d0938fbfb385ee2a4daf1..99f999ad72b124908166b35e0fff960ca1313e7b 100644 >--- a/Tools/WebGPUShadingLanguageRI/Parse.js >+++ b/Tools/WebGPUShadingLanguageRI/Parse.js >@@ -538,7 +538,10 @@ function parse(program, origin, originKind, lineNumberOffset, text) > let operator = tryConsume("?"); > if (!operator) > return predicate; >- return new TernaryExpression(operator, predicate, parsePossibleAssignment(), parsePossibleAssignment()); >+ let bodyExpression = parsePossibleAssignment(); >+ consume(":"); >+ let elseExpression = parsePossibleAssignment(); >+ return new TernaryExpression(operator, predicate, bodyExpression, elseExpression); > } > > function parsePossibleAssignment(mode) >diff --git a/Tools/WebGPUShadingLanguageRI/PropertyResolver.js b/Tools/WebGPUShadingLanguageRI/PropertyResolver.js >index 57c600c48f02e229778e6162dcfcda32a1f5cb6c..b5c454ac2dc3d534ca5213ef13c3736cd1700344 100644 >--- a/Tools/WebGPUShadingLanguageRI/PropertyResolver.js >+++ b/Tools/WebGPUShadingLanguageRI/PropertyResolver.js >@@ -59,6 +59,10 @@ class PropertyResolver extends Visitor { > { > visit(node.lValue); > } >+ >+ visitTernaryExpression(node) >+ { >+ } > } > > node.visit(new RValueFinder()); >diff --git a/Tools/WebGPUShadingLanguageRI/Rewriter.js b/Tools/WebGPUShadingLanguageRI/Rewriter.js >index f40d6b88b26eedcbf829f1babb10a2045b7a8e83..61f5e4d8e149e43f6338c5bf15b95d45c2c46df7 100644 >--- a/Tools/WebGPUShadingLanguageRI/Rewriter.js >+++ b/Tools/WebGPUShadingLanguageRI/Rewriter.js >@@ -198,6 +198,11 @@ class Rewriter { > result.addressSpace = node.addressSpace; > return result; > } >+ >+ visitTernaryExpression(node) >+ { >+ return new TernaryExpression(node.origin, node.predicate.visit(this), node.bodyExpression.visit(this), node.elseExpression.visit(this)); >+ } > > _handlePropertyAccessExpression(result, node) > { >diff --git a/Tools/WebGPUShadingLanguageRI/SPIRV.html b/Tools/WebGPUShadingLanguageRI/SPIRV.html >index 93f6b9b932d272d77a3dc3167f525fa40a61ed23..f0768dac92c94fe3a1bd90787bc91db24df527dd 100644 >--- a/Tools/WebGPUShadingLanguageRI/SPIRV.html >+++ b/Tools/WebGPUShadingLanguageRI/SPIRV.html >@@ -137,6 +137,7 @@ td { > <script src="SwitchStatement.js"></script> > <script src="SynthesizeEnumFunctions.js"></script> > <script src="SynthesizeStructAccessors.js"></script> >+ <script src="TernaryExpression.js"></script> > <script src="TrapStatement.js"></script> > <script src="TypeDef.js"></script> > <script src="TypeDefResolver.js"></script> >diff --git a/Tools/WebGPUShadingLanguageRI/Test.html b/Tools/WebGPUShadingLanguageRI/Test.html >index a641d3046493dabc2d745e7d0ec96d0bdd441bbc..ae7037dfd6a9ae2558e6ca006b759636cbec89af 100644 >--- a/Tools/WebGPUShadingLanguageRI/Test.html >+++ b/Tools/WebGPUShadingLanguageRI/Test.html >@@ -127,6 +127,7 @@ > <script src="SwitchStatement.js"></script> > <script src="SynthesizeEnumFunctions.js"></script> > <script src="SynthesizeStructAccessors.js"></script> >+<script src="TernaryExpression.js"></script> > <script src="TrapStatement.js"></script> > <script src="TypeDef.js"></script> > <script src="TypeDefResolver.js"></script> >diff --git a/Tools/WebGPUShadingLanguageRI/Test.js b/Tools/WebGPUShadingLanguageRI/Test.js >index 322a0a717850d73290848e93bf95bd3a24241c66..18d63feed91539c375b5b8f82a394bdcffe91c28 100644 >--- a/Tools/WebGPUShadingLanguageRI/Test.js >+++ b/Tools/WebGPUShadingLanguageRI/Test.js >@@ -198,6 +198,68 @@ tests.commentParsing = function() { > (e) => e instanceof WSyntaxError); > } > >+tests.ternaryExpression = function() { >+ let program = doPrep(` >+ int foo(int x) >+ { >+ return x < 3 ? 4 : 5; >+ } >+ int bar(int x) >+ { >+ int y = 1; >+ int z = 2; >+ (x < 3 ? y : z) = 7; >+ return y; >+ } >+ int baz(int x) >+ { >+ return x < 10 ? 11 : x < 12 ? 14 : 15; >+ } >+ int quux(int x) >+ { >+ return 3 < 4 ? x : 5; >+ } >+ `); >+ checkInt(program, callFunction(program, "foo", [], [makeInt(program, 767)]), 5); >+ checkInt(program, callFunction(program, "foo", [], [makeInt(program, 2)]), 4); >+ checkInt(program, callFunction(program, "bar", [], [makeInt(program, 2)]), 7); >+ checkInt(program, callFunction(program, "bar", [], [makeInt(program, 8)]), 1); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 8)]), 11); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 9)]), 11); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 10)]), 14); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 11)]), 14); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 12)]), 15); >+ checkInt(program, callFunction(program, "baz", [], [makeInt(program, 13)]), 15); >+ checkInt(program, callFunction(program, "quux", [], [makeInt(program, 14)]), 14); >+ checkFail( >+ () => doPrep(` >+ int foo() >+ { >+ int x; >+ (4 < 5 ? x : 7) = 8; >+ } >+ `), >+ (e) => e instanceof WTypeError); >+ checkFail( >+ () => doPrep(` >+ int foo() >+ { >+ int x; >+ float y; >+ return 4 < 5 ? x : y; >+ } >+ `), >+ (e) => e instanceof WTypeError); >+ checkFail( >+ () => doPrep(` >+ int foo() >+ { >+ return 4 < 5 ? 6 : 7.0; >+ } >+ `), >+ (e) => e instanceof WTypeError); >+} >+ > tests.literalBool = function() { > let program = doPrep("bool foo() { return true; }"); > checkBool(program, callFunction(program, "foo", [], []), true); >diff --git a/Tools/WebGPUShadingLanguageRI/Visitor.js b/Tools/WebGPUShadingLanguageRI/Visitor.js >index 4bf05313e2857d71efe513ee1e35f050def5336d..ebb4d8be707729863da8d7e391a973b9a1fa218a 100644 >--- a/Tools/WebGPUShadingLanguageRI/Visitor.js >+++ b/Tools/WebGPUShadingLanguageRI/Visitor.js >@@ -208,6 +208,13 @@ class Visitor { > { > node.ptr.visit(this); > } >+ >+ visitTernaryExpression(node) >+ { >+ node.predicate.visit(this); >+ node.bodyExpression.visit(this); >+ node.elseExpression.visit(this); >+ } > > _handlePropertyAccessExpression(node) > { >diff --git a/Tools/WebGPUShadingLanguageRI/index.html b/Tools/WebGPUShadingLanguageRI/index.html >index 8094b193781b4aa9b0c3909e9a91d2815f2b2aba..3b0e061a4f9ba3677abe5535a3ee86197f0b7a4b 100644 >--- a/Tools/WebGPUShadingLanguageRI/index.html >+++ b/Tools/WebGPUShadingLanguageRI/index.html >@@ -127,6 +127,7 @@ > <script src="SwitchStatement.js"></script> > <script src="SynthesizeEnumFunctions.js"></script> > <script src="SynthesizeStructAccessors.js"></script> >+<script src="TernaryExpression.js"></script> > <script src="TrapStatement.js"></script> > <script src="TypeDef.js"></script> > <script src="TypeDefResolver.js"></script>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
tdenney
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 178981
:
346953
| 346958 |
346960