summaryrefslogtreecommitdiff
path: root/Cython/Compiler/ModuleNode.py
diff options
context:
space:
mode:
Diffstat (limited to 'Cython/Compiler/ModuleNode.py')
-rw-r--r--Cython/Compiler/ModuleNode.py13
1 files changed, 10 insertions, 3 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py
index 62b75808d..6c8703b98 100644
--- a/Cython/Compiler/ModuleNode.py
+++ b/Cython/Compiler/ModuleNode.py
@@ -444,6 +444,7 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# poor developer's OrderedDict
vtab_dict, vtab_dict_order = {}, []
vtabslot_dict, vtabslot_dict_order = {}, []
+
for module in module_list:
for entry in module.c_class_entries:
if entry.used and not entry.in_cinclude:
@@ -451,9 +452,15 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
key = type.vtabstruct_cname
if not key:
continue
- assert key not in vtab_dict, key
- vtab_dict[key] = entry
- vtab_dict_order.append(key)
+ if key in vtab_dict:
+ # FIXME: this should *never* happen, but apparently it does
+ # for Cython generated utility code
+ from Cython.Compiler.UtilityCode import NonManglingModuleScope
+ assert isinstance(entry.scope, NonManglingModuleScope), str(entry.scope)
+ assert isinstance(vtab_dict[key].scope, NonManglingModuleScope), str(vtab_dict[key].scope)
+ else:
+ vtab_dict[key] = entry
+ vtab_dict_order.append(key)
all_defined_here = module is env
for entry in module.type_entries:
if entry.used and (all_defined_here or entry.defined_in_pxd):