type inference for builtin/extension types
authorStefan Behnel <scoder@users.berlios.de>
Fri, 4 Dec 2009 10:15:00 +0000 (11:15 +0100)
committerStefan Behnel <scoder@users.berlios.de>
Fri, 4 Dec 2009 10:15:00 +0000 (11:15 +0100)
Cython/Compiler/ExprNodes.py

index f765e5279e7b4e3a64a4a66cca27ec14ca29c7c8..c475d7af17273b44a4472f18ec3c225776cfc6b5 100644 (file)
@@ -1073,7 +1073,7 @@ class NameNode(AtomicExprNode):
                 self.name == self.entry.type.name:
             # Unfortunately the type attribute of type objects
             # is used for the pointer to the type they represent.
-            return self.entry.type # type_type
+            return type_type
         else:
             return self.entry.type
     
@@ -2400,19 +2400,22 @@ class SimpleCallNode(CallNode):
         return self.function.type_dependencies(env)
     
     def infer_type(self, env):
-        func_type = self.function.infer_type(env)
+        function = self.function
+        func_type = function.infer_type(env)
         if func_type.is_ptr:
             func_type = func_type.base_type
         if func_type.is_cfunction:
             return func_type.return_type
-        elif func_type.is_extension_type:
-            return func_type
-        elif func_type.is_builtin_type and \
-                 func_type.name in Builtin.types_that_construct_their_instance:
-            return func_type
-        else:
-            return py_object_type            
-    
+        elif func_type is type_type:
+            if function.is_name and function.entry and function.entry.type:
+                result_type = function.entry.type
+                if result_type.is_extension_type:
+                    return result_type
+                elif result_type.is_builtin_type:
+                    if function.entry.name in Builtin.types_that_construct_their_instance:
+                        return result_type
+        return py_object_type
+
     def analyse_as_type(self, env):
         attr = self.function.as_cython_attribute()
         if attr == 'pointer':