Title: [247549] trunk/Source/WebCore
Revision
247549
Author
rmoris...@apple.com
Date
2019-07-17 17:36:39 -0700 (Wed, 17 Jul 2019)

Log Message

[WHLSL] checkRecursiveType should not have exponential complexity.
https://bugs.webkit.org/show_bug.cgi?id=199835

Reviewed by Myles Maxfield.

The change is very similar to that in https://bugs.webkit.org/show_bug.cgi?id=199688.
Just keep track of which types have already been visited, and don't visit them again.

No new tests as there is no intended functional change.

* Modules/webgpu/WHLSL/WHLSLRecursiveTypeChecker.cpp:
(WebCore::WHLSL::RecursiveTypeChecker::visit):
(WebCore::WHLSL::checkRecursiveTypes):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (247548 => 247549)


--- trunk/Source/WebCore/ChangeLog	2019-07-18 00:17:51 UTC (rev 247548)
+++ trunk/Source/WebCore/ChangeLog	2019-07-18 00:36:39 UTC (rev 247549)
@@ -1,3 +1,19 @@
+2019-07-17  Robin Morisset  <rmoris...@apple.com>
+
+        [WHLSL] checkRecursiveType should not have exponential complexity.
+        https://bugs.webkit.org/show_bug.cgi?id=199835
+
+        Reviewed by Myles Maxfield.
+
+        The change is very similar to that in https://bugs.webkit.org/show_bug.cgi?id=199688.
+        Just keep track of which types have already been visited, and don't visit them again.
+
+        No new tests as there is no intended functional change.
+
+        * Modules/webgpu/WHLSL/WHLSLRecursiveTypeChecker.cpp:
+        (WebCore::WHLSL::RecursiveTypeChecker::visit):
+        (WebCore::WHLSL::checkRecursiveTypes):
+
 2019-07-17  Carlos Eduardo Ramalho  <cadubent...@gmail.com>
 
         Add missing #include's

Modified: trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLRecursiveTypeChecker.cpp (247548 => 247549)


--- trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLRecursiveTypeChecker.cpp	2019-07-18 00:17:51 UTC (rev 247548)
+++ trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLRecursiveTypeChecker.cpp	2019-07-18 00:36:39 UTC (rev 247549)
@@ -28,7 +28,6 @@
 
 #if ENABLE(WEBGPU)
 
-#include "WHLSLScopedSetAdder.h"
 #include "WHLSLStructureDefinition.h"
 #include "WHLSLTypeDefinition.h"
 #include "WHLSLTypeReference.h"
@@ -41,8 +40,6 @@
 
 class RecursiveTypeChecker : public Visitor {
 public:
-    virtual ~RecursiveTypeChecker() = default;
-
     void visit(AST::TypeDefinition&) override;
     void visit(AST::StructureDefinition&) override;
     void visit(AST::TypeReference&) override;
@@ -49,44 +46,55 @@
     void visit(AST::ReferenceType&) override;
 
 private:
-    using Adder = ScopedSetAdder<AST::Type*>;
-    HashSet<AST::Type*> m_types;
+    HashSet<AST::Type*> m_startedVisiting;
+    HashSet<AST::Type*> m_finishedVisiting;
 };
 
+#define START_VISITING(t) \
+do { \
+    if (m_finishedVisiting.contains(t)) \
+        return; \
+    auto resultStartedVisiting = m_startedVisiting.add(t); \
+    if (!resultStartedVisiting.isNewEntry) { \
+        setError(); \
+        return; \
+    } \
+} while (false);
+
+#define END_VISITING(t) \
+do { \
+    auto resultFinishedVisiting = m_finishedVisiting.add(t); \
+    ASSERT_UNUSED(resultFinishedVisiting, resultFinishedVisiting.isNewEntry); \
+} while (false);
+
 void RecursiveTypeChecker::visit(AST::TypeDefinition& typeDefinition)
 {
-    Adder adder(m_types, &typeDefinition);
-    if (!adder.isNewEntry()) {
-        setError();
-        return;
-    }
+    START_VISITING(&typeDefinition);
 
     Visitor::visit(typeDefinition);
+
+    END_VISITING(&typeDefinition);
 }
 
 void RecursiveTypeChecker::visit(AST::StructureDefinition& structureDefinition)
 {
-    Adder adder(m_types, &structureDefinition);
-    if (!adder.isNewEntry()) {
-        setError();
-        return;
-    }
+    START_VISITING(&structureDefinition);
 
     Visitor::visit(structureDefinition);
+
+    END_VISITING(&structureDefinition);
 }
 
 void RecursiveTypeChecker::visit(AST::TypeReference& typeReference)
 {
-    Adder adder(m_types, &typeReference);
-    if (!adder.isNewEntry()) {
-        setError();
-        return;
-    }
+    START_VISITING(&typeReference);
 
     for (auto& typeArgument : typeReference.typeArguments())
         checkErrorAndVisit(typeArgument);
     if (typeReference.maybeResolvedType()) // FIXME: https://bugs.webkit.org/show_bug.cgi?id=198161 Shouldn't we know by now whether the type has been resolved or not?
         checkErrorAndVisit(typeReference.resolvedType());
+
+    END_VISITING(&typeReference);
 }
 
 void RecursiveTypeChecker::visit(AST::ReferenceType&)
@@ -96,7 +104,10 @@
 bool checkRecursiveTypes(Program& program)
 {
     RecursiveTypeChecker recursiveTypeChecker;
-    recursiveTypeChecker.checkErrorAndVisit(program);
+    for (auto& typeDefinition : program.typeDefinitions())
+        recursiveTypeChecker.checkErrorAndVisit(typeDefinition);
+    for (auto& structureDefinition : program.structureDefinitions())
+        recursiveTypeChecker.checkErrorAndVisit(structureDefinition);
     return !recursiveTypeChecker.error();
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to