From 609256e8e50a08632486d7deb0ffbb65f64a7650 Mon Sep 17 00:00:00 2001 From: "Michael J. Sullivan" Date: Mon, 9 Dec 2019 17:50:50 -0800 Subject: [PATCH 1/3] [mypyc] Fix interaction of Enum caching with _order_ --- mypyc/genops.py | 6 +++++- mypyc/test-data/run-classes.test | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mypyc/genops.py b/mypyc/genops.py index bbc5724d7b36..72c27133457e 100644 --- a/mypyc/genops.py +++ b/mypyc/genops.py @@ -1445,7 +1445,11 @@ def add_non_ext_class_attr(self, non_ext: NonExtClassInfo, lvalue: NameExpr, self.add_to_non_ext_dict(non_ext, lvalue.name, rvalue, stmt.line) # We cache enum attributes to speed up enum attribute lookup since they # are final. - if cdef.info.bases and cdef.info.bases[0].type.fullname == 'enum.Enum': + if ( + cdef.info.bases + and cdef.info.bases[0].type.fullname == 'enum.Enum' + and lvalue.name != '_order_' + ): attr_to_cache.append(lvalue) def setup_non_ext_dict(self, cdef: ClassDef, bases: Value) -> Value: diff --git a/mypyc/test-data/run-classes.test b/mypyc/test-data/run-classes.test index a909f64def12..db43179a29a8 100644 --- a/mypyc/test-data/run-classes.test +++ b/mypyc/test-data/run-classes.test @@ -126,6 +126,7 @@ assert o.get(20) == 20 from enum import Enum class TestEnum(Enum): + _order_ = "a b" a : int = 1 b : int = 2 From 06ee07153c7cd0a23b148992eede678eeaeadc22 Mon Sep 17 00:00:00 2001 From: "Michael J. Sullivan" Date: Mon, 9 Dec 2019 19:28:39 -0800 Subject: [PATCH 2/3] fix --- mypyc/test-data/run-classes.test | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mypyc/test-data/run-classes.test b/mypyc/test-data/run-classes.test index db43179a29a8..829bd1fbd551 100644 --- a/mypyc/test-data/run-classes.test +++ b/mypyc/test-data/run-classes.test @@ -141,11 +141,14 @@ assert TestEnum.test() == 3 # non-extension classes [file driver.py] -from native import TestEnum -assert TestEnum.a.name == 'a' -assert TestEnum.a.value == 1 -assert TestEnum.b.name == 'b' -assert TestEnum.b.value == 2 +import sys +# "_order_" isn't supported in 3.5 +if sys.version_info[:2] > (3, 5): + from native import TestEnum + assert TestEnum.a.name == 'a' + assert TestEnum.a.value == 1 + assert TestEnum.b.name == 'b' + assert TestEnum.b.value == 2 [case testRunDataclass] from dataclasses import dataclass, field From c3e34b7e89edb72f48152ff1b199f2a99dd077de Mon Sep 17 00:00:00 2001 From: "Michael J. Sullivan" Date: Tue, 10 Dec 2019 11:25:29 -0800 Subject: [PATCH 3/3] Add a comment --- mypyc/genops.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mypyc/genops.py b/mypyc/genops.py index 72c27133457e..b61db14749a1 100644 --- a/mypyc/genops.py +++ b/mypyc/genops.py @@ -1448,6 +1448,7 @@ def add_non_ext_class_attr(self, non_ext: NonExtClassInfo, lvalue: NameExpr, if ( cdef.info.bases and cdef.info.bases[0].type.fullname == 'enum.Enum' + # Skip "_order_", since Enum will remove it and lvalue.name != '_order_' ): attr_to_cache.append(lvalue)