merged in latest cython-devel
authorStefan Behnel <scoder@users.berlios.de>
Thu, 22 Apr 2010 18:29:10 +0000 (20:29 +0200)
committerStefan Behnel <scoder@users.berlios.de>
Thu, 22 Apr 2010 18:29:10 +0000 (20:29 +0200)
12 files changed:
1  2 
Cython/Compiler/ExprNodes.py
Cython/Compiler/Main.py
Cython/Compiler/ModuleNode.py
Cython/Compiler/Nodes.py
Cython/Compiler/Optimize.py
Cython/Compiler/Options.py
Cython/Compiler/ParseTreeTransforms.py
Cython/Compiler/Parsing.pxd
Cython/Compiler/Parsing.py
Cython/Compiler/Symtab.py
Cython/Compiler/Visitor.py
Cython/Utils.py

index d0817ddd40cc9eb35159862652a1464f2d5d3a2b,c8c5d96cb8637f7214b55a811c68b8915f109c56..9fef2a3acf76e9a9ac293868aa72c33f3a0f9096
@@@ -4170,8 -4205,10 +4250,11 @@@ class PyCFunctionNode(ExprNode)
      is_temp = 1
      
      def analyse_types(self, env):
 -        pass
 +        if self.binding:
 +            env.use_utility_code(binding_cfunc_utility_code)
+     def may_be_none(self):
+         return False
      
      gil_message = "Constructing Python function"
  
Simple merge
index 6b859990fe2688700536f7ec72871e38d908e16d,641c080582d0bf2d2b9a83a0f4dc2c39f71ca97f..1b38fc80bc1c883be99a501943ca1e55ade46286
@@@ -1658,13 -1678,11 +1676,13 @@@ class ModuleNode(Nodes.Node, Nodes.Bloc
          code.putln("__pyx_refnanny = __Pyx_RefNanny->SetupContext(\"%s\", __LINE__, __FILE__);"% header3)
          code.putln("#endif")
  
 -        self.generate_filename_init_call(code)
 -
          code.putln("%s = PyTuple_New(0); %s" % (Naming.empty_tuple, code.error_goto_if_null(Naming.empty_tuple, self.pos)));
-         code.putln("%s = __Pyx_PyBytes_FromStringAndSize(\"\", 0); %s" % (Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos)));
-         
+         code.putln("%s = PyBytes_FromStringAndSize(\"\", 0); %s" % (Naming.empty_bytes, code.error_goto_if_null(Naming.empty_bytes, self.pos)));
 +        code.putln("#ifdef %s_USED" % Naming.binding_cfunc)
 +        code.putln("if (%s_init() < 0) %s" % (Naming.binding_cfunc, code.error_goto(self.pos)))
 +        code.putln("#endif")
 +
          code.putln("/*--- Library function declarations ---*/")
          env.generate_library_function_declarations(code)
  
index c8cb9d82eeac10a2d93fcaf01b56c108cf872f79,68ab97f84df4e07e11934402eab758455edd333a..653efc1325f9a1d3f2fd2f337ed8bb998872f257
@@@ -630,9 -630,10 +630,11 @@@ class CArgDeclNode(Node)
      # base_type      CBaseTypeNode
      # declarator     CDeclaratorNode
      # not_none       boolean            Tagged with 'not None'
+     # or_none        boolean            Tagged with 'or None'
+     # accept_none    boolean            Resolved boolean for not_none/or_none
      # default        ExprNode or None
      # default_value  PyObjectConst      constant for default value
 +    # annotation     ExprNode or None   Py3 function arg annotation
      # is_self_arg    boolean            Is the "self" arg of an extension type method
      # is_type_arg    boolean            Is the "class" arg of an extension type classmethod
      # is_kw_only     boolean            Is a keyword-only argument
Simple merge
Simple merge
index aec498fc030459d2514256094f7104f4147ea401,31c1056926eba8ba52443d7553464567e6148418..edbf6e38c72d35885b6f799ec832d304947dd79a
@@@ -45,11 -42,11 +45,11 @@@ cpdef p_atom(PyrexScanner s
  cpdef p_name(PyrexScanner s, name)
  cpdef p_cat_string_literal(PyrexScanner s)
  cpdef p_opt_string_literal(PyrexScanner s)
- cpdef p_string_literal(PyrexScanner s)
+ cpdef p_string_literal(PyrexScanner s, kind_override=*)
  cpdef p_list_maker(PyrexScanner s)
 -cpdef p_list_iter(PyrexScanner s, body)
 -cpdef p_list_for(PyrexScanner s, body)
 -cpdef p_list_if(PyrexScanner s, body)
 +cpdef p_comp_iter(PyrexScanner s, body)
 +cpdef p_comp_for(PyrexScanner s, body)
 +cpdef p_comp_if(PyrexScanner s, body)
  cpdef p_dict_or_set_maker(PyrexScanner s)
  cpdef p_backquote_expr(PyrexScanner s)
  cpdef p_simple_expr_list(PyrexScanner s)
index 63b85e5a16a5d3ad0cdaeeed7bf965fcf657a065,ebee3bf79204375b0460850eea2e1a2852639ee4..fcbc4184ef4aa4b75a56fbdb7d1eeffac6a2d8b3
@@@ -2136,12 -2081,10 +2132,12 @@@ def p_optional_ellipsis(s)
      else:
          return 0
  
 -def p_c_arg_decl(s, ctx, in_pyfunc, cmethod_flag = 0, nonempty = 0, kw_only = 0):
 +def p_c_arg_decl(s, ctx, in_pyfunc, cmethod_flag = 0, nonempty = 0,
 +                 kw_only = 0, annotated = 1):
      pos = s.position()
-     not_none = 0
+     not_none = or_none = 0
      default = None
 +    annotation = None
      if s.in_python_file:
          # empty type declaration
          base_type = Nodes.CSimpleBaseTypeNode(pos,
          else:
              s.error("Expected 'None'")
          if not in_pyfunc:
-             error(pos, "'not None' only allowed in Python functions")
-         not_none = 1
+             error(pos, "'%s None' only allowed in Python functions" % kind)
+         or_none = kind == 'or'
+         not_none = kind == 'not'
 +    if annotated and s.sy == ':':
 +        s.next()
 +        annotation = p_simple_expr(s)
      if s.sy == '=':
          s.next()
          if 'pxd' in s.level:
          base_type = base_type,
          declarator = declarator,
          not_none = not_none,
+         or_none = or_none,
          default = default,
 +        annotation = annotation,
          kw_only = kw_only)
  
  def p_api(s):
index 528c6406ee5997aa08c2c594cb8be932d663ddd9,5b74ebc1fb556895357e860e978cbf3b288cb498..2c0f6289451f1fc3bf4f535d5c34e0ddcee68ec7
@@@ -209,7 -207,8 +209,9 @@@ class Scope(object)
      # return_type       PyrexType or None  Return type of function owning scope
      # is_py_class_scope boolean            Is a Python class scope
      # is_c_class_scope  boolean            Is an extension type scope
 +    # is_closure_scope  boolean
+     # is_cpp_class_scope  boolean          Is a C++ class scope
+     # is_property_scope boolean            Is a extension type property scope
      # scope_prefix      string             Disambiguator for C names
      # in_cinclude       boolean            Suppress C declaration code
      # qualified_name    string             "modname" or "modname.classname"
  
      is_py_class_scope = 0
      is_c_class_scope = 0
 +    is_closure_scope = 0
      is_cpp_class_scope = 0
+     is_property_scope = 0
      is_module_scope = 0
 +    is_internal = 0
      scope_prefix = ""
      in_cinclude = 0
      nogil = 0
Simple merge
diff --cc Cython/Utils.py
Simple merge