[WHLSL] Fix array indexing behavior
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Aug 2018 00:39:09 +0000 (00:39 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 31 Aug 2018 00:39:09 +0000 (00:39 +0000)
https://bugs.webkit.org/show_bug.cgi?id=189175

Array, pointer, and array ref types are now parsed and then constructed
in reverse so that the declaration order matches the indexing order, as
in C/C++.

Patch by Thomas Denney <tdenney@apple.com> on 2018-08-30
Reviewed by Myles C. Maxfield.

* WebGPUShadingLanguageRI/Parse.js:
(parseType):
* WebGPUShadingLanguageRI/Test.js:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235533 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/WebGPUShadingLanguageRI/Parse.js
Tools/WebGPUShadingLanguageRI/Test.js

index 5504221..e2b377b 100644 (file)
@@ -1,3 +1,18 @@
+2018-08-30  Thomas Denney  <tdenney@apple.com>
+
+        [WHLSL] Fix array indexing behavior
+        https://bugs.webkit.org/show_bug.cgi?id=189175
+
+        Array, pointer, and array ref types are now parsed and then constructed
+        in reverse so that the declaration order matches the indexing order, as
+        in C/C++.
+
+        Reviewed by Myles C. Maxfield.
+
+        * WebGPUShadingLanguageRI/Parse.js:
+        (parseType):
+        * WebGPUShadingLanguageRI/Test.js:
+
 2018-08-30  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         Followup to [iOS] TestWebKitAPI.PasteImage tests are flaky failures
index a20248d..ee4c980 100644 (file)
@@ -259,24 +259,33 @@ function parse(program, origin, originKind, lineNumberOffset, text)
             return consume(...addressSpaces).text;
         }
         
-        while (token = tryConsume("*", "[")) {
+        const typeConstructorStack = [ ];
+
+        for (let token; token = tryConsume("*", "[");) {
             if (token.text == "*") {
-                type = new PtrType(token, getAddressSpace(), type);
+                // Likewise, the address space must be parsed before parsing continues.
+                const addressSpace = getAddressSpace();
+                typeConstructorStack.unshift(type => new PtrType(token, addressSpace, type));
                 continue;
             }
-            
+
             if (tryConsume("]")) {
-                type = new ArrayRefType(token, getAddressSpace(), type);
+                const addressSpace = getAddressSpace();
+                typeConstructorStack.unshift(type => new ArrayRefType(token, addressSpace, type));
                 continue;
             }
-            
-            type = new ArrayType(token, type, parseConstexpr());
+
+            const lengthExpr = parseConstexpr();
+            typeConstructorStack.unshift(type => new ArrayType(token, type, lengthExpr));
             consume("]");
         }
-        
+
+        for (let constructor of typeConstructorStack)
+            type = constructor(type);
+
         if (addressSpace && !addressSpaceConsumed)
             lexer.fail("Address space specified for type that does not need address space");
-        
+
         return type;
     }
     
index 000d054..4a11c18 100644 (file)
@@ -5551,7 +5551,7 @@ tests.matrixMultiplication = function() {
     checkFloat(program, callFunction(program, "foo13", []), 29 * 7 + 43 * 11 + 61 * 13);
 }
 
-tests.DISABLED_arrayIndex = function() {
+tests.arrayIndex = function() {
     let program = doPrep(`
         uint innerArrayLength() {
             int[2][3] array;