Commit 8f428c03 authored by Stefan Behnel's avatar Stefan Behnel

clean up Python name assignment code, special case module globals to change module dict directly

parent e39c79e7
...@@ -1829,35 +1829,31 @@ class NameNode(AtomicExprNode): ...@@ -1829,35 +1829,31 @@ class NameNode(AtomicExprNode):
if entry.is_member: if entry.is_member:
# if the entry is a member we have to cheat: SetAttr does not work # if the entry is a member we have to cheat: SetAttr does not work
# on types, so we create a descriptor which is then added to tp_dict # on types, so we create a descriptor which is then added to tp_dict
code.put_error_if_neg(self.pos, setter = 'PyDict_SetItem'
'PyDict_SetItem(%s->tp_dict, %s, %s)' % ( namespace = '%s->tp_dict' % namespace
namespace, elif entry.scope.is_module_scope:
interned_cname, setter = 'PyDict_SetItem'
rhs.py_result())) namespace = Naming.moddict_cname
rhs.generate_disposal_code(code)
rhs.free_temps(code)
# in Py2.6+, we need to invalidate the method cache
code.putln("PyType_Modified(%s);" %
entry.scope.parent_type.typeptr_cname)
elif entry.is_pyclass_attr: elif entry.is_pyclass_attr:
code.put_error_if_neg(self.pos, setter = 'PyObject_SetItem'
'PyObject_SetItem(%s, %s, %s)' % (
namespace,
interned_cname,
rhs.py_result()))
rhs.generate_disposal_code(code)
rhs.free_temps(code)
else: else:
code.put_error_if_neg(self.pos, setter = 'PyObject_SetAttr'
'PyObject_SetAttr(%s, %s, %s)' % ( code.put_error_if_neg(
namespace, self.pos,
interned_cname, '%s(%s, %s, %s)' % (
rhs.py_result())) setter,
if debug_disposal_code: namespace,
print("NameNode.generate_assignment_code:") interned_cname,
print("...generating disposal code for %s" % rhs) rhs.py_result()))
rhs.generate_disposal_code(code) if debug_disposal_code:
rhs.free_temps(code) print("NameNode.generate_assignment_code:")
print("...generating disposal code for %s" % rhs)
rhs.generate_disposal_code(code)
rhs.free_temps(code)
if entry.is_member:
# in Py2.6+, we need to invalidate the method cache
code.putln("PyType_Modified(%s);" %
entry.scope.parent_type.typeptr_cname)
else: else:
if self.type.is_memoryviewslice: if self.type.is_memoryviewslice:
self.generate_acquire_memoryviewslice(rhs, code) self.generate_acquire_memoryviewslice(rhs, code)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment