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
