Commit 0a677a76 authored by Robert Bradshaw's avatar Robert Bradshaw

merge

parents 2ef20620 dea87f8a
...@@ -4581,7 +4581,7 @@ class FromImportStatNode(StatNode): ...@@ -4581,7 +4581,7 @@ class FromImportStatNode(StatNode):
# #
# module ImportNode # module ImportNode
# items [(string, NameNode)] # items [(string, NameNode)]
# interned_items [(string, NameNode)] # interned_items [(string, NameNode, ExprNode)]
# item PyTempNode used internally # item PyTempNode used internally
# import_star boolean used internally # import_star boolean used internally
...@@ -4615,9 +4615,13 @@ class FromImportStatNode(StatNode): ...@@ -4615,9 +4615,13 @@ class FromImportStatNode(StatNode):
entry = env.lookup(target.name) entry = env.lookup(target.name)
if entry.is_type and entry.type.name == name and entry.type.module_name == self.module.module_name.value: if entry.is_type and entry.type.name == name and entry.type.module_name == self.module.module_name.value:
continue # already cimported continue # already cimported
self.interned_items.append(
(env.intern_identifier(name), target))
target.analyse_target_expression(env, None) target.analyse_target_expression(env, None)
if target.type is py_object_type:
coerced_item = None
else:
coerced_item = self.item.coerce_to(target.type, env)
self.interned_items.append(
(env.intern_identifier(name), target, coerced_item))
#target.release_target_temp(env) # was release_temp ?!? #target.release_target_temp(env) # was release_temp ?!?
self.module.release_temp(env) self.module.release_temp(env)
self.item.release_temp(env) self.item.release_temp(env)
...@@ -4630,7 +4634,7 @@ class FromImportStatNode(StatNode): ...@@ -4630,7 +4634,7 @@ class FromImportStatNode(StatNode):
Naming.import_star, Naming.import_star,
self.module.py_result(), self.module.py_result(),
code.error_goto(self.pos))) code.error_goto(self.pos)))
for cname, target in self.interned_items: for cname, target, coerced_item in self.interned_items:
code.putln( code.putln(
'%s = PyObject_GetAttr(%s, %s); %s' % ( '%s = PyObject_GetAttr(%s, %s); %s' % (
self.item.result(), self.item.result(),
...@@ -4638,7 +4642,14 @@ class FromImportStatNode(StatNode): ...@@ -4638,7 +4642,14 @@ class FromImportStatNode(StatNode):
cname, cname,
code.error_goto_if_null(self.item.result(), self.pos))) code.error_goto_if_null(self.item.result(), self.pos)))
code.put_gotref(self.item.py_result()) code.put_gotref(self.item.py_result())
target.generate_assignment_code(self.item, code) if coerced_item is None:
target.generate_assignment_code(self.item, code)
else:
coerced_item.allocate_temp_result(code)
coerced_item.generate_result_code(code)
target.generate_assignment_code(coerced_item, code)
if self.item.result() != coerced_item.result():
code.put_decref_clear(self.item.result(), self.item.type)
self.module.generate_disposal_code(code) self.module.generate_disposal_code(code)
self.module.free_temps(code) self.module.free_temps(code)
......
...@@ -8,6 +8,11 @@ True ...@@ -8,6 +8,11 @@ True
True True
>>> import4() == (cmd, core, version) >>> import4() == (cmd, core, version)
True True
>>> typed_imports()
True
True
an integer is required
Expected tuple, got int
""" """
def import1(): def import1():
...@@ -37,3 +42,27 @@ def import3(): ...@@ -37,3 +42,27 @@ def import3():
def import4(): def import4():
from distutils import cmd, core, version from distutils import cmd, core, version
return cmd, core, version return cmd, core, version
def typed_imports():
import sys
cdef long maxint
cdef tuple t
from sys import maxint
print maxint == sys.maxint
from sys import version_info as t
print t is sys.version_info
try:
from sys import version_info as maxint
except TypeError, e:
print e
try:
from sys import maxint as t
except TypeError, e:
print e
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