WebKit Bugzilla
Attachment 346953 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]
WIP
bug-178981-20180810193956.patch (text/plain), 9.43 KB, created by
Myles C. Maxfield
on 2018-08-10 19:39:57 PDT
(
hide
)
Description:
WIP
Filename:
MIME Type:
Creator:
Myles C. Maxfield
Created:
2018-08-10 19:39:57 PDT
Size:
9.43 KB
patch
obsolete
>Subversion Revision: 234777 >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index cf2a4a57e25ccac46386d887f9696e18ce930765..1d4d647089597ebcf29787bb4d2e058d30e70002 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,26 @@ >+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!). >+ >+ * WebGPUShadingLanguageRI/All.js: >+ * WebGPUShadingLanguageRI/Checker.js: >+ (Checker.prototype.visitTernaryExpression): >+ * WebGPUShadingLanguageRI/Evaluator.js: >+ (Evaluator.prototype.visitTernaryExpression): >+ * WebGPUShadingLanguageRI/Parse.js: >+ (parsePossibleTernaryConditional): >+ * 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..af48e1b62af9fdaf03b91361ffc3e7673666650c 100644 >--- a/Tools/WebGPUShadingLanguageRI/Checker.js >+++ b/Tools/WebGPUShadingLanguageRI/Checker.js >@@ -672,6 +672,20 @@ 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.equals(elseType)) >+ throw new WTypeError("Body and else clause of ternary statement don't have the same type: " + node); >+ 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/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/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..2cdb12972ffece68fcc5cd2919b21c71fe2714be 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> >@@ -154,7 +155,7 @@ > <script> > function doTestInBrowser() > { >- var tester = doTest(/.*/); >+ var tester = doTest(/ternary.*/); > var lastTime; > function next() > { >diff --git a/Tools/WebGPUShadingLanguageRI/Test.js b/Tools/WebGPUShadingLanguageRI/Test.js >index 322a0a717850d73290848e93bf95bd3a24241c66..68bf604f2d0bf424ffda990a9540bccced39d4bc 100644 >--- a/Tools/WebGPUShadingLanguageRI/Test.js >+++ b/Tools/WebGPUShadingLanguageRI/Test.js >@@ -198,6 +198,36 @@ 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; >+ } >+ `); >+ 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); >+} >+ > 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
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 178981
:
346953
|
346958
|
346960