cython-devel

changeset 1776:9e0b4fa897e3

Fix type conversion for from...import statement.
author Robert Bradshaw <robertwb@math.washington.edu>
date Wed Feb 25 21:12:49 2009 -0800 (2 years ago)
parents 7dd195513552
children 1ca2fa65750e
files Cython/Compiler/Nodes.py
line diff
1.1 --- a/Cython/Compiler/Nodes.py Wed Feb 25 12:25:16 2009 -0800 1.2 +++ b/Cython/Compiler/Nodes.py Wed Feb 25 21:12:49 2009 -0800 1.3 @@ -4579,7 +4579,7 @@ 1.4 # 1.5 # module ImportNode 1.6 # items [(string, NameNode)] 1.7 - # interned_items [(string, NameNode)] 1.8 + # interned_items [(string, NameNode, ExprNode)] 1.9 # item PyTempNode used internally 1.10 # import_star boolean used internally 1.11 1.12 @@ -4613,9 +4613,13 @@ 1.13 entry = env.lookup(target.name) 1.14 if entry.is_type and entry.type.name == name and entry.type.module_name == self.module.module_name.value: 1.15 continue # already cimported 1.16 + target.analyse_target_expression(env, None) 1.17 + if target.type is py_object_type: 1.18 + coerced_item = None 1.19 + else: 1.20 + coerced_item = self.item.coerce_to(target.type, env) 1.21 self.interned_items.append( 1.22 - (env.intern_identifier(name), target)) 1.23 - target.analyse_target_expression(env, None) 1.24 + (env.intern_identifier(name), target, coerced_item)) 1.25 #target.release_target_temp(env) # was release_temp ?!? 1.26 self.module.release_temp(env) 1.27 self.item.release_temp(env) 1.28 @@ -4628,7 +4632,7 @@ 1.29 Naming.import_star, 1.30 self.module.py_result(), 1.31 code.error_goto(self.pos))) 1.32 - for cname, target in self.interned_items: 1.33 + for cname, target, coerced_item in self.interned_items: 1.34 code.putln( 1.35 '%s = PyObject_GetAttr(%s, %s); %s' % ( 1.36 self.item.result(), 1.37 @@ -4636,7 +4640,14 @@ 1.38 cname, 1.39 code.error_goto_if_null(self.item.result(), self.pos))) 1.40 code.put_gotref(self.item.py_result()) 1.41 - target.generate_assignment_code(self.item, code) 1.42 + if coerced_item is None: 1.43 + target.generate_assignment_code(self.item, code) 1.44 + else: 1.45 + coerced_item.allocate_temp_result(code) 1.46 + coerced_item.generate_result_code(code) 1.47 + target.generate_assignment_code(coerced_item, code) 1.48 + if self.item.result() != coerced_item.result(): 1.49 + code.put_decref_clear(self.item.result(), self.item.type) 1.50 self.module.generate_disposal_code(code) 1.51 self.module.free_temps(code) 1.52