]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40528: fix is_simple(sum)s behavior for attributes (GH-26918)
authorBatuhan Taskaya <batuhan@python.org>
Sun, 27 Jun 2021 14:58:32 +0000 (17:58 +0300)
committerGitHub <noreply@github.com>
Sun, 27 Jun 2021 14:58:32 +0000 (17:58 +0300)
This is something I noticed while (now discontinued) experimenting
with the idea of annotating operators with location information. Unfortunately
without this addition, adding any `attributes` to stuff like `unaryop`
doesn't change anything since the code assumes they are singletons and
caches all instances. This patch fixes this assumption with including
the attributes as well as constructor fields.

Parser/asdl_c.py

index 21e50442b8bb737fc6cd9b0c4482e107b20bb24d..5f0b89bba44890c2a8fde21b64c41d8dd2a3c6f8 100755 (executable)
@@ -71,16 +71,20 @@ def reflow_lines(s, depth):
 def reflow_c_string(s, depth):
     return '"%s"' % s.replace('\n', '\\n"\n%s"' % (' ' * depth * TABSIZE))
 
-def is_simple(sum):
+def is_simple(sum_type):
     """Return True if a sum is a simple.
 
-    A sum is simple if its types have no fields, e.g.
+    A sum is simple if it's types have no fields and itself
+    doesn't have any attributes. Instances of these types are
+    cached at C level, and they act like singletons when propagating
+    parser generated nodes into Python level, e.g.
     unaryop = Invert | Not | UAdd | USub
     """
-    for t in sum.types:
-        if t.fields:
-            return False
-    return True
+
+    return not (
+        sum_type.attributes or
+        any(constructor.fields for constructor in sum_type.types)
+    )
 
 def asdl_of(name, obj):
     if isinstance(obj, asdl.Product) or isinstance(obj, asdl.Constructor):