From ab0db002c3f8b3196f0878bc34a59a33e1984b4a Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Tue, 3 Apr 2012 12:18:44 -0400
Subject: [PATCH] Prevent CSE finder from destroying CSE subclasses.

---
 pymbolic/cse.py | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/pymbolic/cse.py b/pymbolic/cse.py
index b7c6109..34fe275 100644
--- a/pymbolic/cse.py
+++ b/pymbolic/cse.py
@@ -110,14 +110,15 @@ class CSEMapper(IdentityMapper):
 
     def map_common_subexpression(self, expr):
         # Avoid creating CSE(CSE(...))
-        #
-        # NOTE: This is not equivalent to isinstance--it's more specific,
-        # and for a reason! (Because we don't want to obliterate derived
-        # CSE types.)
         if type(expr) is prim.CommonSubexpression:
             return prim.wrap_in_cse(self.rec(expr.child), expr.prefix)
         else:
-            return IdentityMapper.map_common_subexpression(self, expr)
+            # expr is of a derived CSE type
+            result = self.rec(expr.child)
+            if type(result) is prim.CommonSubexpression:
+                result = result.child
+
+            return type(expr)(result, expr.prefix, **expr.get_extra_properties())
 
     def map_substitution(self, expr):
         return type(expr)(
-- 
GitLab