5c00a1ddbaadc554b6380bdb6d4da8e8836e8796
[cython.git] / Cython / Compiler / ExprNodes.py
1 #
2 #   Pyrex - Parse tree nodes for expressions
3 #
4
5 import cython
6 from cython import set
7 cython.declare(error=object, warning=object, warn_once=object, InternalError=object,
8                CompileError=object, UtilityCode=object, StringEncoding=object, operator=object,
9                Naming=object, Nodes=object, PyrexTypes=object, py_object_type=object,
10                list_type=object, tuple_type=object, set_type=object, dict_type=object, \
11                unicode_type=object, str_type=object, bytes_type=object, type_type=object,
12                Builtin=object, Symtab=object, Utils=object, find_coercion_error=object,
13                debug_disposal_code=object, debug_temp_alloc=object, debug_coercion=object)
14
15 import operator
16
17 from Errors import error, warning, warn_once, InternalError, CompileError
18 from Errors import hold_errors, release_errors, held_errors, report_error
19 from Code import UtilityCode
20 import StringEncoding
21 import Naming
22 import Nodes
23 from Nodes import Node
24 import PyrexTypes
25 from PyrexTypes import py_object_type, c_long_type, typecast, error_type, \
26      unspecified_type
27 from Builtin import list_type, tuple_type, set_type, dict_type, \
28      unicode_type, str_type, bytes_type, type_type
29 import Builtin
30 import Symtab
31 import Options
32 from Cython import Utils
33 from Annotate import AnnotationItem
34
35 from Cython.Debugging import print_call_chain
36 from DebugFlags import debug_disposal_code, debug_temp_alloc, \
37     debug_coercion
38
39 try:
40     from __builtin__ import basestring
41 except ImportError:
42     basestring = str # Python 3
43
44 class NotConstant(object):
45     def __repr__(self):
46         return "<NOT CONSTANT>"
47
48 not_a_constant = NotConstant()
49 constant_value_not_set = object()
50
51 # error messages when coercing from key[0] to key[1]
52 find_coercion_error = {
53     # string related errors
54     (Builtin.unicode_type, Builtin.bytes_type) : "Cannot convert Unicode string to 'bytes' implicitly, encoding required.",
55     (Builtin.unicode_type, Builtin.str_type)   : "Cannot convert Unicode string to 'str' implicitly. This is not portable and requires explicit encoding.",
56     (Builtin.unicode_type, PyrexTypes.c_char_ptr_type) : "Unicode objects do not support coercion to C types.",
57     (Builtin.bytes_type, Builtin.unicode_type) : "Cannot convert 'bytes' object to unicode implicitly, decoding required",
58     (Builtin.bytes_type, Builtin.str_type) : "Cannot convert 'bytes' object to str implicitly. This is not portable to Py3.",
59     (Builtin.str_type, Builtin.unicode_type) : "str objects do not support coercion to unicode, use a unicode string literal instead (u'')",
60     (Builtin.str_type, Builtin.bytes_type) : "Cannot convert 'str' to 'bytes' implicitly. This is not portable.",
61     (Builtin.str_type, PyrexTypes.c_char_ptr_type) : "'str' objects do not support coercion to C types (use 'bytes'?).",
62     (PyrexTypes.c_char_ptr_type, Builtin.unicode_type) : "Cannot convert 'char*' to unicode implicitly, decoding required",
63     (PyrexTypes.c_uchar_ptr_type, Builtin.unicode_type) : "Cannot convert 'char*' to unicode implicitly, decoding required",
64     }.get
65
66
67 class ExprNode(Node):
68     #  subexprs     [string]     Class var holding names of subexpr node attrs
69     #  type         PyrexType    Type of the result
70     #  result_code  string       Code fragment
71     #  result_ctype string       C type of result_code if different from type
72     #  is_temp      boolean      Result is in a temporary variable
73     #  is_sequence_constructor  
74     #               boolean      Is a list or tuple constructor expression
75     #  is_starred   boolean      Is a starred expression (e.g. '*a')
76     #  saved_subexpr_nodes
77     #               [ExprNode or [ExprNode or None] or None]
78     #                            Cached result of subexpr_nodes()
79     #  use_managed_ref boolean   use ref-counted temps/assignments/etc.
80     
81     result_ctype = None
82     type = None
83     temp_code = None
84     old_temp = None # error checker for multiple frees etc.
85     use_managed_ref = True # can be set by optimisation transforms
86
87     #  The Analyse Expressions phase for expressions is split
88     #  into two sub-phases:
89     #
90     #    Analyse Types
91     #      Determines the result type of the expression based
92     #      on the types of its sub-expressions, and inserts
93     #      coercion nodes into the expression tree where needed.
94     #      Marks nodes which will need to have temporary variables
95     #      allocated.
96     #
97     #    Allocate Temps
98     #      Allocates temporary variables where needed, and fills
99     #      in the result_code field of each node.
100     #
101     #  ExprNode provides some convenience routines which
102     #  perform both of the above phases. These should only
103     #  be called from statement nodes, and only when no
104     #  coercion nodes need to be added around the expression
105     #  being analysed. In that case, the above two phases
106     #  should be invoked separately.
107     #
108     #  Framework code in ExprNode provides much of the common
109     #  processing for the various phases. It makes use of the
110     #  'subexprs' class attribute of ExprNodes, which should
111     #  contain a list of the names of attributes which can
112     #  hold sub-nodes or sequences of sub-nodes.
113     #  
114     #  The framework makes use of a number of abstract methods. 
115     #  Their responsibilities are as follows.
116     #
117     #    Declaration Analysis phase
118     #
119     #      analyse_target_declaration
120     #        Called during the Analyse Declarations phase to analyse
121     #        the LHS of an assignment or argument of a del statement.
122     #        Nodes which cannot be the LHS of an assignment need not
123     #        implement it.
124     #
125     #    Expression Analysis phase
126     #
127     #      analyse_types
128     #        - Call analyse_types on all sub-expressions.
129     #        - Check operand types, and wrap coercion nodes around
130     #          sub-expressions where needed.
131     #        - Set the type of this node.
132     #        - If a temporary variable will be required for the
133     #          result, set the is_temp flag of this node.
134     #
135     #      analyse_target_types
136     #        Called during the Analyse Types phase to analyse
137     #        the LHS of an assignment or argument of a del 
138     #        statement. Similar responsibilities to analyse_types.
139     #
140     #      target_code
141     #        Called by the default implementation of allocate_target_temps.
142     #        Should return a C lvalue for assigning to the node. The default
143     #        implementation calls calculate_result_code.
144     #
145     #      check_const
146     #        - Check that this node and its subnodes form a
147     #          legal constant expression. If so, do nothing,
148     #          otherwise call not_const. 
149     #
150     #        The default implementation of check_const 
151     #        assumes that the expression is not constant.
152     #
153     #      check_const_addr
154     #        - Same as check_const, except check that the
155     #          expression is a C lvalue whose address is
156     #          constant. Otherwise, call addr_not_const.
157     #
158     #        The default implementation of calc_const_addr
159     #        assumes that the expression is not a constant 
160     #        lvalue.
161     #
162     #   Code Generation phase
163     #
164     #      generate_evaluation_code
165     #        - Call generate_evaluation_code for sub-expressions.
166     #        - Perform the functions of generate_result_code
167     #          (see below).
168     #        - If result is temporary, call generate_disposal_code
169     #          on all sub-expressions.
170     #
171     #        A default implementation of generate_evaluation_code
172     #        is provided which uses the following abstract methods:
173     #
174     #          generate_result_code
175     #            - Generate any C statements necessary to calculate
176     #              the result of this node from the results of its
177     #              sub-expressions.
178     #
179     #          calculate_result_code
180     #            - Should return a C code fragment evaluating to the 
181     #              result. This is only called when the result is not 
182     #              a temporary.
183     #
184     #      generate_assignment_code
185     #        Called on the LHS of an assignment.
186     #        - Call generate_evaluation_code for sub-expressions.
187     #        - Generate code to perform the assignment.
188     #        - If the assignment absorbed a reference, call
189     #          generate_post_assignment_code on the RHS,
190     #          otherwise call generate_disposal_code on it.
191     #
192     #      generate_deletion_code
193     #        Called on an argument of a del statement.
194     #        - Call generate_evaluation_code for sub-expressions.
195     #        - Generate code to perform the deletion.
196     #        - Call generate_disposal_code on all sub-expressions.
197     #
198     #
199     
200     is_sequence_constructor = 0
201     is_attribute = 0
202     
203     saved_subexpr_nodes = None
204     is_temp = 0
205     is_target = 0
206     is_starred = 0
207
208     constant_result = constant_value_not_set
209
210     try:
211         _get_child_attrs = operator.attrgetter('subexprs')
212     except AttributeError:
213         # Python 2.3
214         def __get_child_attrs(self):
215             return self.subexprs
216         _get_child_attrs = __get_child_attrs
217     child_attrs = property(fget=_get_child_attrs)
218         
219     def not_implemented(self, method_name):
220         print_call_chain(method_name, "not implemented") ###
221         raise InternalError(
222             "%s.%s not implemented" %
223                 (self.__class__.__name__, method_name))
224                 
225     def is_lvalue(self):
226         return 0
227     
228     def is_ephemeral(self):
229         #  An ephemeral node is one whose result is in
230         #  a Python temporary and we suspect there are no
231         #  other references to it. Certain operations are
232         #  disallowed on such values, since they are
233         #  likely to result in a dangling pointer.
234         return self.type.is_pyobject and self.is_temp
235
236     def subexpr_nodes(self):
237         #  Extract a list of subexpression nodes based
238         #  on the contents of the subexprs class attribute.
239         nodes = []
240         for name in self.subexprs:
241             item = getattr(self, name)
242             if item is not None:
243                 if type(item) is list:
244                     nodes.extend(item)
245                 else:
246                     nodes.append(item)
247         return nodes
248         
249     def result(self):
250         if self.is_temp:
251             return self.temp_code
252         else:
253             return self.calculate_result_code()
254     
255     def result_as(self, type = None):
256         #  Return the result code cast to the specified C type.
257         return typecast(type, self.ctype(), self.result())
258     
259     def py_result(self):
260         #  Return the result code cast to PyObject *.
261         return self.result_as(py_object_type)
262     
263     def ctype(self):
264         #  Return the native C type of the result (i.e. the
265         #  C type of the result_code expression).
266         return self.result_ctype or self.type
267
268     def get_constant_c_result_code(self):
269         # Return the constant value of this node as a result code
270         # string, or None if the node is not constant.  This method
271         # can be called when the constant result code is required
272         # before the code generation phase.
273         #
274         # The return value is a string that can represent a simple C
275         # value, a constant C name or a constant C expression.  If the
276         # node type depends on Python code, this must return None.
277         return None
278
279     def calculate_constant_result(self):
280         # Calculate the constant compile time result value of this
281         # expression and store it in ``self.constant_result``.  Does
282         # nothing by default, thus leaving ``self.constant_result``
283         # unknown.  If valid, the result can be an arbitrary Python
284         # value.
285         #
286         # This must only be called when it is assured that all
287         # sub-expressions have a valid constant_result value.  The
288         # ConstantFolding transform will do this.
289         pass
290
291     def has_constant_result(self):
292         return self.constant_result is not constant_value_not_set and \
293                self.constant_result is not not_a_constant
294
295     def compile_time_value(self, denv):
296         #  Return value of compile-time expression, or report error.
297         error(self.pos, "Invalid compile-time expression")
298     
299     def compile_time_value_error(self, e):
300         error(self.pos, "Error in compile-time expression: %s: %s" % (
301             e.__class__.__name__, e))
302     
303     # ------------- Declaration Analysis ----------------
304     
305     def analyse_target_declaration(self, env):
306         error(self.pos, "Cannot assign to or delete this")
307     
308     # ------------- Expression Analysis ----------------
309     
310     def analyse_const_expression(self, env):
311         #  Called during the analyse_declarations phase of a
312         #  constant expression. Analyses the expression's type,
313         #  checks whether it is a legal const expression,
314         #  and determines its value.
315         self.analyse_types(env)
316         return self.check_const()
317     
318     def analyse_expressions(self, env):
319         #  Convenience routine performing both the Type
320         #  Analysis and Temp Allocation phases for a whole 
321         #  expression.
322         self.analyse_types(env)
323     
324     def analyse_target_expression(self, env, rhs):
325         #  Convenience routine performing both the Type
326         #  Analysis and Temp Allocation phases for the LHS of
327         #  an assignment.
328         self.analyse_target_types(env)
329     
330     def analyse_boolean_expression(self, env):
331         #  Analyse expression and coerce to a boolean.
332         self.analyse_types(env)
333         bool = self.coerce_to_boolean(env)
334         return bool
335     
336     def analyse_temp_boolean_expression(self, env):
337         #  Analyse boolean expression and coerce result into
338         #  a temporary. This is used when a branch is to be
339         #  performed on the result and we won't have an
340         #  opportunity to ensure disposal code is executed
341         #  afterwards. By forcing the result into a temporary,
342         #  we ensure that all disposal has been done by the
343         #  time we get the result.
344         self.analyse_types(env)
345         return self.coerce_to_boolean(env).coerce_to_simple(env)
346
347     # --------------- Type Inference -----------------
348     
349     def type_dependencies(self, env):
350         # Returns the list of entries whose types must be determined
351         # before the type of self can be infered.
352         if hasattr(self, 'type') and self.type is not None:
353             return ()
354         return sum([node.type_dependencies(env) for node in self.subexpr_nodes()], ())
355     
356     def infer_type(self, env):
357         # Attempt to deduce the type of self. 
358         # Differs from analyse_types as it avoids unnecessary 
359         # analysis of subexpressions, but can assume everything
360         # in self.type_dependencies() has been resolved.
361         if hasattr(self, 'type') and self.type is not None:
362             return self.type
363         elif hasattr(self, 'entry') and self.entry is not None:
364             return self.entry.type
365         else:
366             self.not_implemented("infer_type")
367     
368     # --------------- Type Analysis ------------------
369     
370     def analyse_as_module(self, env):
371         # If this node can be interpreted as a reference to a
372         # cimported module, return its scope, else None.
373         return None
374         
375     def analyse_as_type(self, env):
376         # If this node can be interpreted as a reference to a
377         # type, return that type, else None.
378         return None
379     
380     def analyse_as_extension_type(self, env):
381         # If this node can be interpreted as a reference to an
382         # extension type, return its type, else None.
383         return None
384     
385     def analyse_types(self, env):
386         self.not_implemented("analyse_types")
387     
388     def analyse_target_types(self, env):
389         self.analyse_types(env)
390
391     def nogil_check(self, env):
392         # By default, any expression based on Python objects is
393         # prevented in nogil environments.  Subtypes must override
394         # this if they can work without the GIL.
395         if self.type.is_pyobject:
396             self.gil_error()
397
398     def gil_assignment_check(self, env):
399         if env.nogil and self.type.is_pyobject:
400             error(self.pos, "Assignment of Python object not allowed without gil")
401
402     def check_const(self):
403         self.not_const()
404         return False
405     
406     def not_const(self):
407         error(self.pos, "Not allowed in a constant expression")
408     
409     def check_const_addr(self):
410         self.addr_not_const()
411         return False
412     
413     def addr_not_const(self):
414         error(self.pos, "Address is not constant")
415
416     # ----------------- Result Allocation -----------------
417     
418     def result_in_temp(self):
419         #  Return true if result is in a temporary owned by
420         #  this node or one of its subexpressions. Overridden
421         #  by certain nodes which can share the result of
422         #  a subnode.
423         return self.is_temp
424             
425     def target_code(self):
426         #  Return code fragment for use as LHS of a C assignment.
427         return self.calculate_result_code()
428     
429     def calculate_result_code(self):
430         self.not_implemented("calculate_result_code")
431     
432 #    def release_target_temp(self, env):
433 #        #  Release temporaries used by LHS of an assignment.
434 #        self.release_subexpr_temps(env)
435
436     def allocate_temp_result(self, code):
437         if self.temp_code:
438             raise RuntimeError("Temp allocated multiple times in %r: %r" % (self.__class__.__name__, self.pos))
439         type = self.type
440         if not type.is_void:
441             if type.is_pyobject:
442                 type = PyrexTypes.py_object_type
443             self.temp_code = code.funcstate.allocate_temp(
444                 type, manage_ref=self.use_managed_ref)
445         else:
446             self.temp_code = None
447
448     def release_temp_result(self, code):
449         if not self.temp_code:
450             if self.old_temp:
451                 raise RuntimeError("temp %s released multiple times in %s" % (
452                         self.old_temp, self.__class__.__name__))
453             else:
454                 raise RuntimeError("no temp, but release requested in %s" % (
455                         self.__class__.__name__))
456         code.funcstate.release_temp(self.temp_code)
457         self.old_temp = self.temp_code
458         self.temp_code = None
459
460     # ---------------- Code Generation -----------------
461     
462     def make_owned_reference(self, code):
463         #  If result is a pyobject, make sure we own
464         #  a reference to it.
465         if self.type.is_pyobject and not self.result_in_temp():
466             code.put_incref(self.result(), self.ctype())
467     
468     def generate_evaluation_code(self, code):
469         code.mark_pos(self.pos)
470         
471         #  Generate code to evaluate this node and
472         #  its sub-expressions, and dispose of any
473         #  temporary results of its sub-expressions.
474         self.generate_subexpr_evaluation_code(code)
475
476         if self.is_temp:
477             self.allocate_temp_result(code)
478
479         self.generate_result_code(code)
480         if self.is_temp:
481             # If we are temp we do not need to wait until this node is disposed
482             # before disposing children.
483             self.generate_subexpr_disposal_code(code)
484             self.free_subexpr_temps(code)
485
486     def generate_subexpr_evaluation_code(self, code):
487         for node in self.subexpr_nodes():
488             node.generate_evaluation_code(code)
489     
490     def generate_result_code(self, code):
491         self.not_implemented("generate_result_code")
492     
493     def generate_disposal_code(self, code):
494         if self.is_temp:
495             if self.type.is_pyobject:
496                 code.put_decref_clear(self.result(), self.ctype())
497         else:
498             # Already done if self.is_temp
499             self.generate_subexpr_disposal_code(code)
500
501     def generate_subexpr_disposal_code(self, code):
502         #  Generate code to dispose of temporary results
503         #  of all sub-expressions.
504         for node in self.subexpr_nodes():
505             node.generate_disposal_code(code)
506     
507     def generate_post_assignment_code(self, code):
508         if self.is_temp:
509             if self.type.is_pyobject:
510                 code.putln("%s = 0;" % self.result())
511         else:
512             self.generate_subexpr_disposal_code(code)
513
514     def generate_assignment_code(self, rhs, code):
515         #  Stub method for nodes which are not legal as
516         #  the LHS of an assignment. An error will have 
517         #  been reported earlier.
518         pass
519     
520     def generate_deletion_code(self, code):
521         #  Stub method for nodes that are not legal as
522         #  the argument of a del statement. An error
523         #  will have been reported earlier.
524         pass
525
526     def free_temps(self, code):
527         if self.is_temp:
528             if not self.type.is_void:
529                 self.release_temp_result(code)
530         else:
531             self.free_subexpr_temps(code)
532     
533     def free_subexpr_temps(self, code):
534         for sub in self.subexpr_nodes():
535             sub.free_temps(code)
536
537     def generate_function_definitions(self, env, code):
538         pass
539
540     # ---------------- Annotation ---------------------
541     
542     def annotate(self, code):
543         for node in self.subexpr_nodes():
544             node.annotate(code)
545     
546     # ----------------- Coercion ----------------------
547     
548     def coerce_to(self, dst_type, env):
549         #   Coerce the result so that it can be assigned to
550         #   something of type dst_type. If processing is necessary,
551         #   wraps this node in a coercion node and returns that.
552         #   Otherwise, returns this node unchanged.
553         #
554         #   This method is called during the analyse_expressions
555         #   phase of the src_node's processing.
556         #
557         #   Note that subclasses that override this (especially
558         #   ConstNodes) must not (re-)set their own .type attribute
559         #   here.  Since expression nodes may turn up in different
560         #   places in the tree (e.g. inside of CloneNodes in cascaded
561         #   assignments), this method must return a new node instance
562         #   if it changes the type.
563         #
564         src = self
565         src_type = self.type
566         src_is_py_type = src_type.is_pyobject
567         dst_is_py_type = dst_type.is_pyobject
568
569         if self.check_for_coercion_error(dst_type):
570             return self
571
572         if dst_type.is_reference:
573             dst_type = dst_type.ref_base_type
574         
575         if dst_type.is_pyobject:
576             if not src.type.is_pyobject:
577                 if dst_type is bytes_type and src.type.is_int:
578                     src = CoerceIntToBytesNode(src, env)
579                 else:
580                     src = CoerceToPyTypeNode(src, env)
581             if not src.type.subtype_of(dst_type):
582                 if not isinstance(src, NoneNode):
583                     src = PyTypeTestNode(src, dst_type, env)
584         elif src.type.is_pyobject:
585             src = CoerceFromPyTypeNode(dst_type, src, env)
586         elif (dst_type.is_complex 
587               and src_type != dst_type
588               and dst_type.assignable_from(src_type)):
589             src = CoerceToComplexNode(src, dst_type, env)
590         else: # neither src nor dst are py types
591             # Added the string comparison, since for c types that
592             # is enough, but Cython gets confused when the types are
593             # in different pxi files.
594             if not (str(src.type) == str(dst_type) or dst_type.assignable_from(src_type)):
595                 self.fail_assignment(dst_type)
596         return src
597
598     def fail_assignment(self, dst_type):
599         error(self.pos, "Cannot assign type '%s' to '%s'" % (self.type, dst_type))
600
601     def check_for_coercion_error(self, dst_type, fail=False, default=None):
602         if fail and not default:
603             default = "Cannot assign type '%(FROM)s' to '%(TO)s'"
604         message = find_coercion_error((self.type, dst_type), default)
605         if message is not None:
606             error(self.pos, message % {'FROM': self.type, 'TO': dst_type})
607             return True
608         if fail:
609             self.fail_assignment(dst_type)
610             return True
611         return False
612
613     def coerce_to_pyobject(self, env):
614         return self.coerce_to(PyrexTypes.py_object_type, env)
615
616     def coerce_to_boolean(self, env):
617         #  Coerce result to something acceptable as
618         #  a boolean value.
619
620         # if it's constant, calculate the result now
621         if self.has_constant_result():
622             bool_value = bool(self.constant_result)
623             return BoolNode(self.pos, value=bool_value,
624                             constant_result=bool_value)
625
626         type = self.type
627         if type.is_pyobject or type.is_ptr or type.is_float:
628             return CoerceToBooleanNode(self, env)
629         else:
630             if not (type.is_int or type.is_enum or type.is_error):
631                 error(self.pos, 
632                     "Type '%s' not acceptable as a boolean" % type)
633             return self
634     
635     def coerce_to_integer(self, env):
636         # If not already some C integer type, coerce to longint.
637         if self.type.is_int:
638             return self
639         else:
640             return self.coerce_to(PyrexTypes.c_long_type, env)
641     
642     def coerce_to_temp(self, env):
643         #  Ensure that the result is in a temporary.
644         if self.result_in_temp():
645             return self
646         else:
647             return CoerceToTempNode(self, env)
648     
649     def coerce_to_simple(self, env):
650         #  Ensure that the result is simple (see is_simple).
651         if self.is_simple():
652             return self
653         else:
654             return self.coerce_to_temp(env)
655     
656     def is_simple(self):
657         #  A node is simple if its result is something that can
658         #  be referred to without performing any operations, e.g.
659         #  a constant, local var, C global var, struct member
660         #  reference, or temporary.
661         return self.result_in_temp()
662
663     def may_be_none(self):
664         if not self.type.is_pyobject:
665             return False
666         if self.constant_result not in (not_a_constant, constant_value_not_set):
667             return self.constant_result is not None
668         return True
669
670     def as_cython_attribute(self):
671         return None
672
673     def as_none_safe_node(self, message, error="PyExc_TypeError"):
674         # Wraps the node in a NoneCheckNode if it is not known to be
675         # not-None (e.g. because it is a Python literal).
676         if self.may_be_none():
677             return NoneCheckNode(self, error, message)
678         else:
679             return self
680
681
682 class AtomicExprNode(ExprNode):
683     #  Abstract base class for expression nodes which have
684     #  no sub-expressions.
685     
686     subexprs = []
687
688     # Override to optimize -- we know we have no children
689     def generate_subexpr_evaluation_code(self, code):
690         pass
691     def generate_subexpr_disposal_code(self, code):
692         pass
693
694 class PyConstNode(AtomicExprNode):
695     #  Abstract base class for constant Python values.
696     
697     is_literal = 1
698     type = py_object_type
699     
700     def is_simple(self):
701         return 1
702
703     def may_be_none(self):
704         return False
705
706     def analyse_types(self, env):
707         pass
708     
709     def calculate_result_code(self):
710         return self.value
711
712     def generate_result_code(self, code):
713         pass
714
715
716 class NoneNode(PyConstNode):
717     #  The constant value None
718     
719     value = "Py_None"
720
721     constant_result = None
722     
723     nogil_check = None
724
725     def compile_time_value(self, denv):
726         return None
727
728     def may_be_none(self):
729         return True
730
731
732 class EllipsisNode(PyConstNode):
733     #  '...' in a subscript list.
734     
735     value = "Py_Ellipsis"
736
737     constant_result = Ellipsis
738
739     def compile_time_value(self, denv):
740         return Ellipsis
741
742
743 class ConstNode(AtomicExprNode):
744     # Abstract base type for literal constant nodes.
745     #
746     # value     string      C code fragment
747     
748     is_literal = 1
749     nogil_check = None
750
751     def is_simple(self):
752         return 1
753
754     def may_be_none(self):
755         return False
756
757     def analyse_types(self, env):
758         pass # Types are held in class variables
759     
760     def check_const(self):
761         return True
762     
763     def get_constant_c_result_code(self):
764         return self.calculate_result_code()
765
766     def calculate_result_code(self):
767         return str(self.value)
768
769     def generate_result_code(self, code):
770         pass
771
772
773 class BoolNode(ConstNode):
774     type = PyrexTypes.c_bint_type
775     #  The constant value True or False
776
777     def calculate_constant_result(self):
778         self.constant_result = self.value
779
780     def compile_time_value(self, denv):
781         return self.value
782     
783     def calculate_result_code(self):
784         return str(int(self.value))
785
786
787 class NullNode(ConstNode):
788     type = PyrexTypes.c_null_ptr_type
789     value = "NULL"
790     constant_result = 0
791
792     def get_constant_c_result_code(self):
793         return self.value
794
795
796 class CharNode(ConstNode):
797     type = PyrexTypes.c_char_type
798
799     def calculate_constant_result(self):
800         self.constant_result = ord(self.value)
801     
802     def compile_time_value(self, denv):
803         return ord(self.value)
804     
805     def calculate_result_code(self):
806         return "'%s'" % StringEncoding.escape_char(self.value)
807
808
809 class IntNode(ConstNode):
810
811     # unsigned     "" or "U"
812     # longness     "" or "L" or "LL"
813     # is_c_literal   True/False/None   creator considers this a C integer literal
814
815     unsigned = ""
816     longness = ""
817     is_c_literal = None # unknown
818
819     def __init__(self, pos, **kwds):
820         ExprNode.__init__(self, pos, **kwds)
821         if 'type' not in kwds:
822             self.type = self.find_suitable_type_for_value()
823
824     def find_suitable_type_for_value(self):
825         if self.constant_result is constant_value_not_set:
826             try:
827                 self.calculate_constant_result()
828             except ValueError:
829                 pass
830         # we ignore 'is_c_literal = True' and instead map signed 32bit
831         # integers as C long values
832         if self.is_c_literal or \
833                self.constant_result in (constant_value_not_set, not_a_constant) or \
834                self.unsigned or self.longness == 'LL':
835             # clearly a C literal
836             rank = (self.longness == 'LL') and 2 or 1
837             suitable_type = PyrexTypes.modifiers_and_name_to_type[not self.unsigned, rank, "int"]
838             if self.type:
839                 suitable_type = PyrexTypes.widest_numeric_type(suitable_type, self.type)
840         else:
841             # C literal or Python literal - split at 32bit boundary
842             if self.constant_result >= -2**31 and self.constant_result < 2**31:
843                 if self.type and self.type.is_int:
844                     suitable_type = self.type
845                 else:
846                     suitable_type = PyrexTypes.c_long_type
847             else:
848                 suitable_type = PyrexTypes.py_object_type
849         return suitable_type
850
851     def coerce_to(self, dst_type, env):
852         if self.type is dst_type:
853             return self
854         elif dst_type.is_float:
855             if self.constant_result is not not_a_constant:
856                 float_value = float(self.constant_result)
857                 return FloatNode(self.pos, value=repr(float_value), type=dst_type,
858                                  constant_result=float_value)
859             else:
860                 return FloatNode(self.pos, value=self.value, type=dst_type,
861                                  constant_result=not_a_constant)
862         if dst_type.is_numeric and not dst_type.is_complex:
863             node = IntNode(self.pos, value=self.value, constant_result=self.constant_result,
864                            type = dst_type, is_c_literal = True,
865                            unsigned=self.unsigned, longness=self.longness)
866             return node
867         elif dst_type.is_pyobject:
868             node = IntNode(self.pos, value=self.value, constant_result=self.constant_result,
869                            type = PyrexTypes.py_object_type, is_c_literal = False,
870                            unsigned=self.unsigned, longness=self.longness)
871         else:
872             # FIXME: not setting the type here to keep it working with
873             # complex numbers. Should they be special cased?
874             node = IntNode(self.pos, value=self.value, constant_result=self.constant_result,
875                            unsigned=self.unsigned, longness=self.longness)
876         # We still need to perform normal coerce_to processing on the
877         # result, because we might be coercing to an extension type,
878         # in which case a type test node will be needed.
879         return ConstNode.coerce_to(node, dst_type, env)
880
881     def coerce_to_boolean(self, env):
882         return IntNode(
883             self.pos, value=self.value,
884             type = PyrexTypes.c_bint_type,
885             unsigned=self.unsigned, longness=self.longness)
886
887     def generate_evaluation_code(self, code):
888         if self.type.is_pyobject:
889             # pre-allocate a Python version of the number
890             plain_integer_string = self.value_as_c_integer_string(plain_digits=True)
891             self.result_code = code.get_py_num(plain_integer_string, self.longness)
892         else:
893             self.result_code = self.get_constant_c_result_code()
894     
895     def get_constant_c_result_code(self):
896         return self.value_as_c_integer_string() + self.unsigned + self.longness
897
898     def value_as_c_integer_string(self, plain_digits=False):
899         value = self.value
900         if isinstance(value, basestring) and len(value) > 2:
901             # must convert C-incompatible Py3 oct/bin notations
902             if value[1] in 'oO':
903                 if plain_digits:
904                     value = int(value[2:], 8)
905                 else:
906                     value = value[0] + value[2:] # '0o123' => '0123'
907             elif value[1] in 'bB':
908                 value = int(value[2:], 2)
909             elif plain_digits and value[1] in 'xX':
910                 value = int(value[2:], 16)
911         return str(value)
912
913     def calculate_result_code(self):
914         return self.result_code
915
916     def calculate_constant_result(self):
917         self.constant_result = Utils.str_to_number(self.value)
918
919     def compile_time_value(self, denv):
920         return Utils.str_to_number(self.value)
921
922
923 class FloatNode(ConstNode):
924     type = PyrexTypes.c_double_type
925
926     def calculate_constant_result(self):
927         self.constant_result = float(self.value)
928
929     def compile_time_value(self, denv):
930         return float(self.value)
931     
932     def calculate_result_code(self):
933         strval = self.value
934         assert isinstance(strval, (str, unicode))
935         cmpval = repr(float(strval))
936         if cmpval == 'nan':
937             return "(Py_HUGE_VAL * 0)"
938         elif cmpval == 'inf':
939             return "Py_HUGE_VAL"
940         elif cmpval == '-inf':
941             return "(-Py_HUGE_VAL)"
942         else:
943             return strval
944
945
946 class BytesNode(ConstNode):
947     # A char* or bytes literal
948     #
949     # value      BytesLiteral
950
951     type = PyrexTypes.c_char_ptr_type
952
953     def compile_time_value(self, denv):
954         return self.value
955
956     def analyse_as_type(self, env):
957         type = PyrexTypes.parse_basic_type(self.value)
958         if type is not None:    
959             return type
960         from TreeFragment import TreeFragment
961         pos = (self.pos[0], self.pos[1], self.pos[2]-7)
962         declaration = TreeFragment(u"sizeof(%s)" % self.value, name=pos[0].filename, initial_pos=pos)
963         sizeof_node = declaration.root.stats[0].expr
964         sizeof_node.analyse_types(env)
965         if isinstance(sizeof_node, SizeofTypeNode):
966             return sizeof_node.arg_type
967
968     def can_coerce_to_char_literal(self):
969         return len(self.value) == 1
970
971     def coerce_to_boolean(self, env):
972         # This is special because we start off as a C char*.  Testing
973         # that for truth directly would yield the wrong result.
974         return BoolNode(self.pos, value=bool(self.value))
975
976     def coerce_to(self, dst_type, env):
977         if dst_type.is_int:
978             if not self.can_coerce_to_char_literal():
979                 error(self.pos, "Only single-character string literals can be coerced into ints.")
980                 return self
981             if dst_type is PyrexTypes.c_py_unicode_type:
982                 error(self.pos, "Bytes literals cannot coerce to Py_UNICODE, use a unicode literal instead.")
983                 return self
984             return CharNode(self.pos, value=self.value)
985
986         node = BytesNode(self.pos, value=self.value)
987         if dst_type == PyrexTypes.c_char_ptr_type:
988             node.type = PyrexTypes.c_char_ptr_type
989             return node
990         elif dst_type == PyrexTypes.c_uchar_ptr_type:
991             node.type = PyrexTypes.c_char_ptr_type
992             return CastNode(node, PyrexTypes.c_uchar_ptr_type)
993
994         if not self.type.is_pyobject:
995             if dst_type in (py_object_type, Builtin.bytes_type):
996                 node.type = Builtin.bytes_type
997             elif dst_type.is_pyobject:
998                 self.fail_assignment(dst_type)
999                 return self
1000         elif dst_type.is_pyobject and dst_type is not py_object_type:
1001             self.check_for_coercion_error(dst_type, fail=True)
1002             return node
1003
1004         # We still need to perform normal coerce_to processing on the
1005         # result, because we might be coercing to an extension type,
1006         # in which case a type test node will be needed.
1007         return ConstNode.coerce_to(node, dst_type, env)
1008
1009     def as_py_string_node(self, env):
1010         # Return a new BytesNode with the same value as this node
1011         # but whose type is a Python type instead of a C type.
1012         return BytesNode(self.pos, value = self.value, type = Builtin.bytes_type)
1013
1014     def generate_evaluation_code(self, code):
1015         if self.type.is_pyobject:
1016             self.result_code = code.get_py_string_const(self.value)
1017         else:
1018             self.result_code = code.get_string_const(self.value)
1019
1020     def get_constant_c_result_code(self):
1021         return None # FIXME
1022     
1023     def calculate_result_code(self):
1024         return self.result_code
1025
1026
1027 class UnicodeNode(PyConstNode):
1028     # A Python unicode object
1029     #
1030     # value        EncodedString
1031     # bytes_value  BytesLiteral    the literal parsed as bytes string ('-3' unicode literals only)
1032
1033     bytes_value = None
1034     type = unicode_type
1035
1036     def coerce_to(self, dst_type, env):
1037         if dst_type is self.type:
1038             pass
1039         elif dst_type is PyrexTypes.c_py_unicode_type:
1040             if not self.can_coerce_to_char_literal():
1041                 error(self.pos, "Only single-character Unicode string literals can be coerced into Py_UNICODE.")
1042                 return self
1043             int_value = ord(self.value)
1044             return IntNode(self.pos, value=int_value, constant_result=int_value)
1045         elif not dst_type.is_pyobject:
1046             if dst_type.is_string and self.bytes_value is not None:
1047                 # special case: '-3' enforced unicode literal used in a C char* context
1048                 return BytesNode(self.pos, value=self.bytes_value).coerce_to(dst_type, env)
1049             error(self.pos, "Unicode literals do not support coercion to C types other than Py_UNICODE.")
1050         elif dst_type is not py_object_type:
1051             if not self.check_for_coercion_error(dst_type):
1052                 self.fail_assignment(dst_type)
1053         return self
1054
1055     def can_coerce_to_char_literal(self):
1056         return len(self.value) == 1
1057
1058     def contains_surrogates(self):
1059         # Check if the unicode string contains surrogate code points
1060         # on a CPython platform with wide (UCS-4) or narrow (UTF-16)
1061         # Unicode, i.e. characters that would be spelled as two
1062         # separate code units on a narrow platform.
1063         for c in map(ord, self.value):
1064             if c > 65535: # can only happen on wide platforms
1065                 return True
1066             # We only look for the first code unit (D800-DBFF) of a
1067             # surrogate pair - if we find one, the other one
1068             # (DC00-DFFF) is likely there, too.  If we don't find it,
1069             # any second code unit cannot make for a surrogate pair by
1070             # itself.
1071             if c >= 0xD800 and c <= 0xDBFF:
1072                 return True
1073         return False
1074
1075     def generate_evaluation_code(self, code):
1076         self.result_code = code.get_py_string_const(self.value)
1077
1078     def calculate_result_code(self):
1079         return self.result_code
1080         
1081     def compile_time_value(self, env):
1082         return self.value
1083
1084
1085 class StringNode(PyConstNode):
1086     # A Python str object, i.e. a byte string in Python 2.x and a
1087     # unicode string in Python 3.x
1088     #
1089     # value          BytesLiteral (or EncodedString with ASCII content)
1090     # unicode_value  EncodedString or None
1091     # is_identifier  boolean
1092
1093     type = str_type
1094     is_identifier = None
1095     unicode_value = None
1096
1097     def coerce_to(self, dst_type, env):
1098         if dst_type is not py_object_type and not str_type.subtype_of(dst_type):
1099 #            if dst_type is Builtin.bytes_type:
1100 #                # special case: bytes = 'str literal'
1101 #                return BytesNode(self.pos, value=self.value)
1102             if not dst_type.is_pyobject:
1103                 return BytesNode(self.pos, value=self.value).coerce_to(dst_type, env)
1104             self.check_for_coercion_error(dst_type, fail=True)
1105
1106         # this will be a unicode string in Py3, so make sure we can decode it
1107         if self.value.encoding and isinstance(self.value, StringEncoding.BytesLiteral):
1108             try:
1109                 self.value.decode(self.value.encoding)
1110             except UnicodeDecodeError:
1111                 error(self.pos, ("Decoding unprefixed string literal from '%s' failed. Consider using"
1112                                  "a byte string or unicode string explicitly, "
1113                                  "or adjust the source code encoding.") % self.value.encoding)
1114
1115         return self
1116
1117     def can_coerce_to_char_literal(self):
1118         return not self.is_identifier and len(self.value) == 1
1119
1120     def generate_evaluation_code(self, code):
1121         self.result_code = code.get_py_string_const(
1122             self.value, identifier=self.is_identifier, is_str=True)
1123
1124     def get_constant_c_result_code(self):
1125         return None
1126
1127     def calculate_result_code(self):
1128         return self.result_code
1129         
1130     def compile_time_value(self, env):
1131         return self.value
1132
1133
1134 class IdentifierStringNode(StringNode):
1135     # A special str value that represents an identifier (bytes in Py2,
1136     # unicode in Py3).
1137     is_identifier = True
1138
1139
1140 class LongNode(AtomicExprNode):
1141     #  Python long integer literal
1142     #
1143     #  value   string
1144
1145     type = py_object_type
1146
1147     def calculate_constant_result(self):
1148         self.constant_result = Utils.str_to_number(self.value)
1149     
1150     def compile_time_value(self, denv):
1151         return Utils.str_to_number(self.value)
1152     
1153     def analyse_types(self, env):
1154         self.is_temp = 1
1155
1156     def may_be_none(self):
1157         return False
1158
1159     gil_message = "Constructing Python long int"
1160
1161     def generate_result_code(self, code):
1162         code.putln(
1163             '%s = PyLong_FromString((char *)"%s", 0, 0); %s' % (
1164                 self.result(),
1165                 self.value,
1166                 code.error_goto_if_null(self.result(), self.pos)))
1167         code.put_gotref(self.py_result())
1168
1169
1170 class ImagNode(AtomicExprNode):
1171     #  Imaginary number literal
1172     #
1173     #  value   float    imaginary part
1174     
1175     type = PyrexTypes.c_double_complex_type
1176
1177     def calculate_constant_result(self):
1178         self.constant_result = complex(0.0, self.value)
1179     
1180     def compile_time_value(self, denv):
1181         return complex(0.0, self.value)
1182     
1183     def analyse_types(self, env):
1184         self.type.create_declaration_utility_code(env)
1185
1186     def may_be_none(self):
1187         return False
1188
1189     def coerce_to(self, dst_type, env):
1190         if self.type is dst_type:
1191             return self
1192         node = ImagNode(self.pos, value=self.value)
1193         if dst_type.is_pyobject:
1194             node.is_temp = 1
1195             node.type = PyrexTypes.py_object_type
1196         # We still need to perform normal coerce_to processing on the
1197         # result, because we might be coercing to an extension type,
1198         # in which case a type test node will be needed.
1199         return AtomicExprNode.coerce_to(node, dst_type, env)
1200
1201     gil_message = "Constructing complex number"
1202
1203     def calculate_result_code(self):
1204         if self.type.is_pyobject:
1205             return self.result()
1206         else:
1207             return "%s(0, %r)" % (self.type.from_parts, float(self.value))
1208
1209     def generate_result_code(self, code):
1210         if self.type.is_pyobject:
1211             code.putln(
1212                 "%s = PyComplex_FromDoubles(0.0, %r); %s" % (
1213                     self.result(),
1214                     float(self.value),
1215                     code.error_goto_if_null(self.result(), self.pos)))
1216             code.put_gotref(self.py_result())
1217         
1218
1219 class NewExprNode(AtomicExprNode):
1220
1221     # C++ new statement
1222     #
1223     # cppclass              node                 c++ class to create
1224     
1225     type = None
1226     
1227     def infer_type(self, env):
1228         type = self.cppclass.analyse_as_type(env)
1229         if type is None or not type.is_cpp_class:
1230             error(self.pos, "new operator can only be applied to a C++ class")
1231             self.type = error_type
1232             return
1233         self.cpp_check(env)
1234         constructor = type.scope.lookup(u'<init>')
1235         if constructor is None:
1236             return_type = PyrexTypes.CFuncType(type, [])
1237             return_type = PyrexTypes.CPtrType(return_type)
1238             type.scope.declare_cfunction(u'<init>', return_type, self.pos)
1239             constructor = type.scope.lookup(u'<init>')
1240         self.class_type = type
1241         self.entry = constructor
1242         self.type = constructor.type
1243         return self.type
1244     
1245     def analyse_types(self, env):
1246         if self.type is None:
1247             self.infer_type(env)
1248
1249     def may_be_none(self):
1250         return False
1251
1252     def generate_result_code(self, code):
1253         pass
1254    
1255     def calculate_result_code(self):
1256         return "new " + self.class_type.declaration_code("")
1257
1258
1259 class NameNode(AtomicExprNode):
1260     #  Reference to a local or global variable name.
1261     #
1262     #  name            string    Python name of the variable
1263     #  entry           Entry     Symbol table entry
1264     #  type_entry      Entry     For extension type names, the original type entry
1265     
1266     is_name = True
1267     is_cython_module = False
1268     cython_attribute = None
1269     lhs_of_first_assignment = False
1270     is_used_as_rvalue = 0
1271     entry = None
1272     type_entry = None
1273
1274     def create_analysed_rvalue(pos, env, entry):
1275         node = NameNode(pos)
1276         node.analyse_types(env, entry=entry)
1277         return node
1278         
1279     def as_cython_attribute(self):
1280         return self.cython_attribute
1281     
1282     create_analysed_rvalue = staticmethod(create_analysed_rvalue)
1283     
1284     def type_dependencies(self, env):
1285         if self.entry is None:
1286             self.entry = env.lookup(self.name)
1287         if self.entry is not None and self.entry.type.is_unspecified:
1288             return (self.entry,)
1289         else:
1290             return ()
1291     
1292     def infer_type(self, env):
1293         if self.entry is None:
1294             self.entry = env.lookup(self.name)
1295         if self.entry is None:
1296             return py_object_type
1297         elif (self.entry.type.is_extension_type or self.entry.type.is_builtin_type) and \
1298                 self.name == self.entry.type.name:
1299             # Unfortunately the type attribute of type objects
1300             # is used for the pointer to the type they represent.
1301             return type_type
1302         else:
1303             return self.entry.type
1304     
1305     def compile_time_value(self, denv):
1306         try:
1307             return denv.lookup(self.name)
1308         except KeyError:
1309             error(self.pos, "Compile-time name '%s' not defined" % self.name)
1310
1311     def get_constant_c_result_code(self):
1312         if not self.entry or self.entry.type.is_pyobject:
1313             return None
1314         return self.entry.cname
1315     
1316     def coerce_to(self, dst_type, env):
1317         #  If coercing to a generic pyobject and this is a builtin
1318         #  C function with a Python equivalent, manufacture a NameNode
1319         #  referring to the Python builtin.
1320         #print "NameNode.coerce_to:", self.name, dst_type ###
1321         if dst_type is py_object_type:
1322             entry = self.entry
1323             if entry and entry.is_cfunction:
1324                 var_entry = entry.as_variable
1325                 if var_entry:
1326                     if var_entry.is_builtin and Options.cache_builtins:
1327                         var_entry = env.declare_builtin(var_entry.name, self.pos)
1328                     node = NameNode(self.pos, name = self.name)
1329                     node.entry = var_entry
1330                     node.analyse_rvalue_entry(env)
1331                     return node
1332         return super(NameNode, self).coerce_to(dst_type, env)
1333     
1334     def analyse_as_module(self, env):
1335         # Try to interpret this as a reference to a cimported module.
1336         # Returns the module scope, or None.
1337         entry = self.entry
1338         if not entry:
1339             entry = env.lookup(self.name)
1340         if entry and entry.as_module:
1341             return entry.as_module
1342         return None
1343         
1344     def analyse_as_type(self, env):
1345         if self.cython_attribute:
1346             type = PyrexTypes.parse_basic_type(self.cython_attribute)
1347         else:
1348             type = PyrexTypes.parse_basic_type(self.name)
1349         if type:
1350             return type
1351         entry = self.entry
1352         if not entry:
1353             entry = env.lookup(self.name)
1354         if entry and entry.is_type:
1355             return entry.type
1356         else:
1357             return None
1358     
1359     def analyse_as_extension_type(self, env):
1360         # Try to interpret this as a reference to an extension type.
1361         # Returns the extension type, or None.
1362         entry = self.entry
1363         if not entry:
1364             entry = env.lookup(self.name)
1365         if entry and entry.is_type and entry.type.is_extension_type:
1366             return entry.type
1367         else:
1368             return None
1369     
1370     def analyse_target_declaration(self, env):
1371         if not self.entry:
1372             self.entry = env.lookup_here(self.name)
1373         if not self.entry:
1374             if env.directives['warn.undeclared']:
1375                 warning(self.pos, "implicit declaration of '%s'" % self.name, 1)
1376             if env.directives['infer_types'] != False:
1377                 type = unspecified_type
1378             else:
1379                 type = py_object_type
1380             self.entry = env.declare_var(self.name, type, self.pos)
1381         env.control_flow.set_state(self.pos, (self.name, 'initialized'), True)
1382         env.control_flow.set_state(self.pos, (self.name, 'source'), 'assignment')
1383         if self.entry.is_declared_generic:
1384             self.result_ctype = py_object_type
1385     
1386     def analyse_types(self, env):
1387         if self.entry is None:
1388             self.entry = env.lookup(self.name)
1389         if not self.entry:
1390             self.entry = env.declare_builtin(self.name, self.pos)
1391         if not self.entry:
1392             self.type = PyrexTypes.error_type
1393             return
1394         entry = self.entry
1395         if entry:
1396             entry.used = 1
1397             if entry.type.is_buffer:
1398                 import Buffer
1399                 Buffer.used_buffer_aux_vars(entry)
1400             if entry.utility_code:
1401                 env.use_utility_code(entry.utility_code)
1402         self.analyse_rvalue_entry(env)
1403         
1404     def analyse_target_types(self, env):
1405         self.analyse_entry(env)
1406         if not self.is_lvalue():
1407             error(self.pos, "Assignment to non-lvalue '%s'"
1408                 % self.name)
1409             self.type = PyrexTypes.error_type
1410         self.entry.used = 1
1411         if self.entry.type.is_buffer:
1412             import Buffer
1413             Buffer.used_buffer_aux_vars(self.entry)
1414                 
1415     def analyse_rvalue_entry(self, env):
1416         #print "NameNode.analyse_rvalue_entry:", self.name ###
1417         #print "Entry:", self.entry.__dict__ ###
1418         self.analyse_entry(env)
1419         entry = self.entry
1420         if entry.is_declared_generic:
1421             self.result_ctype = py_object_type
1422         if entry.is_pyglobal or entry.is_builtin:
1423             if Options.cache_builtins and entry.is_builtin:
1424                 self.is_temp = 0
1425             else:
1426                 self.is_temp = 1
1427                 env.use_utility_code(get_name_interned_utility_code)
1428             self.is_used_as_rvalue = 1
1429
1430     def nogil_check(self, env):
1431         if self.is_used_as_rvalue:
1432             entry = self.entry
1433             if entry.is_builtin:
1434                 # if not Options.cache_builtins: # cached builtins are ok
1435                 self.gil_error()
1436             elif entry.is_pyglobal:
1437                 self.gil_error()
1438
1439     gil_message = "Accessing Python global or builtin"
1440
1441     def analyse_entry(self, env):
1442         #print "NameNode.analyse_entry:", self.name ###
1443         self.check_identifier_kind()
1444         entry = self.entry
1445         type = entry.type
1446         self.type = type
1447
1448     def check_identifier_kind(self):
1449         # Check that this is an appropriate kind of name for use in an
1450         # expression.  Also finds the variable entry associated with
1451         # an extension type.
1452         entry = self.entry
1453         if entry.is_type and entry.type.is_extension_type:
1454             self.type_entry = entry
1455         if not (entry.is_const or entry.is_variable 
1456             or entry.is_builtin or entry.is_cfunction
1457             or entry.is_cpp_class):
1458                 if self.entry.as_variable:
1459                     self.entry = self.entry.as_variable
1460                 else:
1461                     error(self.pos, 
1462                           "'%s' is not a constant, variable or function identifier" % self.name)
1463
1464     def is_simple(self):
1465         #  If it's not a C variable, it'll be in a temp.
1466         return 1
1467     
1468     def calculate_target_results(self, env):
1469         pass
1470     
1471     def check_const(self):
1472         entry = self.entry
1473         if entry is not None and not (entry.is_const or entry.is_cfunction or entry.is_builtin):
1474             self.not_const()
1475             return False
1476         return True
1477     
1478     def check_const_addr(self):
1479         entry = self.entry
1480         if not (entry.is_cglobal or entry.is_cfunction or entry.is_builtin):
1481             self.addr_not_const()
1482             return False
1483         return True
1484
1485     def is_lvalue(self):
1486         return self.entry.is_variable and \
1487             not self.entry.type.is_array and \
1488             not self.entry.is_readonly
1489     
1490     def is_ephemeral(self):
1491         #  Name nodes are never ephemeral, even if the
1492         #  result is in a temporary.
1493         return 0
1494     
1495     def calculate_result_code(self):
1496         entry = self.entry
1497         if not entry:
1498             return "<error>" # There was an error earlier
1499         return entry.cname
1500     
1501     def generate_result_code(self, code):
1502         assert hasattr(self, 'entry')
1503         entry = self.entry
1504         if entry is None:
1505             return # There was an error earlier
1506         if entry.is_builtin and Options.cache_builtins:
1507             return # Lookup already cached
1508         elif entry.is_pyclass_attr:
1509             assert entry.type.is_pyobject, "Python global or builtin not a Python object"
1510             interned_cname = code.intern_identifier(self.entry.name)
1511             if entry.is_builtin:
1512                 namespace = Naming.builtins_cname
1513             else: # entry.is_pyglobal
1514                 namespace = entry.scope.namespace_cname
1515             code.putln(
1516                 '%s = PyObject_GetItem(%s, %s); %s' % (
1517                 self.result(),
1518                 namespace,
1519                 interned_cname,
1520                 code.error_goto_if_null(self.result(), self.pos)))
1521             code.put_gotref(self.py_result())
1522             
1523         elif entry.is_pyglobal or entry.is_builtin:
1524             assert entry.type.is_pyobject, "Python global or builtin not a Python object"
1525             interned_cname = code.intern_identifier(self.entry.name)
1526             if entry.is_builtin:
1527                 namespace = Naming.builtins_cname
1528             else: # entry.is_pyglobal
1529                 namespace = entry.scope.namespace_cname
1530             code.globalstate.use_utility_code(get_name_interned_utility_code)
1531             code.putln(
1532                 '%s = __Pyx_GetName(%s, %s); %s' % (
1533                 self.result(),
1534                 namespace, 
1535                 interned_cname,
1536                 code.error_goto_if_null(self.result(), self.pos)))
1537             code.put_gotref(self.py_result())
1538             
1539         elif entry.is_local and False:
1540             # control flow not good enough yet
1541             assigned = entry.scope.control_flow.get_state((entry.name, 'initialized'), self.pos)
1542             if assigned is False:
1543                 error(self.pos, "local variable '%s' referenced before assignment" % entry.name)
1544             elif not Options.init_local_none and assigned is None:
1545                 code.putln('if (%s == 0) { PyErr_SetString(PyExc_UnboundLocalError, "%s"); %s }' %
1546                            (entry.cname, entry.name, code.error_goto(self.pos)))
1547                 entry.scope.control_flow.set_state(self.pos, (entry.name, 'initialized'), True)
1548
1549     def generate_assignment_code(self, rhs, code):
1550         #print "NameNode.generate_assignment_code:", self.name ###
1551         entry = self.entry
1552         if entry is None:
1553             return # There was an error earlier
1554
1555         if (self.entry.type.is_ptr and isinstance(rhs, ListNode)
1556             and not self.lhs_of_first_assignment):
1557             error(self.pos, "Literal list must be assigned to pointer at time of declaration")
1558         
1559         # is_pyglobal seems to be True for module level-globals only.
1560         # We use this to access class->tp_dict if necessary.
1561         if entry.is_pyglobal:
1562             assert entry.type.is_pyobject, "Python global or builtin not a Python object"
1563             interned_cname = code.intern_identifier(self.entry.name)
1564             namespace = self.entry.scope.namespace_cname
1565             if entry.is_member:
1566                 # if the entry is a member we have to cheat: SetAttr does not work
1567                 # on types, so we create a descriptor which is then added to tp_dict
1568                 code.put_error_if_neg(self.pos,
1569                     'PyDict_SetItem(%s->tp_dict, %s, %s)' % (
1570                         namespace,
1571                         interned_cname,
1572                         rhs.py_result()))
1573                 rhs.generate_disposal_code(code)
1574                 rhs.free_temps(code)
1575                 # in Py2.6+, we need to invalidate the method cache
1576                 code.putln("PyType_Modified(%s);" %
1577                             entry.scope.parent_type.typeptr_cname)
1578             elif entry.is_pyclass_attr:
1579                 code.put_error_if_neg(self.pos,
1580                     'PyObject_SetItem(%s, %s, %s)' % (
1581                         namespace,
1582                         interned_cname,
1583                         rhs.py_result()))
1584                 rhs.generate_disposal_code(code)
1585                 rhs.free_temps(code)
1586             else:
1587                 code.put_error_if_neg(self.pos,
1588                     'PyObject_SetAttr(%s, %s, %s)' % (
1589                         namespace,
1590                         interned_cname,
1591                         rhs.py_result()))
1592                 if debug_disposal_code:
1593                     print("NameNode.generate_assignment_code:")
1594                     print("...generating disposal code for %s" % rhs)
1595                 rhs.generate_disposal_code(code)
1596                 rhs.free_temps(code)
1597         else:
1598             if self.type.is_buffer:
1599                 # Generate code for doing the buffer release/acquisition.
1600                 # This might raise an exception in which case the assignment (done
1601                 # below) will not happen.
1602                 #
1603                 # The reason this is not in a typetest-like node is because the
1604                 # variables that the acquired buffer info is stored to is allocated
1605                 # per entry and coupled with it.
1606                 self.generate_acquire_buffer(rhs, code)
1607
1608             if self.type.is_pyobject:
1609                 #print "NameNode.generate_assignment_code: to", self.name ###
1610                 #print "...from", rhs ###
1611                 #print "...LHS type", self.type, "ctype", self.ctype() ###
1612                 #print "...RHS type", rhs.type, "ctype", rhs.ctype() ###
1613                 if self.use_managed_ref:
1614                     rhs.make_owned_reference(code)
1615                     if entry.is_cglobal:
1616                         code.put_gotref(self.py_result())
1617                     if not self.lhs_of_first_assignment:
1618                         if entry.is_local and not Options.init_local_none:
1619                             initialized = entry.scope.control_flow.get_state((entry.name, 'initialized'), self.pos)
1620                             if initialized is True:
1621                                 code.put_decref(self.result(), self.ctype())
1622                             elif initialized is None:
1623                                 code.put_xdecref(self.result(), self.ctype())
1624                         else:
1625                             code.put_decref(self.result(), self.ctype())
1626                     if entry.is_cglobal:
1627                         code.put_giveref(rhs.py_result())
1628
1629             code.putln('%s = %s;' % (self.result(),
1630                                      rhs.result_as(self.ctype())))
1631             if debug_disposal_code:
1632                 print("NameNode.generate_assignment_code:")
1633                 print("...generating post-assignment code for %s" % rhs)
1634             rhs.generate_post_assignment_code(code)
1635             rhs.free_temps(code)
1636
1637     def generate_acquire_buffer(self, rhs, code):
1638         # rhstmp is only used in case the rhs is a complicated expression leading to
1639         # the object, to avoid repeating the same C expression for every reference
1640         # to the rhs. It does NOT hold a reference.
1641         pretty_rhs = isinstance(rhs, NameNode) or rhs.is_temp
1642         if pretty_rhs:
1643             rhstmp = rhs.result_as(self.ctype())
1644         else:
1645             rhstmp = code.funcstate.allocate_temp(self.entry.type, manage_ref=False)
1646             code.putln('%s = %s;' % (rhstmp, rhs.result_as(self.ctype())))
1647
1648         buffer_aux = self.entry.buffer_aux
1649         bufstruct = buffer_aux.buffer_info_var.cname
1650         import Buffer
1651         Buffer.put_assign_to_buffer(self.result(), rhstmp, buffer_aux, self.entry.type,
1652                                     is_initialized=not self.lhs_of_first_assignment,
1653                                     pos=self.pos, code=code)
1654         
1655         if not pretty_rhs:
1656             code.putln("%s = 0;" % rhstmp)
1657             code.funcstate.release_temp(rhstmp)
1658     
1659     def generate_deletion_code(self, code):
1660         if self.entry is None:
1661             return # There was an error earlier
1662         if not self.entry.is_pyglobal:
1663             error(self.pos, "Deletion of local or C global name not supported")
1664             return
1665         if self.entry.is_pyclass_attr:
1666             namespace = self.entry.scope.namespace_cname
1667             code.put_error_if_neg(self.pos,
1668                 'PyMapping_DelItemString(%s, "%s")' % (
1669                     namespace,
1670                     self.entry.name))
1671         else:
1672             code.put_error_if_neg(self.pos, 
1673                 '__Pyx_DelAttrString(%s, "%s")' % (
1674                     Naming.module_cname,
1675                     self.entry.name))
1676                 
1677     def annotate(self, code):
1678         if hasattr(self, 'is_called') and self.is_called:
1679             pos = (self.pos[0], self.pos[1], self.pos[2] - len(self.name) - 1)
1680             if self.type.is_pyobject:
1681                 code.annotate(pos, AnnotationItem('py_call', 'python function', size=len(self.name)))
1682             else:
1683                 code.annotate(pos, AnnotationItem('c_call', 'c function', size=len(self.name)))
1684             
1685 class BackquoteNode(ExprNode):
1686     #  `expr`
1687     #
1688     #  arg    ExprNode
1689     
1690     type = py_object_type
1691     
1692     subexprs = ['arg']
1693     
1694     def analyse_types(self, env):
1695         self.arg.analyse_types(env)
1696         self.arg = self.arg.coerce_to_pyobject(env)
1697         self.is_temp = 1
1698
1699     gil_message = "Backquote expression"
1700
1701     def calculate_constant_result(self):
1702         self.constant_result = repr(self.arg.constant_result)
1703
1704     def generate_result_code(self, code):
1705         code.putln(
1706             "%s = PyObject_Repr(%s); %s" % (
1707                 self.result(),
1708                 self.arg.py_result(),
1709                 code.error_goto_if_null(self.result(), self.pos)))
1710         code.put_gotref(self.py_result())
1711         
1712
1713
1714 class ImportNode(ExprNode):
1715     #  Used as part of import statement implementation.
1716     #  Implements result = 
1717     #    __import__(module_name, globals(), None, name_list)
1718     #
1719     #  module_name   StringNode            dotted name of module
1720     #  name_list     ListNode or None      list of names to be imported
1721     
1722     type = py_object_type
1723     
1724     subexprs = ['module_name', 'name_list']
1725     
1726     def analyse_types(self, env):
1727         self.module_name.analyse_types(env)
1728         self.module_name = self.module_name.coerce_to_pyobject(env)
1729         if self.name_list:
1730             self.name_list.analyse_types(env)
1731             self.name_list.coerce_to_pyobject(env)
1732         self.is_temp = 1
1733         env.use_utility_code(import_utility_code)
1734
1735     gil_message = "Python import"
1736
1737     def generate_result_code(self, code):
1738         if self.name_list:
1739             name_list_code = self.name_list.py_result()
1740         else:
1741             name_list_code = "0"
1742         code.putln(
1743             "%s = __Pyx_Import(%s, %s); %s" % (
1744                 self.result(),
1745                 self.module_name.py_result(),
1746                 name_list_code,
1747                 code.error_goto_if_null(self.result(), self.pos)))
1748         code.put_gotref(self.py_result())
1749
1750
1751 class IteratorNode(ExprNode):
1752     #  Used as part of for statement implementation.
1753     #
1754     #  allocate_counter_temp/release_counter_temp needs to be called
1755     #  by parent (ForInStatNode)
1756     #
1757     #  Implements result = iter(sequence)
1758     #
1759     #  sequence   ExprNode
1760     
1761     type = py_object_type
1762     
1763     subexprs = ['sequence']
1764     
1765     def analyse_types(self, env):
1766         self.sequence.analyse_types(env)
1767         if (self.sequence.type.is_array or self.sequence.type.is_ptr) and \
1768                 not self.sequence.type.is_string:
1769             # C array iteration will be transformed later on
1770             self.type = self.sequence.type
1771         else:
1772             self.sequence = self.sequence.coerce_to_pyobject(env)
1773             if self.sequence.type is list_type or \
1774                    self.sequence.type is tuple_type:
1775                 self.sequence = self.sequence.as_none_safe_node("'NoneType' object is not iterable")
1776         self.is_temp = 1
1777
1778     gil_message = "Iterating over Python object"
1779
1780     def allocate_counter_temp(self, code):
1781         self.counter_cname = code.funcstate.allocate_temp(
1782             PyrexTypes.c_py_ssize_t_type, manage_ref=False)
1783
1784     def release_counter_temp(self, code):
1785         code.funcstate.release_temp(self.counter_cname)
1786
1787     def generate_result_code(self, code):
1788         if self.sequence.type.is_array or self.sequence.type.is_ptr:
1789             raise InternalError("for in carray slice not transformed")
1790         is_builtin_sequence = self.sequence.type is list_type or \
1791                               self.sequence.type is tuple_type
1792         may_be_a_sequence = not self.sequence.type.is_builtin_type
1793         if may_be_a_sequence:
1794             code.putln(
1795                 "if (PyList_CheckExact(%s) || PyTuple_CheckExact(%s)) {" % (
1796                     self.sequence.py_result(),
1797                     self.sequence.py_result()))
1798         if is_builtin_sequence or may_be_a_sequence:
1799             code.putln(
1800                 "%s = 0; %s = %s; __Pyx_INCREF(%s);" % (
1801                     self.counter_cname,
1802                     self.result(),
1803                     self.sequence.py_result(),
1804                     self.result()))
1805         if not is_builtin_sequence:
1806             if may_be_a_sequence:
1807                 code.putln("} else {")
1808             code.putln("%s = -1; %s = PyObject_GetIter(%s); %s" % (
1809                     self.counter_cname,
1810                     self.result(),
1811                     self.sequence.py_result(),
1812                     code.error_goto_if_null(self.result(), self.pos)))
1813             code.put_gotref(self.py_result())
1814             if may_be_a_sequence:
1815                 code.putln("}")
1816
1817
1818 class NextNode(AtomicExprNode):
1819     #  Used as part of for statement implementation.
1820     #  Implements result = iterator.next()
1821     #  Created during analyse_types phase.
1822     #  The iterator is not owned by this node.
1823     #
1824     #  iterator   ExprNode
1825     
1826     type = py_object_type
1827     
1828     def __init__(self, iterator, env):
1829         self.pos = iterator.pos
1830         self.iterator = iterator
1831         if iterator.type.is_ptr or iterator.type.is_array:
1832             self.type = iterator.type.base_type
1833         self.is_temp = 1
1834     
1835     def generate_result_code(self, code):
1836         sequence_type = self.iterator.sequence.type
1837         if sequence_type is list_type:
1838             type_checks = [(list_type, "List")]
1839         elif sequence_type is tuple_type:
1840             type_checks = [(tuple_type, "Tuple")]
1841         elif not sequence_type.is_builtin_type:
1842             type_checks = [(list_type, "List"), (tuple_type, "Tuple")]
1843         else:
1844             type_checks = []
1845
1846         for py_type, prefix in type_checks:
1847             if len(type_checks) > 1:
1848                 code.putln(
1849                     "if (likely(Py%s_CheckExact(%s))) {" % (
1850                         prefix, self.iterator.py_result()))
1851             code.putln(
1852                 "if (%s >= Py%s_GET_SIZE(%s)) break;" % (
1853                     self.iterator.counter_cname,
1854                     prefix,
1855                     self.iterator.py_result()))
1856             code.putln(
1857                 "%s = Py%s_GET_ITEM(%s, %s); __Pyx_INCREF(%s); %s++;" % (
1858                     self.result(),
1859                     prefix,
1860                     self.iterator.py_result(),
1861                     self.iterator.counter_cname,
1862                     self.result(),
1863                     self.iterator.counter_cname))
1864             if len(type_checks) > 1:
1865                 code.put("} else ")
1866         if len(type_checks) == 1:
1867             return
1868         code.putln("{")
1869         code.putln(
1870             "%s = PyIter_Next(%s);" % (
1871                 self.result(),
1872                 self.iterator.py_result()))
1873         code.putln(
1874             "if (!%s) {" %
1875                 self.result())
1876         code.putln(code.error_goto_if_PyErr(self.pos))
1877         code.putln("break;")
1878         code.putln("}")
1879         code.put_gotref(self.py_result())
1880         code.putln("}")
1881
1882
1883 class ExcValueNode(AtomicExprNode):
1884     #  Node created during analyse_types phase
1885     #  of an ExceptClauseNode to fetch the current
1886     #  exception value.
1887     
1888     type = py_object_type
1889     
1890     def __init__(self, pos, env):
1891         ExprNode.__init__(self, pos)
1892
1893     def set_var(self, var):
1894         self.var = var
1895     
1896     def calculate_result_code(self):
1897         return self.var
1898
1899     def generate_result_code(self, code):
1900         pass
1901
1902     def analyse_types(self, env):
1903         pass
1904
1905
1906 class TempNode(ExprNode):
1907     # Node created during analyse_types phase
1908     # of some nodes to hold a temporary value.
1909     #
1910     # Note: One must call "allocate" and "release" on
1911     # the node during code generation to get/release the temp.
1912     # This is because the temp result is often used outside of
1913     # the regular cycle.
1914
1915     subexprs = []
1916     
1917     def __init__(self, pos, type, env):
1918         ExprNode.__init__(self, pos)
1919         self.type = type
1920         if type.is_pyobject:
1921             self.result_ctype = py_object_type
1922         self.is_temp = 1
1923         
1924     def analyse_types(self, env):
1925         return self.type
1926     
1927     def generate_result_code(self, code):
1928         pass
1929
1930     def allocate(self, code):
1931         self.temp_cname = code.funcstate.allocate_temp(self.type, manage_ref=True)
1932
1933     def release(self, code):
1934         code.funcstate.release_temp(self.temp_cname)
1935         self.temp_cname = None
1936
1937     def result(self):
1938         try:
1939             return self.temp_cname
1940         except:
1941             assert False, "Remember to call allocate/release on TempNode"
1942             raise
1943
1944     # Do not participate in normal temp alloc/dealloc:
1945     def allocate_temp_result(self, code):
1946         pass
1947     
1948     def release_temp_result(self, code):
1949         pass
1950
1951 class PyTempNode(TempNode):
1952     #  TempNode holding a Python value.
1953     
1954     def __init__(self, pos, env):
1955         TempNode.__init__(self, pos, PyrexTypes.py_object_type, env)
1956
1957 class RawCNameExprNode(ExprNode):
1958     subexprs = []
1959     
1960     def __init__(self, pos, type=None):
1961         self.pos = pos
1962         self.type = type
1963
1964     def analyse_types(self, env):
1965         return self.type
1966
1967     def set_cname(self, cname):
1968         self.cname = cname
1969
1970     def result(self):
1971         return self.cname
1972
1973     def generate_result_code(self, code):
1974         pass
1975
1976
1977 #-------------------------------------------------------------------
1978 #
1979 #  Trailer nodes
1980 #
1981 #-------------------------------------------------------------------
1982
1983 class IndexNode(ExprNode):
1984     #  Sequence indexing.
1985     #
1986     #  base     ExprNode
1987     #  index    ExprNode
1988     #  indices  [ExprNode]
1989     #  is_buffer_access boolean Whether this is a buffer access.
1990     #
1991     #  indices is used on buffer access, index on non-buffer access.
1992     #  The former contains a clean list of index parameters, the
1993     #  latter whatever Python object is needed for index access.
1994     
1995     subexprs = ['base', 'index', 'indices']
1996     indices = None
1997
1998     def __init__(self, pos, index, *args, **kw):
1999         ExprNode.__init__(self, pos, index=index, *args, **kw)
2000         self._index = index
2001
2002     def calculate_constant_result(self):
2003         self.constant_result = \
2004             self.base.constant_result[self.index.constant_result]
2005
2006     def compile_time_value(self, denv):
2007         base = self.base.compile_time_value(denv)
2008         index = self.index.compile_time_value(denv)
2009         try:
2010             return base[index]
2011         except Exception, e:
2012             self.compile_time_value_error(e)
2013     
2014     def is_ephemeral(self):
2015         return self.base.is_ephemeral()
2016     
2017     def analyse_target_declaration(self, env):
2018         pass
2019         
2020     def analyse_as_type(self, env):
2021         base_type = self.base.analyse_as_type(env)
2022         if base_type and not base_type.is_pyobject:
2023             if base_type.is_cpp_class:
2024                 if isinstance(self.index, TupleNode):
2025                     template_values = self.index.args
2026                 else:
2027                     template_values = [self.index]
2028                 import Nodes
2029                 type_node = Nodes.TemplatedTypeNode(
2030                     pos = self.pos, 
2031                     positional_args = template_values, 
2032                     keyword_args = None)
2033                 return type_node.analyse(env, base_type = base_type)
2034             else:
2035                 return PyrexTypes.CArrayType(base_type, int(self.index.compile_time_value(env)))
2036         return None
2037     
2038     def type_dependencies(self, env):
2039         return self.base.type_dependencies(env)
2040     
2041     def infer_type(self, env):
2042         base_type = self.base.infer_type(env)
2043         if isinstance(self.index, SliceNode):
2044             # slicing!
2045             if base_type.is_string:
2046                 # sliced C strings must coerce to Python 
2047                 return bytes_type
2048             elif base_type in (unicode_type, bytes_type, str_type, list_type, tuple_type):
2049                 # slicing these returns the same type
2050                 return base_type
2051             else:
2052                 # TODO: Handle buffers (hopefully without too much redundancy).
2053                 return py_object_type
2054
2055         index_type = self.index.infer_type(env)
2056         if index_type and index_type.is_int or isinstance(self.index, (IntNode, LongNode)):
2057             # indexing!
2058             if base_type is unicode_type:
2059                 # Py_UNICODE will automatically coerce to a unicode string
2060                 # if required, so this is safe. We only infer Py_UNICODE
2061                 # when the index is a C integer type. Otherwise, we may
2062                 # need to use normal Python item access, in which case
2063                 # it's faster to return the one-char unicode string than
2064                 # to receive it, throw it away, and potentially rebuild it
2065                 # on a subsequent PyObject coercion.
2066                 return PyrexTypes.c_py_unicode_type
2067             elif isinstance(self.base, BytesNode):
2068                 #if env.global_scope().context.language_level >= 3:
2069                 #    # infering 'char' can be made to work in Python 3 mode
2070                 #    return PyrexTypes.c_char_type
2071                 # Py2/3 return different types on indexing bytes objects
2072                 return py_object_type
2073             elif base_type.is_ptr or base_type.is_array:
2074                 return base_type.base_type
2075
2076         # may be slicing or indexing, we don't know
2077         if base_type is unicode_type:
2078             # this type always returns its own type on Python indexing/slicing
2079             return base_type
2080         else:
2081             # TODO: Handle buffers (hopefully without too much redundancy).
2082             return py_object_type
2083     
2084     def analyse_types(self, env):
2085         self.analyse_base_and_index_types(env, getting = 1)
2086     
2087     def analyse_target_types(self, env):
2088         self.analyse_base_and_index_types(env, setting = 1)
2089
2090     def analyse_base_and_index_types(self, env, getting = 0, setting = 0):
2091         # Note: This might be cleaned up by having IndexNode
2092         # parsed in a saner way and only construct the tuple if
2093         # needed.
2094
2095         # Note that this function must leave IndexNode in a cloneable state.
2096         # For buffers, self.index is packed out on the initial analysis, and
2097         # when cloning self.indices is copied.
2098         self.is_buffer_access = False
2099
2100         self.base.analyse_types(env)
2101         if self.base.type.is_error:
2102             # Do not visit child tree if base is undeclared to avoid confusing
2103             # error messages
2104             self.type = PyrexTypes.error_type
2105             return
2106         
2107         is_slice = isinstance(self.index, SliceNode)
2108         # Potentially overflowing index value.
2109         if not is_slice and isinstance(self.index, IntNode) and Utils.long_literal(self.index.value):
2110             self.index = self.index.coerce_to_pyobject(env)
2111
2112         # Handle the case where base is a literal char* (and we expect a string, not an int)
2113         if isinstance(self.base, BytesNode) or is_slice:
2114             if self.base.type.is_string or not (self.base.type.is_ptr or self.base.type.is_array):
2115                 self.base = self.base.coerce_to_pyobject(env)
2116
2117         skip_child_analysis = False
2118         buffer_access = False
2119         if self.base.type.is_buffer:
2120             if self.indices:
2121                 indices = self.indices
2122             else:
2123                 if isinstance(self.index, TupleNode):
2124                     indices = self.index.args
2125                 else:
2126                     indices = [self.index]
2127             if len(indices) == self.base.type.ndim:
2128                 buffer_access = True
2129                 skip_child_analysis = True
2130                 for x in indices:
2131                     x.analyse_types(env)
2132                     if not x.type.is_int:
2133                         buffer_access = False
2134             if buffer_access:
2135                 assert hasattr(self.base, "entry") # Must be a NameNode-like node
2136
2137         # On cloning, indices is cloned. Otherwise, unpack index into indices
2138         assert not (buffer_access and isinstance(self.index, CloneNode))
2139
2140         if buffer_access:
2141             self.indices = indices
2142             self.index = None
2143             self.type = self.base.type.dtype
2144             self.is_buffer_access = True
2145             self.buffer_type = self.base.entry.type
2146
2147             if getting and self.type.is_pyobject:
2148                 self.is_temp = True
2149             if setting:
2150                 if not self.base.entry.type.writable:
2151                     error(self.pos, "Writing to readonly buffer")
2152                 else:
2153                     self.base.entry.buffer_aux.writable_needed = True
2154         else:
2155             base_type = self.base.type
2156             if isinstance(self.index, TupleNode):
2157                 self.index.analyse_types(env, skip_children=skip_child_analysis)
2158             elif not skip_child_analysis:
2159                 self.index.analyse_types(env)
2160             self.original_index_type = self.index.type
2161             if base_type is PyrexTypes.c_py_unicode_type:
2162                 # we infer Py_UNICODE for unicode strings in some
2163                 # cases, but indexing must still work for them
2164                 if self.index.constant_result in (0, -1):
2165                     # FIXME: we know that this node is redundant -
2166                     # currently, this needs to get handled in Optimize.py
2167                     pass
2168                 self.base = self.base.coerce_to_pyobject(env)
2169                 base_type = self.base.type
2170             if base_type.is_pyobject:
2171                 if self.index.type.is_int:
2172                     if (not setting
2173                         and (base_type in (list_type, tuple_type, unicode_type))
2174                         and (not self.index.type.signed or isinstance(self.index, IntNode) and int(self.index.value) >= 0)
2175                         and not env.directives['boundscheck']):
2176                         self.is_temp = 0
2177                     else:
2178                         self.is_temp = 1
2179                     self.index = self.index.coerce_to(PyrexTypes.c_py_ssize_t_type, env).coerce_to_simple(env)
2180                 else:
2181                     self.index = self.index.coerce_to_pyobject(env)
2182                     self.is_temp = 1
2183                 if self.index.type.is_int and base_type is unicode_type:
2184                     # Py_UNICODE will automatically coerce to a unicode string
2185                     # if required, so this is fast and safe
2186                     self.type = PyrexTypes.c_py_unicode_type
2187                 elif is_slice and base_type in (bytes_type, str_type, unicode_type, list_type, tuple_type):
2188                     self.type = base_type
2189                 else:
2190                     self.type = py_object_type
2191             else:
2192                 if base_type.is_ptr or base_type.is_array:
2193                     self.type = base_type.base_type
2194                     if is_slice:
2195                         self.type = base_type
2196                     elif self.index.type.is_pyobject:
2197                         self.index = self.index.coerce_to(
2198                             PyrexTypes.c_py_ssize_t_type, env)
2199                     elif not self.index.type.is_int:
2200                         error(self.pos,
2201                             "Invalid index type '%s'" %
2202                                 self.index.type)
2203                 elif base_type.is_cpp_class:
2204                     function = env.lookup_operator("[]", [self.base, self.index])
2205                     if function is None:
2206                         error(self.pos, "Indexing '%s' not supported for index type '%s'" % (base_type, self.index.type))
2207                         self.type = PyrexTypes.error_type
2208                         self.result_code = "<error>"
2209                         return
2210                     func_type = function.type
2211                     if func_type.is_ptr:
2212                         func_type = func_type.base_type
2213                     self.index = self.index.coerce_to(func_type.args[0].type, env)
2214                     self.type = func_type.return_type
2215                     if setting and not func_type.return_type.is_reference:
2216                         error(self.pos, "Can't set non-reference result '%s'" % self.type)
2217                 else:
2218                     error(self.pos,
2219                         "Attempting to index non-array type '%s'" %
2220                             base_type)
2221                     self.type = PyrexTypes.error_type
2222
2223     gil_message = "Indexing Python object"
2224
2225     def nogil_check(self, env):
2226         if self.is_buffer_access:
2227             if env.directives['boundscheck']:
2228                 error(self.pos, "Cannot check buffer index bounds without gil; use boundscheck(False) directive")
2229                 return
2230             elif self.type.is_pyobject:
2231                 error(self.pos, "Cannot access buffer with object dtype without gil")
2232                 return
2233         super(IndexNode, self).nogil_check(env)
2234
2235
2236     def check_const_addr(self):
2237         return self.base.check_const_addr() and self.index.check_const()
2238     
2239     def is_lvalue(self):
2240         return 1
2241
2242     def calculate_result_code(self):
2243         if self.is_buffer_access:
2244             return "(*%s)" % self.buffer_ptr_code
2245         elif self.base.type is list_type:
2246             return "PyList_GET_ITEM(%s, %s)" % (self.base.result(), self.index.result())
2247         elif self.base.type is tuple_type:
2248             return "PyTuple_GET_ITEM(%s, %s)" % (self.base.result(), self.index.result())
2249         elif self.base.type is unicode_type and self.type is PyrexTypes.c_py_unicode_type:
2250             return "PyUnicode_AS_UNICODE(%s)[%s]" % (self.base.result(), self.index.result())
2251         elif (self.type.is_ptr or self.type.is_array) and self.type == self.base.type:
2252             error(self.pos, "Invalid use of pointer slice")
2253         else:
2254             return "(%s[%s])" % (
2255                 self.base.result(), self.index.result())
2256             
2257     def extra_index_params(self):
2258         if self.index.type.is_int:
2259             if self.original_index_type.signed:
2260                 size_adjustment = ""
2261             else:
2262                 size_adjustment = "+1"
2263             return ", sizeof(%s)%s, %s" % (self.original_index_type.declaration_code(""), size_adjustment, self.original_index_type.to_py_function)
2264         else:
2265             return ""
2266
2267     def generate_subexpr_evaluation_code(self, code):
2268         self.base.generate_evaluation_code(code)
2269         if not self.indices:
2270             self.index.generate_evaluation_code(code)
2271         else:
2272             for i in self.indices:
2273                 i.generate_evaluation_code(code)
2274         
2275     def generate_subexpr_disposal_code(self, code):
2276         self.base.generate_disposal_code(code)
2277         if not self.indices:
2278             self.index.generate_disposal_code(code)
2279         else:
2280             for i in self.indices:
2281                 i.generate_disposal_code(code)
2282
2283     def free_subexpr_temps(self, code):
2284         self.base.free_temps(code)
2285         if not self.indices:
2286             self.index.free_temps(code)
2287         else:
2288             for i in self.indices:
2289                 i.free_temps(code)
2290
2291     def generate_result_code(self, code):
2292         if self.is_buffer_access:
2293             if code.globalstate.directives['nonecheck']:
2294                 self.put_nonecheck(code)
2295             self.buffer_ptr_code = self.buffer_lookup_code(code)
2296             if self.type.is_pyobject:
2297                 # is_temp is True, so must pull out value and incref it.
2298                 code.putln("%s = *%s;" % (self.result(), self.buffer_ptr_code))
2299                 code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result())
2300         elif self.is_temp:
2301             if self.type.is_pyobject:
2302                 if self.index.type.is_int:
2303                     index_code = self.index.result()
2304                     if self.base.type is list_type:
2305                         function = "__Pyx_GetItemInt_List"
2306                     elif self.base.type is tuple_type:
2307                         function = "__Pyx_GetItemInt_Tuple"
2308                     else:
2309                         function = "__Pyx_GetItemInt"
2310                     code.globalstate.use_utility_code(getitem_int_utility_code)
2311                 else:
2312                     index_code = self.index.py_result()
2313                     if self.base.type is dict_type:
2314                         function = "__Pyx_PyDict_GetItem"
2315                         code.globalstate.use_utility_code(getitem_dict_utility_code)
2316                     else:
2317                         function = "PyObject_GetItem"
2318                 code.putln(
2319                     "%s = %s(%s, %s%s); if (!%s) %s" % (
2320                         self.result(),
2321                         function,
2322                         self.base.py_result(),
2323                         index_code,
2324                         self.extra_index_params(),
2325                         self.result(),
2326                         code.error_goto(self.pos)))
2327                 code.put_gotref(self.py_result())
2328             elif self.type is PyrexTypes.c_py_unicode_type and self.base.type is unicode_type:
2329                 assert self.index.type.is_int
2330                 index_code = self.index.result()
2331                 function = "__Pyx_GetItemInt_Unicode"
2332                 code.globalstate.use_utility_code(getitem_int_pyunicode_utility_code)
2333                 code.putln(
2334                     "%s = %s(%s, %s%s); if (unlikely(%s == (Py_UNICODE)-1)) %s;" % (
2335                         self.result(),
2336                         function,
2337                         self.base.py_result(),
2338                         index_code,
2339                         self.extra_index_params(),
2340                         self.result(),
2341                         code.error_goto(self.pos)))
2342             
2343     def generate_setitem_code(self, value_code, code):
2344         if self.index.type.is_int:
2345             function = "__Pyx_SetItemInt"
2346             index_code = self.index.result()
2347             code.globalstate.use_utility_code(setitem_int_utility_code)
2348         else:
2349             index_code = self.index.py_result()
2350             if self.base.type is dict_type:
2351                 function = "PyDict_SetItem"
2352             # It would seem that we could specialized lists/tuples, but that
2353             # shouldn't happen here. 
2354             # Both PyList_SetItem PyTuple_SetItem and a Py_ssize_t as input, 
2355             # not a PyObject*, and bad conversion here would give the wrong 
2356             # exception. Also, tuples are supposed to be immutable, and raise 
2357             # TypeErrors when trying to set their entries (PyTuple_SetItem 
2358             # is for creating new tuples from). 
2359             else:
2360                 function = "PyObject_SetItem"
2361         code.putln(
2362             "if (%s(%s, %s, %s%s) < 0) %s" % (
2363                 function,
2364                 self.base.py_result(),
2365                 index_code,
2366                 value_code,
2367                 self.extra_index_params(),
2368                 code.error_goto(self.pos)))
2369
2370     def generate_buffer_setitem_code(self, rhs, code, op=""):
2371         # Used from generate_assignment_code and InPlaceAssignmentNode
2372         if code.globalstate.directives['nonecheck']:
2373             self.put_nonecheck(code)
2374         ptrexpr = self.buffer_lookup_code(code)
2375         if self.buffer_type.dtype.is_pyobject:
2376             # Must manage refcounts. Decref what is already there
2377             # and incref what we put in.
2378             ptr = code.funcstate.allocate_temp(self.buffer_type.buffer_ptr_type, manage_ref=False)
2379             rhs_code = rhs.result()
2380             code.putln("%s = %s;" % (ptr, ptrexpr))
2381             code.put_gotref("*%s" % ptr)
2382             code.putln("__Pyx_DECREF(*%s); __Pyx_INCREF(%s);" % (
2383                 ptr, rhs_code
2384                 ))
2385             code.putln("*%s %s= %s;" % (ptr, op, rhs_code))
2386             code.put_giveref("*%s" % ptr)
2387             code.funcstate.release_temp(ptr)
2388         else: 
2389             # Simple case
2390             code.putln("*%s %s= %s;" % (ptrexpr, op, rhs.result()))
2391
2392     def generate_assignment_code(self, rhs, code):
2393         self.generate_subexpr_evaluation_code(code)
2394         if self.is_buffer_access:
2395             self.generate_buffer_setitem_code(rhs, code)
2396         elif self.type.is_pyobject:
2397             self.generate_setitem_code(rhs.py_result(), code)
2398         else:
2399             code.putln(
2400                 "%s = %s;" % (
2401                     self.result(), rhs.result()))
2402         self.generate_subexpr_disposal_code(code)
2403         self.free_subexpr_temps(code)
2404         rhs.generate_disposal_code(code)
2405         rhs.free_temps(code)
2406     
2407     def generate_deletion_code(self, code):
2408         self.generate_subexpr_evaluation_code(code)
2409         #if self.type.is_pyobject:
2410         if self.index.type.is_int:
2411             function = "__Pyx_DelItemInt"
2412             index_code = self.index.result()
2413             code.globalstate.use_utility_code(delitem_int_utility_code)
2414         else:
2415             index_code = self.index.py_result()
2416             if self.base.type is dict_type:
2417                 function = "PyDict_DelItem"
2418             else:
2419                 function = "PyObject_DelItem"
2420         code.putln(
2421             "if (%s(%s, %s%s) < 0) %s" % (
2422                 function,
2423                 self.base.py_result(),
2424                 index_code,
2425                 self.extra_index_params(),
2426                 code.error_goto(self.pos)))
2427         self.generate_subexpr_disposal_code(code)
2428         self.free_subexpr_temps(code)
2429
2430     def buffer_lookup_code(self, code):
2431         # Assign indices to temps
2432         index_temps = [code.funcstate.allocate_temp(i.type, manage_ref=False) for i in self.indices]
2433         for temp, index in zip(index_temps, self.indices):
2434             code.putln("%s = %s;" % (temp, index.result()))
2435         # Generate buffer access code using these temps
2436         import Buffer
2437         # The above could happen because child_attrs is wrong somewhere so that
2438         # options are not propagated.
2439         return Buffer.put_buffer_lookup_code(entry=self.base.entry,
2440                                              index_signeds=[i.type.signed for i in self.indices],
2441                                              index_cnames=index_temps,
2442                                              directives=code.globalstate.directives,
2443                                              pos=self.pos, code=code)
2444
2445     def put_nonecheck(self, code):
2446         code.globalstate.use_utility_code(raise_noneindex_error_utility_code)
2447         code.putln("if (%s) {" % code.unlikely("%s == Py_None") % self.base.result_as(PyrexTypes.py_object_type))
2448         code.putln("__Pyx_RaiseNoneIndexingError();")
2449         code.putln(code.error_goto(self.pos))
2450         code.putln("}")
2451
2452 class SliceIndexNode(ExprNode):
2453     #  2-element slice indexing
2454     #
2455     #  base      ExprNode
2456     #  start     ExprNode or None
2457     #  stop      ExprNode or None
2458     
2459     subexprs = ['base', 'start', 'stop']
2460
2461     def infer_type(self, env):
2462         base_type = self.base.infer_type(env)
2463         if base_type.is_string:
2464             return bytes_type
2465         elif base_type in (bytes_type, str_type, unicode_type,
2466                            list_type, tuple_type):
2467             return base_type
2468         return py_object_type
2469
2470     def calculate_constant_result(self):
2471         self.constant_result = self.base.constant_result[
2472             self.start.constant_result : self.stop.constant_result]
2473
2474     def compile_time_value(self, denv):
2475         base = self.base.compile_time_value(denv)
2476         if self.start is None:
2477             start = 0
2478         else:
2479             start = self.start.compile_time_value(denv)
2480         if self.stop is None:
2481             stop = None
2482         else:
2483             stop = self.stop.compile_time_value(denv)
2484         try:
2485             return base[start:stop]
2486         except Exception, e:
2487             self.compile_time_value_error(e)
2488     
2489     def analyse_target_declaration(self, env):
2490         pass
2491     
2492     def analyse_target_types(self, env):
2493         self.analyse_types(env)
2494         # when assigning, we must accept any Python type
2495         if self.type.is_pyobject:
2496             self.type = py_object_type
2497
2498     def analyse_types(self, env):
2499         self.base.analyse_types(env)
2500         if self.start:
2501             self.start.analyse_types(env)
2502         if self.stop:
2503             self.stop.analyse_types(env)
2504         base_type = self.base.type
2505         if base_type.is_string:
2506             self.type = bytes_type
2507         elif base_type.is_ptr:
2508             self.type = base_type
2509         elif base_type.is_array:
2510             # we need a ptr type here instead of an array type, as
2511             # array types can result in invalid type casts in the C
2512             # code
2513             self.type = PyrexTypes.CPtrType(base_type.base_type)
2514         else:
2515             self.base = self.base.coerce_to_pyobject(env)
2516             self.type = py_object_type
2517         if base_type.is_builtin_type:
2518             # slicing builtin types returns something of the same type
2519             self.type = base_type
2520         c_int = PyrexTypes.c_py_ssize_t_type
2521         if self.start:
2522             self.start = self.start.coerce_to(c_int, env)
2523         if self.stop:
2524             self.stop = self.stop.coerce_to(c_int, env)
2525         self.is_temp = 1
2526
2527     nogil_check = Node.gil_error
2528     gil_message = "Slicing Python object"
2529
2530     def generate_result_code(self, code):
2531         if not self.type.is_pyobject:
2532             error(self.pos,
2533                   "Slicing is not currently supported for '%s'." % self.type)
2534             return
2535         if self.base.type.is_string:
2536             if self.stop is None:
2537                 code.putln(
2538                     "%s = PyBytes_FromString(%s + %s); %s" % (
2539                         self.result(),
2540                         self.base.result(),
2541                         self.start_code(),
2542                         code.error_goto_if_null(self.result(), self.pos)))
2543             else:
2544                 code.putln(
2545                     "%s = PyBytes_FromStringAndSize(%s + %s, %s - %s); %s" % (
2546                         self.result(),
2547                         self.base.result(),
2548                         self.start_code(),
2549                         self.stop_code(),
2550                         self.start_code(),
2551                         code.error_goto_if_null(self.result(), self.pos)))
2552         else:
2553             code.putln(
2554                 "%s = __Pyx_PySequence_GetSlice(%s, %s, %s); %s" % (
2555                     self.result(),
2556                     self.base.py_result(),
2557                     self.start_code(),
2558                     self.stop_code(),
2559                     code.error_goto_if_null(self.result(), self.pos)))
2560         code.put_gotref(self.py_result())
2561     
2562     def generate_assignment_code(self, rhs, code):
2563         self.generate_subexpr_evaluation_code(code)
2564         if self.type.is_pyobject:
2565             code.put_error_if_neg(self.pos, 
2566                 "__Pyx_PySequence_SetSlice(%s, %s, %s, %s)" % (
2567                     self.base.py_result(),
2568                     self.start_code(),
2569                     self.stop_code(),
2570                     rhs.py_result()))
2571         else:
2572             start_offset = ''
2573             if self.start:
2574                 start_offset = self.start_code()
2575                 if start_offset == '0':
2576                     start_offset = ''
2577                 else:
2578                     start_offset += '+'
2579             if rhs.type.is_array:
2580                 array_length = rhs.type.size
2581                 self.generate_slice_guard_code(code, array_length)
2582             else:
2583                 error(self.pos,
2584                       "Slice assignments from pointers are not yet supported.")
2585                 # FIXME: fix the array size according to start/stop
2586                 array_length = self.base.type.size
2587             for i in range(array_length):
2588                 code.putln("%s[%s%s] = %s[%d];" % (
2589                         self.base.result(), start_offset, i,
2590                         rhs.result(), i))
2591         self.generate_subexpr_disposal_code(code)
2592         self.free_subexpr_temps(code)
2593         rhs.generate_disposal_code(code)
2594         rhs.free_temps(code)
2595
2596     def generate_deletion_code(self, code):
2597         if not self.base.type.is_pyobject:
2598             error(self.pos,
2599                   "Deleting slices is only supported for Python types, not '%s'." % self.type)
2600             return
2601         self.generate_subexpr_evaluation_code(code)
2602         code.put_error_if_neg(self.pos,
2603             "__Pyx_PySequence_DelSlice(%s, %s, %s)" % (
2604                 self.base.py_result(),
2605                 self.start_code(),
2606                 self.stop_code()))
2607         self.generate_subexpr_disposal_code(code)
2608
2609     def generate_slice_guard_code(self, code, target_size):
2610         if not self.base.type.is_array:
2611             return
2612         slice_size = self.base.type.size
2613         start = stop = None
2614         if self.stop:
2615             stop = self.stop.result()
2616             try:
2617                 stop = int(stop)
2618                 if stop < 0:
2619                     slice_size = self.base.type.size + stop
2620                 else:
2621                     slice_size = stop
2622                 stop = None
2623             except ValueError:
2624                 pass
2625         if self.start:
2626             start = self.start.result()
2627             try:
2628                 start = int(start)
2629                 if start < 0:
2630                     start = self.base.type.size + start
2631                 slice_size -= start
2632                 start = None
2633             except ValueError:
2634                 pass
2635         check = None
2636         if slice_size < 0:
2637             if target_size > 0:
2638                 error(self.pos, "Assignment to empty slice.")
2639         elif start is None and stop is None:
2640             # we know the exact slice length
2641             if target_size != slice_size:
2642                 error(self.pos, "Assignment to slice of wrong length, expected %d, got %d" % (
2643                         slice_size, target_size))
2644         elif start is not None:
2645             if stop is None:
2646                 stop = slice_size
2647             check = "(%s)-(%s)" % (stop, start)
2648         else: # stop is not None:
2649             check = stop
2650         if check:
2651             code.putln("if (unlikely((%s) != %d)) {" % (check, target_size))
2652             code.putln('PyErr_Format(PyExc_ValueError, "Assignment to slice of wrong length, expected %%"PY_FORMAT_SIZE_T"d, got %%"PY_FORMAT_SIZE_T"d", (Py_ssize_t)%d, (Py_ssize_t)(%s));' % (
2653                         target_size, check))
2654             code.putln(code.error_goto(self.pos))
2655             code.putln("}")
2656     
2657     def start_code(self):
2658         if self.start:
2659             return self.start.result()
2660         else:
2661             return "0"
2662     
2663     def stop_code(self):
2664         if self.stop:
2665             return self.stop.result()
2666         elif self.base.type.is_array:
2667             return self.base.type.size
2668         else:
2669             return "PY_SSIZE_T_MAX"
2670     
2671     def calculate_result_code(self):
2672         # self.result() is not used, but this method must exist
2673         return "<unused>"
2674     
2675
2676 class SliceNode(ExprNode):
2677     #  start:stop:step in subscript list
2678     #
2679     #  start     ExprNode
2680     #  stop      ExprNode
2681     #  step      ExprNode
2682     
2683     type = py_object_type
2684     is_temp = 1
2685
2686     def calculate_constant_result(self):
2687         self.constant_result = self.base.constant_result[
2688             self.start.constant_result : \
2689                 self.stop.constant_result : \
2690                 self.step.constant_result]
2691
2692     def compile_time_value(self, denv):
2693         start = self.start.compile_time_value(denv)
2694         if self.stop is None:
2695             stop = None
2696         else:
2697             stop = self.stop.compile_time_value(denv)
2698         if self.step is None:
2699             step = None
2700         else:
2701             step = self.step.compile_time_value(denv)
2702         try:
2703             return slice(start, stop, step)
2704         except Exception, e:
2705             self.compile_time_value_error(e)
2706
2707     subexprs = ['start', 'stop', 'step']
2708     
2709     def analyse_types(self, env):
2710         self.start.analyse_types(env)
2711         self.stop.analyse_types(env)
2712         self.step.analyse_types(env)
2713         self.start = self.start.coerce_to_pyobject(env)
2714         self.stop = self.stop.coerce_to_pyobject(env)
2715         self.step = self.step.coerce_to_pyobject(env)
2716
2717     gil_message = "Constructing Python slice object"
2718
2719     def generate_result_code(self, code):
2720         code.putln(
2721             "%s = PySlice_New(%s, %s, %s); %s" % (
2722                 self.result(),
2723                 self.start.py_result(), 
2724                 self.stop.py_result(), 
2725                 self.step.py_result(),
2726                 code.error_goto_if_null(self.result(), self.pos)))
2727         code.put_gotref(self.py_result())
2728
2729
2730 class CallNode(ExprNode):
2731
2732     # allow overriding the default 'may_be_none' behaviour
2733     may_return_none = None
2734
2735     def may_be_none(self):
2736         if self.may_return_none is not None:
2737             return self.may_return_none
2738         return ExprNode.may_be_none(self)
2739
2740     def analyse_as_type_constructor(self, env):
2741         type = self.function.analyse_as_type(env)
2742         if type and type.is_struct_or_union:
2743             args, kwds = self.explicit_args_kwds()
2744             items = []
2745             for arg, member in zip(args, type.scope.var_entries):
2746                 items.append(DictItemNode(pos=arg.pos, key=StringNode(pos=arg.pos, value=member.name), value=arg))
2747             if kwds:
2748                 items += kwds.key_value_pairs
2749             self.key_value_pairs = items
2750             self.__class__ = DictNode
2751             self.analyse_types(env)
2752             self.coerce_to(type, env)
2753             return True
2754         elif type and type.is_cpp_class:
2755             for arg in self.args:
2756                 arg.analyse_types(env)
2757             constructor = type.scope.lookup("<init>")
2758             self.function = RawCNameExprNode(self.function.pos, constructor.type)
2759             self.function.entry = constructor
2760             self.function.set_cname(type.declaration_code(""))
2761             self.analyse_c_function_call(env)
2762             return True
2763     
2764     def is_lvalue(self):
2765         return self.type.is_reference
2766
2767     def nogil_check(self, env):
2768         func_type = self.function_type()
2769         if func_type.is_pyobject:
2770             self.gil_error()
2771         elif not getattr(func_type, 'nogil', False):
2772             self.gil_error()
2773
2774     gil_message = "Calling gil-requiring function"
2775
2776
2777 class SimpleCallNode(CallNode):
2778     #  Function call without keyword, * or ** args.
2779     #
2780     #  function       ExprNode
2781     #  args           [ExprNode]
2782     #  arg_tuple      ExprNode or None     used internally
2783     #  self           ExprNode or None     used internally
2784     #  coerced_self   ExprNode or None     used internally
2785     #  wrapper_call   bool                 used internally
2786     #  has_optional_args   bool            used internally
2787     #  nogil          bool                 used internally
2788     
2789     subexprs = ['self', 'coerced_self', 'function', 'args', 'arg_tuple']
2790     
2791     self = None
2792     coerced_self = None
2793     arg_tuple = None
2794     wrapper_call = False
2795     has_optional_args = False
2796     nogil = False
2797     analysed = False
2798     
2799     def compile_time_value(self, denv):
2800         function = self.function.compile_time_value(denv)
2801         args = [arg.compile_time_value(denv) for arg in self.args]
2802         try:
2803             return function(*args)
2804         except Exception, e:
2805             self.compile_time_value_error(e)
2806             
2807     def type_dependencies(self, env):
2808         # TODO: Update when Danilo's C++ code merged in to handle the
2809         # the case of function overloading.
2810         return self.function.type_dependencies(env)
2811     
2812     def infer_type(self, env):
2813         function = self.function
2814         func_type = function.infer_type(env)
2815         if isinstance(self.function, NewExprNode):
2816             return PyrexTypes.CPtrType(self.function.class_type)
2817         if func_type.is_ptr:
2818             func_type = func_type.base_type
2819         if func_type.is_cfunction:
2820             return func_type.return_type
2821         elif func_type is type_type:
2822             if function.is_name and function.entry and function.entry.type:
2823                 result_type = function.entry.type
2824                 if result_type.is_extension_type:
2825                     return result_type
2826                 elif result_type.is_builtin_type:
2827                     if function.entry.name == 'float':
2828                         return PyrexTypes.c_double_type
2829                     elif function.entry.name in Builtin.types_that_construct_their_instance:
2830                         return result_type
2831         return py_object_type
2832
2833     def analyse_as_type(self, env):
2834         attr = self.function.as_cython_attribute()
2835         if attr == 'pointer':
2836             if len(self.args) != 1:
2837                 error(self.args.pos, "only one type allowed.")
2838             else:
2839                 type = self.args[0].analyse_as_type(env)
2840                 if not type:
2841                     error(self.args[0].pos, "Unknown type")
2842                 else:
2843                     return PyrexTypes.CPtrType(type)
2844
2845     def explicit_args_kwds(self):
2846         return self.args, None
2847
2848     def analyse_types(self, env):
2849         if self.analyse_as_type_constructor(env):
2850             return
2851         if self.analysed:
2852             return
2853         self.analysed = True
2854         function = self.function
2855         function.is_called = 1
2856         self.function.analyse_types(env)
2857         if function.is_attribute and function.entry and function.entry.is_cmethod:
2858             # Take ownership of the object from which the attribute
2859             # was obtained, because we need to pass it as 'self'.
2860             self.self = function.obj
2861             function.obj = CloneNode(self.self)
2862         func_type = self.function_type()
2863         if func_type.is_pyobject:
2864             self.arg_tuple = TupleNode(self.pos, args = self.args)
2865             self.arg_tuple.analyse_types(env)
2866             self.args = None
2867             if func_type is Builtin.type_type and function.is_name and \
2868                    function.entry and \
2869                    function.entry.is_builtin and \
2870                    function.entry.name in Builtin.types_that_construct_their_instance:
2871                 # calling a builtin type that returns a specific object type
2872                 if function.entry.name == 'float':
2873                     # the following will come true later on in a transform
2874                     self.type = PyrexTypes.c_double_type
2875                     self.result_ctype = PyrexTypes.c_double_type
2876                 else:
2877                     self.type = Builtin.builtin_types[function.entry.name]
2878                     self.result_ctype = py_object_type
2879                 self.may_return_none = False
2880             elif function.is_name and function.type_entry:
2881                 # We are calling an extension type constructor.  As
2882                 # long as we do not support __new__(), the result type
2883                 # is clear
2884                 self.type = function.type_entry.type
2885                 self.result_ctype = py_object_type
2886                 self.may_return_none = False
2887             else:
2888                 self.type = py_object_type
2889             self.is_temp = 1
2890         else:
2891             for arg in self.args:
2892                 arg.analyse_types(env)
2893             if self.self and func_type.args:
2894                 # Coerce 'self' to the type expected by the method.
2895                 self_arg = func_type.args[0]
2896                 if self_arg.not_none: # C methods must do the None test for self at *call* time
2897                     self.self = self.self.as_none_safe_node(
2898                         "'NoneType' object has no attribute '%s'" % self.function.entry.name,
2899                         'PyExc_AttributeError')
2900                 expected_type = self_arg.type
2901                 self.coerced_self = CloneNode(self.self).coerce_to(
2902                     expected_type, env)
2903                 # Insert coerced 'self' argument into argument list.
2904                 self.args.insert(0, self.coerced_self)
2905             self.analyse_c_function_call(env)
2906     
2907     def function_type(self):
2908         # Return the type of the function being called, coercing a function
2909         # pointer to a function if necessary.
2910         func_type = self.function.type
2911         if func_type.is_ptr:
2912             func_type = func_type.base_type
2913         return func_type
2914     
2915     def analyse_c_function_call(self, env):
2916         if self.function.type is error_type:
2917             self.type = error_type
2918             return
2919         if self.function.type.is_cpp_class:
2920             overloaded_entry = self.function.type.scope.lookup("operator()")
2921             if overloaded_entry is None:
2922                 self.type = PyrexTypes.error_type
2923                 self.result_code = "<error>"
2924                 return
2925         elif hasattr(self.function, 'entry'):
2926             overloaded_entry = self.function.entry
2927         else:
2928             overloaded_entry = None
2929         if overloaded_entry:
2930             entry = PyrexTypes.best_match(self.args, overloaded_entry.all_alternatives(), self.pos)
2931             if not entry:
2932                 self.type = PyrexTypes.error_type
2933                 self.result_code = "<error>"
2934                 return
2935             self.function.entry = entry
2936             self.function.type = entry.type
2937             func_type = self.function_type()
2938         else:
2939             func_type = self.function_type()
2940             if not func_type.is_cfunction:
2941                 error(self.pos, "Calling non-function type '%s'" % func_type)
2942                 self.type = PyrexTypes.error_type
2943                 self.result_code = "<error>"
2944                 return
2945         # Check no. of args
2946         max_nargs = len(func_type.args)
2947         expected_nargs = max_nargs - func_type.optional_arg_count
2948         actual_nargs = len(self.args)
2949         if func_type.optional_arg_count and expected_nargs != actual_nargs:
2950             self.has_optional_args = 1
2951             self.is_temp = 1
2952         # Coerce arguments
2953         for i in range(min(max_nargs, actual_nargs)):
2954             formal_type = func_type.args[i].type
2955             self.args[i] = self.args[i].coerce_to(formal_type, env)
2956         for i in range(max_nargs, actual_nargs):
2957             if self.args[i].type.is_pyobject:
2958                 error(self.args[i].pos, 
2959                     "Python object cannot be passed as a varargs parameter")
2960         # Calc result type and code fragment
2961         if isinstance(self.function, NewExprNode):
2962             self.type = PyrexTypes.CPtrType(self.function.class_type)
2963         else:
2964             self.type = func_type.return_type
2965         if self.type.is_pyobject:
2966             self.result_ctype = py_object_type
2967             self.is_temp = 1
2968         elif func_type.exception_value is not None \
2969                  or func_type.exception_check:
2970             self.is_temp = 1
2971         # Called in 'nogil' context?
2972         self.nogil = env.nogil
2973         if (self.nogil and
2974             func_type.exception_check and
2975             func_type.exception_check != '+'):
2976             env.use_utility_code(pyerr_occurred_withgil_utility_code)
2977         # C++ exception handler
2978         if func_type.exception_check == '+':
2979             if func_type.exception_value is None:
2980                 env.use_utility_code(cpp_exception_utility_code)
2981
2982     def calculate_result_code(self):
2983         return self.c_call_code()
2984     
2985     def c_call_code(self):
2986         func_type = self.function_type()
2987         if self.type is PyrexTypes.error_type or not func_type.is_cfunction:
2988             return "<error>"
2989         formal_args = func_type.args
2990         arg_list_code = []
2991         args = list(zip(formal_args, self.args))
2992         max_nargs = len(func_type.args)
2993         expected_nargs = max_nargs - func_type.optional_arg_count
2994         actual_nargs = len(self.args)
2995         for formal_arg, actual_arg in args[:expected_nargs]:
2996                 arg_code = actual_arg.result_as(formal_arg.type)
2997                 arg_list_code.append(arg_code)
2998                 
2999         if func_type.is_overridable:
3000             arg_list_code.append(str(int(self.wrapper_call or self.function.entry.is_unbound_cmethod)))
3001                 
3002         if func_type.optional_arg_count:
3003             if expected_nargs == actual_nargs:
3004                 optional_args = 'NULL'
3005             else:
3006                 optional_args = "&%s" % self.opt_arg_struct
3007             arg_list_code.append(optional_args)
3008             
3009         for actual_arg in self.args[len(formal_args):]:
3010             arg_list_code.append(actual_arg.result())
3011         result = "%s(%s)" % (self.function.result(),
3012             ', '.join(arg_list_code))
3013         return result
3014     
3015     def generate_result_code(self, code):
3016         func_type = self.function_type()
3017         if func_type.is_pyobject:
3018             arg_code = self.arg_tuple.py_result()
3019             code.putln(
3020                 "%s = PyObject_Call(%s, %s, NULL); %s" % (
3021                     self.result(),
3022                     self.function.py_result(),
3023                     arg_code,
3024                     code.error_goto_if_null(self.result(), self.pos)))
3025             code.put_gotref(self.py_result())
3026         elif func_type.is_cfunction:
3027             if self.has_optional_args:
3028                 actual_nargs = len(self.args)
3029                 expected_nargs = len(func_type.args) - func_type.optional_arg_count
3030                 self.opt_arg_struct = code.funcstate.allocate_temp(
3031                     func_type.op_arg_struct.base_type, manage_ref=True)
3032                 code.putln("%s.%s = %s;" % (
3033                         self.opt_arg_struct,
3034                         Naming.pyrex_prefix + "n",
3035                         len(self.args) - expected_nargs))
3036                 args = list(zip(func_type.args, self.args))
3037                 for formal_arg, actual_arg in args[expected_nargs:actual_nargs]:
3038                     code.putln("%s.%s = %s;" % (
3039                             self.opt_arg_struct,
3040                             func_type.opt_arg_cname(formal_arg.name),
3041                             actual_arg.result_as(formal_arg.type)))
3042             exc_checks = []
3043             if self.type.is_pyobject and self.is_temp:
3044                 exc_checks.append("!%s" % self.result())
3045             else:
3046                 exc_val = func_type.exception_value
3047                 exc_check = func_type.exception_check
3048                 if exc_val is not None:
3049                     exc_checks.append("%s == %s" % (self.result(), exc_val))
3050                 if exc_check:
3051                     if self.nogil:
3052                         exc_checks.append("__Pyx_ErrOccurredWithGIL()")
3053                     else:    
3054                         exc_checks.append("PyErr_Occurred()")
3055             if self.is_temp or exc_checks:
3056                 rhs = self.c_call_code()
3057                 if self.result():
3058                     lhs = "%s = " % self.result()
3059                     if self.is_temp and self.type.is_pyobject:
3060                         #return_type = self.type # func_type.return_type
3061                         #print "SimpleCallNode.generate_result_code: casting", rhs, \
3062                         #    "from", return_type, "to pyobject" ###
3063                         rhs = typecast(py_object_type, self.type, rhs)
3064                 else:
3065                     lhs = ""
3066                 if func_type.exception_check == '+':
3067                     if func_type.exception_value is None:
3068                         raise_py_exception = "__Pyx_CppExn2PyErr()"
3069                     elif func_type.exception_value.type.is_pyobject:
3070                         raise_py_exception = ' try { throw; } catch(const std::exception& exn) { PyErr_SetString(%s, exn.what()); } catch(...) { PyErr_SetNone(%s); }' % (
3071                             func_type.exception_value.entry.cname,
3072                             func_type.exception_value.entry.cname)
3073                     else:
3074                         raise_py_exception = '%s(); if (!PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError , "Error converting c++ exception.")' % func_type.exception_value.entry.cname
3075                     if self.nogil:
3076                         raise_py_exception = 'Py_BLOCK_THREADS; %s; Py_UNBLOCK_THREADS' % raise_py_exception
3077                     code.putln(
3078                     "try {%s%s;} catch(...) {%s; %s}" % (
3079                         lhs,
3080                         rhs,
3081                         raise_py_exception,
3082                         code.error_goto(self.pos)))
3083                 else:
3084                     if exc_checks:
3085                         goto_error = code.error_goto_if(" && ".join(exc_checks), self.pos)
3086                     else:
3087                         goto_error = ""
3088                     code.putln("%s%s; %s" % (lhs, rhs, goto_error))
3089                 if self.type.is_pyobject and self.result():
3090                     code.put_gotref(self.py_result())
3091             if self.has_optional_args:
3092                 code.funcstate.release_temp(self.opt_arg_struct)
3093
3094
3095 class PythonCapiFunctionNode(ExprNode):
3096     subexprs = []
3097     def __init__(self, pos, py_name, cname, func_type, utility_code = None):
3098         self.pos = pos
3099         self.name = py_name
3100         self.cname = cname
3101         self.type = func_type
3102         self.utility_code = utility_code
3103
3104     def analyse_types(self, env):
3105         pass
3106
3107     def generate_result_code(self, code):
3108         if self.utility_code:
3109             code.globalstate.use_utility_code(self.utility_code)
3110
3111     def calculate_result_code(self):
3112         return self.cname
3113
3114 class PythonCapiCallNode(SimpleCallNode):
3115     # Python C-API Function call (only created in transforms)
3116
3117     # By default, we assume that the call never returns None, as this
3118     # is true for most C-API functions in CPython.  If this does not
3119     # apply to a call, set the following to True (or None to inherit
3120     # the default behaviour).
3121     may_return_none = False
3122
3123     def __init__(self, pos, function_name, func_type,
3124                  utility_code = None, py_name=None, **kwargs):
3125         self.type = func_type.return_type
3126         self.result_ctype = self.type
3127         self.function = PythonCapiFunctionNode(
3128             pos, py_name, function_name, func_type,
3129             utility_code = utility_code)
3130         # call this last so that we can override the constructed
3131         # attributes above with explicit keyword arguments if required
3132         SimpleCallNode.__init__(self, pos, **kwargs)
3133
3134
3135 class GeneralCallNode(CallNode):
3136     #  General Python function call, including keyword,
3137     #  * and ** arguments.
3138     #
3139     #  function         ExprNode
3140     #  positional_args  ExprNode          Tuple of positional arguments
3141     #  keyword_args     ExprNode or None  Dict of keyword arguments
3142     #  starstar_arg     ExprNode or None  Dict of extra keyword args
3143     
3144     type = py_object_type
3145     
3146     subexprs = ['function', 'positional_args', 'keyword_args', 'starstar_arg']
3147
3148     nogil_check = Node.gil_error
3149
3150     def compile_time_value(self, denv):
3151         function = self.function.compile_time_value(denv)
3152         positional_args = self.positional_args.compile_time_value(denv)
3153         keyword_args = self.keyword_args.compile_time_value(denv)
3154         starstar_arg = self.starstar_arg.compile_time_value(denv)
3155         try:
3156             keyword_args.update(starstar_arg)
3157             return function(*positional_args, **keyword_args)
3158         except Exception, e:
3159             self.compile_time_value_error(e)
3160             
3161     def explicit_args_kwds(self):
3162         if self.starstar_arg or not isinstance(self.positional_args, TupleNode):
3163             raise CompileError(self.pos,
3164                 'Compile-time keyword arguments must be explicit.')
3165         return self.positional_args.args, self.keyword_args
3166
3167     def analyse_types(self, env):
3168         if self.analyse_as_type_constructor(env):
3169             return
3170         self.function.analyse_types(env)
3171         self.positional_args.analyse_types(env)
3172         if self.keyword_args:
3173             self.keyword_args.analyse_types(env)
3174         if self.starstar_arg:
3175             self.starstar_arg.analyse_types(env)
3176         if not self.function.type.is_pyobject:
3177             if self.function.type.is_error:
3178                 self.type = error_type
3179                 return
3180             if hasattr(self.function, 'entry') and not self.function.entry.as_variable:
3181                 error(self.pos, "Keyword and starred arguments not allowed in cdef functions.")
3182             else:
3183                 self.function = self.function.coerce_to_pyobject(env)
3184         self.positional_args = \
3185             self.positional_args.coerce_to_pyobject(env)
3186         if self.starstar_arg:
3187             self.starstar_arg = \
3188                 self.starstar_arg.coerce_to_pyobject(env)
3189         function = self.function
3190         if function.is_name and function.type_entry:
3191             # We are calling an extension type constructor.  As long
3192             # as we do not support __new__(), the result type is clear
3193             self.type = function.type_entry.type
3194             self.result_ctype = py_object_type
3195             self.may_return_none = False
3196         else:
3197             self.type = py_object_type
3198         self.is_temp = 1
3199         
3200     def generate_result_code(self, code):
3201         if self.type.is_error: return
3202         kwargs_call_function = "PyEval_CallObjectWithKeywords"
3203         if self.keyword_args and self.starstar_arg:
3204             code.put_error_if_neg(self.pos, 
3205                 "PyDict_Update(%s, %s)" % (
3206                     self.keyword_args.py_result(), 
3207                     self.starstar_arg.py_result()))
3208             keyword_code = self.keyword_args.py_result()
3209         elif self.keyword_args:
3210             keyword_code = self.keyword_args.py_result()
3211         elif self.starstar_arg:
3212             keyword_code = self.starstar_arg.py_result()
3213             if self.starstar_arg.type is not Builtin.dict_type:
3214                 # CPython supports calling functions with non-dicts, so do we
3215                 code.globalstate.use_utility_code(kwargs_call_utility_code)
3216                 kwargs_call_function = "__Pyx_PyEval_CallObjectWithKeywords"
3217         else:
3218             keyword_code = None
3219         if not keyword_code:
3220             call_code = "PyObject_Call(%s, %s, NULL)" % (
3221                 self.function.py_result(),
3222                 self.positional_args.py_result())
3223         else:
3224             call_code = "%s(%s, %s, %s)" % (
3225                 kwargs_call_function,
3226                 self.function.py_result(),
3227                 self.positional_args.py_result(),
3228                 keyword_code)
3229         code.putln(
3230             "%s = %s; %s" % (
3231                 self.result(),
3232                 call_code,
3233                 code.error_goto_if_null(self.result(), self.pos)))
3234         code.put_gotref(self.py_result())
3235
3236
3237 class AsTupleNode(ExprNode):
3238     #  Convert argument to tuple. Used for normalising
3239     #  the * argument of a function call.
3240     #
3241     #  arg    ExprNode
3242     
3243     subexprs = ['arg']
3244
3245     def calculate_constant_result(self):
3246         self.constant_result = tuple(self.base.constant_result)
3247     
3248     def compile_time_value(self, denv):
3249         arg = self.arg.compile_time_value(denv)
3250         try:
3251             return tuple(arg)
3252         except Exception, e:
3253             self.compile_time_value_error(e)
3254
3255     def analyse_types(self, env):
3256         self.arg.analyse_types(env)
3257         self.arg = self.arg.coerce_to_pyobject(env)
3258         self.type = tuple_type
3259         self.is_temp = 1
3260
3261     def may_be_none(self):
3262         return False
3263
3264     nogil_check = Node.gil_error
3265     gil_message = "Constructing Python tuple"
3266
3267     def generate_result_code(self, code):
3268         code.putln(
3269             "%s = PySequence_Tuple(%s); %s" % (
3270                 self.result(),
3271                 self.arg.py_result(),
3272                 code.error_goto_if_null(self.result(), self.pos)))
3273         code.put_gotref(self.py_result())
3274     
3275
3276 class AttributeNode(ExprNode):
3277     #  obj.attribute
3278     #
3279     #  obj          ExprNode
3280     #  attribute    string
3281     #  needs_none_check boolean        Used if obj is an extension type.
3282     #                                  If set to True, it is known that the type is not None.
3283     #
3284     #  Used internally:
3285     #
3286     #  is_py_attr           boolean   Is a Python getattr operation
3287     #  member               string    C name of struct member
3288     #  is_called            boolean   Function call is being done on result
3289     #  entry                Entry     Symbol table entry of attribute
3290     
3291     is_attribute = 1
3292     subexprs = ['obj']
3293     
3294     type = PyrexTypes.error_type
3295     entry = None
3296     is_called = 0
3297     needs_none_check = True
3298
3299     def as_cython_attribute(self):
3300         if isinstance(self.obj, NameNode) and self.obj.is_cython_module:
3301             return self.attribute
3302         cy = self.obj.as_cython_attribute()
3303         if cy:
3304             return "%s.%s" % (cy, self.attribute)
3305
3306     def coerce_to(self, dst_type, env):
3307         #  If coercing to a generic pyobject and this is a cpdef function
3308         #  we can create the corresponding attribute
3309         if dst_type is py_object_type:
3310             entry = self.entry
3311             if entry and entry.is_cfunction and entry.as_variable:
3312                 # must be a cpdef function
3313                 self.is_temp = 1
3314                 self.entry = entry.as_variable
3315                 self.analyse_as_python_attribute(env) 
3316                 return self
3317         return ExprNode.coerce_to(self, dst_type, env)
3318
3319     def calculate_constant_result(self):
3320         attr = self.attribute
3321         if attr.startswith("__") and attr.endswith("__"):
3322             return
3323         self.constant_result = getattr(self.obj.constant_result, attr)
3324
3325     def compile_time_value(self, denv):
3326         attr = self.attribute
3327         if attr.startswith("__") and attr.endswith("__"):
3328             error(self.pos,
3329                   "Invalid attribute name '%s' in compile-time expression" % attr)
3330             return None
3331         obj = self.obj.compile_time_value(denv)
3332         try:
3333             return getattr(obj, attr)
3334         except Exception, e:
3335             self.compile_time_value_error(e)
3336     
3337     def type_dependencies(self, env):
3338         return self.obj.type_dependencies(env)
3339     
3340     def infer_type(self, env):
3341         if self.analyse_as_cimported_attribute(env, 0):
3342             return self.entry.type
3343         elif self.analyse_as_unbound_cmethod(env):
3344             return self.entry.type
3345         else:
3346             self.analyse_attribute(env, obj_type = self.obj.infer_type(env))
3347             return self.type
3348
3349     def analyse_target_declaration(self, env):
3350         pass
3351     
3352     def analyse_target_types(self, env):
3353         self.analyse_types(env, target = 1)
3354     
3355     def analyse_types(self, env, target = 0):
3356         if self.analyse_as_cimported_attribute(env, target):
3357             return
3358         if not target and self.analyse_as_unbound_cmethod(env):
3359             return
3360         self.analyse_as_ordinary_attribute(env, target)
3361     
3362     def analyse_as_cimported_attribute(self, env, target):
3363         # Try to interpret this as a reference to an imported
3364         # C const, type, var or function. If successful, mutates
3365         # this node into a NameNode and returns 1, otherwise
3366         # returns 0.
3367         module_scope = self.obj.analyse_as_module(env)
3368         if module_scope:
3369             entry = module_scope.lookup_here(self.attribute)
3370             if entry and (
3371                 entry.is_cglobal or entry.is_cfunction
3372                 or entry.is_type or entry.is_const):
3373                     self.mutate_into_name_node(env, entry, target)
3374                     return 1
3375         return 0
3376     
3377     def analyse_as_unbound_cmethod(self, env):
3378         # Try to interpret this as a reference to an unbound
3379         # C method of an extension type. If successful, mutates
3380         # this node into a NameNode and returns 1, otherwise
3381         # returns 0.
3382         type = self.obj.analyse_as_extension_type(env)
3383         if type:
3384             entry = type.scope.lookup_here(self.attribute)
3385             if entry and entry.is_cmethod:
3386                 # Create a temporary entry describing the C method
3387                 # as an ordinary function.
3388                 ubcm_entry = Symtab.Entry(entry.name,
3389                     "%s->%s" % (type.vtabptr_cname, entry.cname),
3390                     entry.type)
3391                 ubcm_entry.is_cfunction = 1
3392                 ubcm_entry.func_cname = entry.func_cname
3393                 ubcm_entry.is_unbound_cmethod = 1
3394                 self.mutate_into_name_node(env, ubcm_entry, None)
3395                 return 1
3396         return 0
3397         
3398     def analyse_as_type(self, env):
3399         module_scope = self.obj.analyse_as_module(env)
3400         if module_scope:
3401             return module_scope.lookup_type(self.attribute)
3402         if not isinstance(self.obj, (UnicodeNode, StringNode, BytesNode)):
3403             base_type = self.obj.analyse_as_type(env)
3404             if base_type and hasattr(base_type, 'scope'):
3405                 return base_type.scope.lookup_type(self.attribute)
3406         return None
3407     
3408     def analyse_as_extension_type(self, env):
3409         # Try to interpret this as a reference to an extension type
3410         # in a cimported module. Returns the extension type, or None.
3411         module_scope = self.obj.analyse_as_module(env)
3412         if module_scope:
3413             entry = module_scope.lookup_here(self.attribute)
3414             if entry and entry.is_type and entry.type.is_extension_type:
3415                 return entry.type
3416         return None
3417     
3418     def analyse_as_module(self, env):
3419         # Try to interpret this as a reference to a cimported module
3420         # in another cimported module. Returns the module scope, or None.
3421         module_scope = self.obj.analyse_as_module(env)
3422         if module_scope:
3423             entry = module_scope.lookup_here(self.attribute)
3424             if entry and entry.as_module:
3425                 return entry.as_module
3426         return None
3427                 
3428     def mutate_into_name_node(self, env, entry, target):
3429         # Mutate this node into a NameNode and complete the
3430         # analyse_types phase.
3431         self.__class__ = NameNode
3432         self.name = self.attribute
3433         self.entry = entry
3434         del self.obj
3435         del self.attribute
3436         if target:
3437             NameNode.analyse_target_types(self, env)
3438         else:
3439             NameNode.analyse_rvalue_entry(self, env)
3440     
3441     def analyse_as_ordinary_attribute(self, env, target):
3442         self.obj.analyse_types(env)
3443         self.analyse_attribute(env)
3444         if self.entry and self.entry.is_cmethod and not self.is_called:
3445 #            error(self.pos, "C method can only be called")
3446             pass
3447         ## Reference to C array turns into pointer to first element.
3448         #while self.type.is_array:
3449         #    self.type = self.type.element_ptr_type()
3450         if self.is_py_attr:
3451             if not target:
3452                 self.is_temp = 1
3453                 self.result_ctype = py_object_type
3454     
3455     def analyse_attribute(self, env, obj_type = None):
3456         # Look up attribute and set self.type and self.member.
3457         self.is_py_attr = 0
3458         self.member = self.attribute
3459         if obj_type is None:
3460             if self.obj.type.is_string:
3461                 self.obj = self.obj.coerce_to_pyobject(env)
3462             obj_type = self.obj.type
3463         else:
3464             if obj_type.is_string:
3465                 obj_type = py_object_type
3466         if obj_type.is_ptr or obj_type.is_array:
3467             obj_type = obj_type.base_type
3468             self.op = "->"
3469         elif obj_type.is_extension_type:
3470             self.op = "->"
3471         else:
3472             self.op = "."
3473         if obj_type.has_attributes:
3474             entry = None
3475             if obj_type.attributes_known():
3476                 entry = obj_type.scope.lookup_here(self.attribute)
3477                 if entry and entry.is_member:
3478                     entry = None
3479             else:
3480                 error(self.pos, 
3481                     "Cannot select attribute of incomplete type '%s'" 
3482                     % obj_type)
3483                 self.type = PyrexTypes.error_type
3484                 return
3485             self.entry = entry
3486             if entry:
3487                 if obj_type.is_extension_type and entry.name == "__weakref__":
3488                     error(self.pos, "Illegal use of special attribute __weakref__")
3489                 # methods need the normal attribute lookup
3490                 # because they do not have struct entries
3491                 if entry.is_variable or entry.is_cmethod:
3492                     self.type = entry.type
3493                     self.member = entry.cname
3494                     return
3495                 else:
3496                     # If it's not a variable or C method, it must be a Python
3497                     # method of an extension type, so we treat it like a Python
3498                     # attribute.
3499                     pass
3500         # If we get here, the base object is not a struct/union/extension 
3501         # type, or it is an extension type and the attribute is either not
3502         # declared or is declared as a Python method. Treat it as a Python
3503         # attribute reference.
3504         self.analyse_as_python_attribute(env, obj_type)
3505
3506     def analyse_as_python_attribute(self, env, obj_type = None):
3507         if obj_type is None:
3508             obj_type = self.obj.type
3509         self.member = self.attribute
3510         self.type = py_object_type
3511         self.is_py_attr = 1
3512         if not obj_type.is_pyobject and not obj_type.is_error:
3513             if obj_type.can_coerce_to_pyobject(env):
3514                 self.obj = self.obj.coerce_to_pyobject(env)
3515             else:
3516                 error(self.pos,
3517                       "Object of type '%s' has no attribute '%s'" %
3518                       (obj_type, self.attribute))
3519
3520     def nogil_check(self, env):
3521         if self.is_py_attr:
3522             self.gil_error()
3523
3524     gil_message = "Accessing Python attribute"
3525
3526     def is_simple(self):
3527         if self.obj:
3528             return self.result_in_temp() or self.obj.is_simple()
3529         else:
3530             return NameNode.is_simple(self)
3531
3532     def is_lvalue(self):
3533         if self.obj:
3534             return 1
3535         else:
3536             return NameNode.is_lvalue(self)
3537     
3538     def is_ephemeral(self):
3539         if self.obj:
3540             return self.obj.is_ephemeral()
3541         else:
3542             return NameNode.is_ephemeral(self)
3543     
3544     def calculate_result_code(self):
3545         #print "AttributeNode.calculate_result_code:", self.member ###
3546         #print "...obj node =", self.obj, "code", self.obj.result() ###
3547         #print "...obj type", self.obj.type, "ctype", self.obj.ctype() ###
3548         obj = self.obj
3549         obj_code = obj.result_as(obj.type)
3550         #print "...obj_code =", obj_code ###
3551         if self.entry and self.entry.is_cmethod:
3552             if obj.type.is_extension_type:
3553                 return "((struct %s *)%s%s%s)->%s" % (
3554                     obj.type.vtabstruct_cname, obj_code, self.op, 
3555                     obj.type.vtabslot_cname, self.member)
3556             else:
3557                 return self.member
3558         elif obj.type.is_complex:
3559             return "__Pyx_C%s(%s)" % (self.member.upper(), obj_code)
3560         else:
3561             return "%s%s%s" % (obj_code, self.op, self.member)
3562     
3563     def generate_result_code(self, code):
3564         interned_attr_cname = code.intern_identifier(self.attribute)
3565         if self.is_py_attr:
3566             code.putln(
3567                 '%s = PyObject_GetAttr(%s, %s); %s' % (
3568                     self.result(),
3569                     self.obj.py_result(),
3570                     interned_attr_cname,
3571                     code.error_goto_if_null(self.result(), self.pos)))
3572             code.put_gotref(self.py_result())
3573         else:
3574             # result_code contains what is needed, but we may need to insert
3575             # a check and raise an exception
3576             if (self.obj.type.is_extension_type
3577                   and self.needs_none_check
3578                   and code.globalstate.directives['nonecheck']):
3579                 self.put_nonecheck(code)
3580     
3581     def generate_assignment_code(self, rhs, code):
3582         interned_attr_cname = code.intern_identifier(self.attribute)
3583         self.obj.generate_evaluation_code(code)
3584         if self.is_py_attr:
3585             code.put_error_if_neg(self.pos, 
3586                 'PyObject_SetAttr(%s, %s, %s)' % (
3587                     self.obj.py_result(),
3588                     interned_attr_cname,
3589                     rhs.py_result()))
3590             rhs.generate_disposal_code(code)
3591             rhs.free_temps(code)
3592         elif self.obj.type.is_complex:
3593             code.putln("__Pyx_SET_C%s(%s, %s);" % (
3594                 self.member.upper(),
3595                 self.obj.result_as(self.obj.type),
3596                 rhs.result_as(self.ctype())))
3597         else:
3598             if (self.obj.type.is_extension_type
3599                   and self.needs_none_check
3600                   and code.globalstate.directives['nonecheck']):
3601                 self.put_nonecheck(code)
3602
3603             select_code = self.result()
3604             if self.type.is_pyobject and self.use_managed_ref:
3605                 rhs.make_owned_reference(code)
3606                 code.put_giveref(rhs.py_result())
3607                 code.put_gotref(select_code)
3608                 code.put_decref(select_code, self.ctype())
3609             code.putln(
3610                 "%s = %s;" % (
3611                     select_code,
3612                     rhs.result_as(self.ctype())))
3613                     #rhs.result()))
3614             rhs.generate_post_assignment_code(code)
3615             rhs.free_temps(code)
3616         self.obj.generate_disposal_code(code)
3617         self.obj.free_temps(code)
3618     
3619     def generate_deletion_code(self, code):
3620         interned_attr_cname = code.intern_identifier(self.attribute)
3621         self.obj.generate_evaluation_code(code)
3622         if self.is_py_attr or (isinstance(self.entry.scope, Symtab.PropertyScope)
3623                                and u'__del__' in self.entry.scope.entries):
3624             code.put_error_if_neg(self.pos,
3625                 'PyObject_DelAttr(%s, %s)' % (
3626                     self.obj.py_result(),
3627                     interned_attr_cname))
3628         else:
3629             error(self.pos, "Cannot delete C attribute of extension type")
3630         self.obj.generate_disposal_code(code)
3631         self.obj.free_temps(code)
3632         
3633     def annotate(self, code):
3634         if self.is_py_attr:
3635             code.annotate(self.pos, AnnotationItem('py_attr', 'python attribute', size=len(self.attribute)))
3636         else:
3637             code.annotate(self.pos, AnnotationItem('c_attr', 'c attribute', size=len(self.attribute)))
3638
3639     def put_nonecheck(self, code):
3640         code.globalstate.use_utility_code(raise_noneattr_error_utility_code)
3641         code.putln("if (%s) {" % code.unlikely("%s == Py_None") % self.obj.result_as(PyrexTypes.py_object_type))
3642         code.putln("__Pyx_RaiseNoneAttributeError(\"%s\");" % self.attribute)
3643         code.putln(code.error_goto(self.pos))
3644         code.putln("}")
3645
3646
3647 #-------------------------------------------------------------------
3648 #
3649 #  Constructor nodes
3650 #
3651 #-------------------------------------------------------------------
3652
3653 class StarredTargetNode(ExprNode):
3654     #  A starred expression like "*a"
3655     #
3656     #  This is only allowed in sequence assignment targets such as
3657     #
3658     #      a, *b = (1,2,3,4)    =>     a = 1 ; b = [2,3,4]
3659     #
3660     #  and will be removed during type analysis (or generate an error
3661     #  if it's found at unexpected places).
3662     #
3663     #  target          ExprNode
3664
3665     subexprs = ['target']
3666     is_starred = 1
3667     type = py_object_type
3668     is_temp = 1
3669
3670     def __init__(self, pos, target):
3671         self.pos = pos
3672         self.target = target
3673
3674     def analyse_declarations(self, env):
3675         error(self.pos, "can use starred expression only as assignment target")
3676         self.target.analyse_declarations(env)
3677
3678     def analyse_types(self, env):
3679         error(self.pos, "can use starred expression only as assignment target")
3680         self.target.analyse_types(env)
3681         self.type = self.target.type
3682
3683     def analyse_target_declaration(self, env):
3684         self.target.analyse_target_declaration(env)
3685
3686     def analyse_target_types(self, env):
3687         self.target.analyse_target_types(env)
3688         self.type = self.target.type
3689
3690     def calculate_result_code(self):
3691         return ""
3692
3693     def generate_result_code(self, code):
3694         pass
3695
3696
3697 class SequenceNode(ExprNode):
3698     #  Base class for list and tuple constructor nodes.
3699     #  Contains common code for performing sequence unpacking.
3700     #
3701     #  args                    [ExprNode]
3702     #  iterator                ExprNode
3703     #  unpacked_items          [ExprNode] or None
3704     #  coerced_unpacked_items  [ExprNode] or None
3705     
3706     subexprs = ['args']
3707     
3708     is_sequence_constructor = 1
3709     unpacked_items = None
3710
3711     def compile_time_value_list(self, denv):
3712         return [arg.compile_time_value(denv) for arg in self.args]
3713
3714     def replace_starred_target_node(self):
3715         # replace a starred node in the targets by the contained expression
3716         self.starred_assignment = False
3717         args = []
3718         for arg in self.args:
3719             if arg.is_starred:
3720                 if self.starred_assignment:
3721                     error(arg.pos, "more than 1 starred expression in assignment")
3722                 self.starred_assignment = True
3723                 arg = arg.target
3724                 arg.is_starred = True
3725             args.append(arg)
3726         self.args = args
3727
3728     def analyse_target_declaration(self, env):
3729         self.replace_starred_target_node()
3730         for arg in self.args:
3731             arg.analyse_target_declaration(env)
3732
3733     def analyse_types(self, env, skip_children=False):
3734         for i in range(len(self.args)):
3735             arg = self.args[i]
3736             if not skip_children: arg.analyse_types(env)
3737             self.args[i] = arg.coerce_to_pyobject(env)
3738         self.is_temp = 1
3739         # not setting self.type here, subtypes do this
3740
3741     def may_be_none(self):
3742         return False
3743
3744     def analyse_target_types(self, env):
3745         self.iterator = PyTempNode(self.pos, env)
3746         self.unpacked_items = []
3747         self.coerced_unpacked_items = []
3748         for arg in self.args:
3749             arg.analyse_target_types(env)
3750             if arg.is_starred:
3751                 if not arg.type.assignable_from(Builtin.list_type):
3752                     error(arg.pos,
3753                           "starred target must have Python object (list) type")
3754                 if arg.type is py_object_type:
3755                     arg.type = Builtin.list_type
3756             unpacked_item = PyTempNode(self.pos, env)
3757             coerced_unpacked_item = unpacked_item.coerce_to(arg.type, env)
3758             self.unpacked_items.append(unpacked_item)
3759             self.coerced_unpacked_items.append(coerced_unpacked_item)
3760         self.type = py_object_type
3761
3762     def generate_result_code(self, code):
3763         self.generate_operation_code(code)
3764     
3765     def generate_assignment_code(self, rhs, code):
3766         if self.starred_assignment:
3767             self.generate_starred_assignment_code(rhs, code)
3768         else:
3769             self.generate_parallel_assignment_code(rhs, code)
3770
3771         for item in self.unpacked_items:
3772             item.release(code)
3773         rhs.free_temps(code)
3774
3775     def generate_parallel_assignment_code(self, rhs, code):
3776         # Need to work around the fact that generate_evaluation_code
3777         # allocates the temps in a rather hacky way -- the assignment
3778         # is evaluated twice, within each if-block.
3779
3780         if rhs.type is tuple_type:
3781             tuple_check = "likely(%s != Py_None)"
3782         else:
3783             tuple_check = "PyTuple_CheckExact(%s)"
3784         code.putln(
3785             "if (%s && likely(PyTuple_GET_SIZE(%s) == %s)) {" % (
3786                 tuple_check % rhs.py_result(), 
3787                 rhs.py_result(), 
3788                 len(self.args)))
3789         code.putln("PyObject* tuple = %s;" % rhs.py_result())
3790         for item in self.unpacked_items:
3791             item.allocate(code)
3792         for i in range(len(self.args)):
3793             item = self.unpacked_items[i]
3794             code.put(
3795                 "%s = PyTuple_GET_ITEM(tuple, %s); " % (
3796                     item.result(),
3797                     i))
3798             code.put_incref(item.result(), item.ctype())
3799             value_node = self.coerced_unpacked_items[i]
3800             value_node.generate_evaluation_code(code)
3801         rhs.generate_disposal_code(code)
3802
3803         for i in range(len(self.args)):
3804             self.args[i].generate_assignment_code(
3805                 self.coerced_unpacked_items[i], code)
3806                  
3807         code.putln("} else {")
3808
3809         if rhs.type is tuple_type:
3810             code.globalstate.use_utility_code(tuple_unpacking_error_code)
3811             code.putln("__Pyx_UnpackTupleError(%s, %s);" % (
3812                         rhs.py_result(), len(self.args)))
3813             code.putln(code.error_goto(self.pos))
3814         else:
3815             code.globalstate.use_utility_code(unpacking_utility_code)
3816
3817             self.iterator.allocate(code)
3818             code.putln(
3819                 "%s = PyObject_GetIter(%s); %s" % (
3820                     self.iterator.result(),
3821                     rhs.py_result(),
3822                     code.error_goto_if_null(self.iterator.result(), self.pos)))
3823             code.put_gotref(self.iterator.py_result())
3824             rhs.generate_disposal_code(code)
3825             for i in range(len(self.args)):
3826                 item = self.unpacked_items[i]
3827                 unpack_code = "__Pyx_UnpackItem(%s, %d)" % (
3828                     self.iterator.py_result(), i)
3829                 code.putln(
3830                     "%s = %s; %s" % (
3831                         item.result(),
3832                         typecast(item.ctype(), py_object_type, unpack_code),
3833                         code.error_goto_if_null(item.result(), self.pos)))
3834                 code.put_gotref(item.py_result())
3835                 value_node = self.coerced_unpacked_items[i]
3836                 value_node.generate_evaluation_code(code)
3837             code.put_error_if_neg(self.pos, "__Pyx_EndUnpack(%s, %d)" % (
3838                 self.iterator.py_result(),
3839                 len(self.args)))
3840             if debug_disposal_code:
3841                 print("UnpackNode.generate_assignment_code:")
3842                 print("...generating disposal code for %s" % self.iterator)
3843             self.iterator.generate_disposal_code(code)
3844             self.iterator.free_temps(code)
3845             self.iterator.release(code)
3846
3847             for i in range(len(self.args)):
3848                 self.args[i].generate_assignment_code(
3849                     self.coerced_unpacked_items[i], code)
3850
3851         code.putln("}")
3852
3853     def generate_starred_assignment_code(self, rhs, code):
3854         code.globalstate.use_utility_code(unpacking_utility_code)
3855
3856         for i, arg in enumerate(self.args):
3857             if arg.is_starred:
3858                 starred_target = self.unpacked_items[i]
3859                 fixed_args_left  = self.args[:i]
3860                 fixed_args_right = self.args[i+1:]
3861                 break
3862
3863         self.iterator.allocate(code)
3864         code.putln(
3865             "%s = PyObject_GetIter(%s); %s" % (
3866                 self.iterator.result(),
3867                 rhs.py_result(),
3868                 code.error_goto_if_null(self.iterator.result(), self.pos)))
3869         code.put_gotref(self.iterator.py_result())
3870         rhs.generate_disposal_code(code)
3871
3872         for item in self.unpacked_items:
3873             item.allocate(code)
3874         for i in range(len(fixed_args_left)):
3875             item = self.unpacked_items[i]
3876             unpack_code = "__Pyx_UnpackItem(%s, %d)" % (
3877                 self.iterator.py_result(), i)
3878             code.putln(
3879                 "%s = %s; %s" % (
3880                     item.result(),
3881                     typecast(item.ctype(), py_object_type, unpack_code),
3882                     code.error_goto_if_null(item.result(), self.pos)))
3883             code.put_gotref(item.py_result())
3884             value_node = self.coerced_unpacked_items[i]
3885             value_node.generate_evaluation_code(code)
3886
3887         target_list = starred_target.result()
3888         code.putln("%s = PySequence_List(%s); %s" % (
3889             target_list, self.iterator.py_result(),
3890             code.error_goto_if_null(target_list, self.pos)))
3891         code.put_gotref(target_list)
3892         if fixed_args_right:
3893             code.globalstate.use_utility_code(raise_need_more_values_to_unpack)
3894             unpacked_right_args = self.unpacked_items[-len(fixed_args_right):]
3895             code.putln("if (unlikely(PyList_GET_SIZE(%s) < %d)) {" % (
3896                 (target_list, len(unpacked_right_args))))
3897             code.put("__Pyx_RaiseNeedMoreValuesError(%d+PyList_GET_SIZE(%s)); %s" % (
3898                      len(fixed_args_left), target_list,
3899                      code.error_goto(self.pos)))
3900             code.putln('}')
3901             for i, (arg, coerced_arg) in enumerate(zip(unpacked_right_args[::-1],
3902                                                        self.coerced_unpacked_items[::-1])):
3903                 code.putln(
3904                     "%s = PyList_GET_ITEM(%s, PyList_GET_SIZE(%s)-1); " % (
3905                         arg.py_result(),
3906                         target_list, target_list))
3907                 # resize the list the hard way
3908                 code.putln("((PyVarObject*)%s)->ob_size--;" % target_list)
3909                 code.put_gotref(arg.py_result())
3910                 coerced_arg.generate_evaluation_code(code)
3911
3912         self.iterator.generate_disposal_code(code)
3913         self.iterator.free_temps(code)
3914         self.iterator.release(code)
3915
3916         for i in range(len(self.args)):
3917             self.args[i].generate_assignment_code(
3918                 self.coerced_unpacked_items[i], code)
3919
3920     def annotate(self, code):
3921         for arg in self.args:
3922             arg.annotate(code)
3923         if self.unpacked_items:
3924             for arg in self.unpacked_items:
3925                 arg.annotate(code)
3926             for arg in self.coerced_unpacked_items:
3927                 arg.annotate(code)
3928
3929
3930 class TupleNode(SequenceNode):
3931     #  Tuple constructor.
3932     
3933     type = tuple_type
3934
3935     gil_message = "Constructing Python tuple"
3936
3937     def analyse_types(self, env, skip_children=False):
3938         if len(self.args) == 0:
3939             self.is_temp = 0
3940             self.is_literal = 1
3941         else:
3942             SequenceNode.analyse_types(self, env, skip_children)
3943             for child in self.args:
3944                 if not child.is_literal:
3945                     break
3946             else:
3947                 self.is_temp = 0
3948                 self.is_literal = 1
3949
3950     def calculate_result_code(self):
3951         if len(self.args) > 0:
3952             return self.result_code
3953         else:
3954             return Naming.empty_tuple
3955
3956     def calculate_constant_result(self):
3957         self.constant_result = tuple([
3958                 arg.constant_result for arg in self.args])
3959
3960     def compile_time_value(self, denv):
3961         values = self.compile_time_value_list(denv)
3962         try:
3963             return tuple(values)
3964         except Exception, e:
3965             self.compile_time_value_error(e)
3966     
3967     def generate_operation_code(self, code):
3968         if len(self.args) == 0:
3969             # result_code is Naming.empty_tuple
3970             return
3971         if self.is_literal:
3972             # non-empty cached tuple => result is global constant,
3973             # creation code goes into separate code writer
3974             self.result_code = code.get_py_const(py_object_type, 'tuple_', cleanup_level=2)
3975             code = code.get_cached_constants_writer()
3976             code.mark_pos(self.pos)
3977
3978         code.putln(
3979             "%s = PyTuple_New(%s); %s" % (
3980                 self.result(),
3981                 len(self.args),
3982                 code.error_goto_if_null(self.result(), self.pos)))
3983         code.put_gotref(self.py_result())
3984         for i in range(len(self.args)):
3985             arg = self.args[i]
3986             if not arg.result_in_temp():
3987                 code.put_incref(arg.result(), arg.ctype())
3988             code.putln(
3989                 "PyTuple_SET_ITEM(%s, %s, %s);" % (
3990                     self.result(),
3991                     i,
3992                     arg.py_result()))
3993             code.put_giveref(arg.py_result())
3994         if self.is_literal:
3995             code.put_giveref(self.py_result())
3996     
3997     def generate_subexpr_disposal_code(self, code):
3998         # We call generate_post_assignment_code here instead
3999         # of generate_disposal_code, because values were stored
4000         # in the tuple using a reference-stealing operation.
4001         for arg in self.args:
4002             arg.generate_post_assignment_code(code)
4003             # Should NOT call free_temps -- this is invoked by the default
4004             # generate_evaluation_code which will do that.
4005
4006
4007 class ListNode(SequenceNode):
4008     #  List constructor.
4009     
4010     # obj_conversion_errors    [PyrexError]   used internally
4011     # orignial_args            [ExprNode]     used internally
4012
4013     obj_conversion_errors = []
4014     type = list_type
4015
4016     gil_message = "Constructing Python list"
4017     
4018     def type_dependencies(self, env):
4019         return ()
4020     
4021     def infer_type(self, env):
4022         # TOOD: Infer non-object list arrays.
4023         return list_type
4024
4025     def analyse_expressions(self, env):
4026         SequenceNode.analyse_expressions(self, env)
4027         self.coerce_to_pyobject(env)
4028
4029     def analyse_types(self, env):
4030         hold_errors()
4031         self.original_args = list(self.args)
4032         SequenceNode.analyse_types(self, env)
4033         self.obj_conversion_errors = held_errors()
4034         release_errors(ignore=True)
4035         
4036     def coerce_to(self, dst_type, env):
4037         if dst_type.is_pyobject:
4038             for err in self.obj_conversion_errors:
4039                 report_error(err)
4040             self.obj_conversion_errors = []
4041             if not self.type.subtype_of(dst_type):
4042                 error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
4043         elif dst_type.is_ptr:
4044             base_type = dst_type.base_type
4045             self.type = PyrexTypes.CArrayType(base_type, len(self.args))
4046             for i in range(len(self.original_args)):
4047                 arg = self.args[i]
4048                 if isinstance(arg, CoerceToPyTypeNode):
4049                     arg = arg.arg
4050                 self.args[i] = arg.coerce_to(base_type, env)
4051         elif dst_type.is_struct:
4052             if len(self.args) > len(dst_type.scope.var_entries):
4053                 error(self.pos, "Too may members for '%s'" % dst_type)
4054             else:
4055                 if len(self.args) < len(dst_type.scope.var_entries):
4056                     warning(self.pos, "Too few members for '%s'" % dst_type, 1)
4057                 for i, (arg, member) in enumerate(zip(self.original_args, dst_type.scope.var_entries)):
4058                     if isinstance(arg, CoerceToPyTypeNode):
4059                         arg = arg.arg
4060                     self.args[i] = arg.coerce_to(member.type, env)
4061             self.type = dst_type
4062         else:
4063             self.type = error_type
4064             error(self.pos, "Cannot coerce list to type '%s'" % dst_type)
4065         return self
4066         
4067     def release_temp(self, env):
4068         if self.type.is_array:
4069             # To be valid C++, we must allocate the memory on the stack 
4070             # manually and be sure not to reuse it for something else. 
4071             pass
4072         else:
4073             SequenceNode.release_temp(self, env)
4074
4075     def calculate_constant_result(self):
4076         self.constant_result = [
4077             arg.constant_result for arg in self.args]
4078
4079     def compile_time_value(self, denv):
4080         return self.compile_time_value_list(denv)
4081
4082     def generate_operation_code(self, code):
4083         if self.type.is_pyobject:
4084             for err in self.obj_conversion_errors:
4085                 report_error(err)
4086             code.putln("%s = PyList_New(%s); %s" %
4087                 (self.result(),
4088                 len(self.args),
4089                 code.error_goto_if_null(self.result(), self.pos)))
4090             code.put_gotref(self.py_result())
4091             for i in range(len(self.args)):
4092                 arg = self.args[i]
4093                 #if not arg.is_temp:
4094                 if not arg.result_in_temp():
4095                     code.put_incref(arg.result(), arg.ctype())
4096                 code.putln("PyList_SET_ITEM(%s, %s, %s);" %
4097                     (self.result(),
4098                     i,
4099                     arg.py_result()))
4100                 code.put_giveref(arg.py_result())
4101         elif self.type.is_array:
4102             for i, arg in enumerate(self.args):
4103                 code.putln("%s[%s] = %s;" % (
4104                                 self.result(),
4105                                 i,
4106                                 arg.result()))
4107         elif self.type.is_struct:
4108             for arg, member in zip(self.args, self.type.scope.var_entries):
4109                 code.putln("%s.%s = %s;" % (
4110                         self.result(),
4111                         member.cname,
4112                         arg.result()))
4113         else:
4114             raise InternalError("List type never specified")
4115
4116     def generate_subexpr_disposal_code(self, code):
4117         # We call generate_post_assignment_code here instead
4118         # of generate_disposal_code, because values were stored
4119         # in the list using a reference-stealing operation.
4120         for arg in self.args:
4121             arg.generate_post_assignment_code(code)
4122             # Should NOT call free_temps -- this is invoked by the default
4123             # generate_evaluation_code which will do that.
4124
4125
4126 class ScopedExprNode(ExprNode):
4127     # Abstract base class for ExprNodes that have their own local
4128     # scope, such as generator expressions.
4129     #
4130     # expr_scope    Scope  the inner scope of the expression
4131
4132     subexprs = []
4133     expr_scope = None
4134
4135     # does this node really have a local scope, e.g. does it leak loop
4136     # variables or not?  non-leaking Py3 behaviour is default, except
4137     # for list comprehensions where the behaviour differs in Py2 and
4138     # Py3 (set in Parsing.py based on parser context)
4139     has_local_scope = True
4140
4141     def init_scope(self, outer_scope, expr_scope=None):
4142         if expr_scope is not None:
4143             self.expr_scope = expr_scope
4144         elif self.has_local_scope:
4145             self.expr_scope = Symtab.GeneratorExpressionScope(outer_scope)
4146         else:
4147             self.expr_scope = None
4148
4149     def analyse_declarations(self, env):
4150         self.init_scope(env)
4151
4152     def analyse_scoped_declarations(self, env):
4153         # this is called with the expr_scope as env
4154         pass
4155
4156     def analyse_types(self, env):
4157         # no recursion here, the children will be analysed separately below
4158         pass
4159
4160     def analyse_scoped_expressions(self, env):
4161         # this is called with the expr_scope as env
4162         pass
4163
4164     def generate_evaluation_code(self, code):
4165         # set up local variables and free their references on exit
4166         generate_inner_evaluation_code = super(ScopedExprNode, self).generate_evaluation_code
4167         if not self.has_local_scope or not self.expr_scope.var_entries:
4168             # no local variables => delegate, done
4169             generate_inner_evaluation_code(code)
4170             return
4171
4172         code.putln('{ /* enter inner scope */')
4173         py_entries = []
4174         for entry in self.expr_scope.var_entries:
4175             if not entry.in_closure:
4176                 code.put_var_declaration(entry)
4177                 if entry.type.is_pyobject and entry.used:
4178                     py_entries.append(entry)
4179                     code.put_init_var_to_py_none(entry)
4180         if not py_entries:
4181             # no local Python references => no cleanup required
4182             generate_inner_evaluation_code(code)
4183             code.putln('} /* exit inner scope */')
4184             return
4185
4186         # must free all local Python references at each exit point
4187         old_loop_labels = tuple(code.new_loop_labels())
4188         old_error_label = code.new_error_label()
4189
4190         generate_inner_evaluation_code(code)
4191
4192         # normal (non-error) exit
4193         for entry in py_entries:
4194             code.put_var_decref(entry)
4195
4196         # error/loop body exit points
4197         exit_scope = code.new_label('exit_scope')
4198         code.put_goto(exit_scope)
4199         for label, old_label in ([(code.error_label, old_error_label)] +
4200                                  list(zip(code.get_loop_labels(), old_loop_labels))):
4201             if code.label_used(label):
4202                 code.put_label(label)
4203                 for entry in py_entries:
4204                     code.put_var_decref(entry)
4205                 code.put_goto(old_label)
4206         code.put_label(exit_scope)
4207         code.putln('} /* exit inner scope */')
4208
4209         code.set_loop_labels(old_loop_labels)
4210         code.error_label = old_error_label
4211
4212
4213 class ComprehensionNode(ScopedExprNode):
4214     subexprs = ["target"]
4215     child_attrs = ["loop", "append"]
4216
4217     def infer_type(self, env):
4218         return self.target.infer_type(env)
4219
4220     def analyse_declarations(self, env):
4221         self.append.target = self # this is used in the PyList_Append of the inner loop
4222         self.init_scope(env)
4223
4224     def analyse_scoped_declarations(self, env):
4225         self.loop.analyse_declarations(env)
4226
4227     def analyse_types(self, env):
4228         self.target.analyse_expressions(env)
4229         self.type = self.target.type
4230         if not self.has_local_scope:
4231             self.loop.analyse_expressions(env)
4232
4233     def analyse_scoped_expressions(self, env):
4234         if self.has_local_scope:
4235             self.loop.analyse_expressions(env)
4236
4237     def may_be_none(self):
4238         return False
4239
4240     def calculate_result_code(self):
4241         return self.target.result()
4242     
4243     def generate_result_code(self, code):
4244         self.generate_operation_code(code)
4245
4246     def generate_operation_code(self, code):
4247         self.loop.generate_execution_code(code)
4248
4249     def annotate(self, code):
4250         self.loop.annotate(code)
4251
4252
4253 class ComprehensionAppendNode(Node):
4254     # Need to be careful to avoid infinite recursion:
4255     # target must not be in child_attrs/subexprs
4256
4257     child_attrs = ['expr']
4258
4259     type = PyrexTypes.c_int_type
4260     
4261     def analyse_expressions(self, env):
4262         self.expr.analyse_expressions(env)
4263         if not self.expr.type.is_pyobject:
4264             self.expr = self.expr.coerce_to_pyobject(env)
4265
4266     def generate_execution_code(self, code):
4267         if self.target.type is list_type:
4268             function = "PyList_Append"
4269         elif self.target.type is set_type:
4270             function = "PySet_Add"
4271         else:
4272             raise InternalError(
4273                 "Invalid type for comprehension node: %s" % self.target.type)
4274
4275         self.expr.generate_evaluation_code(code)
4276         code.putln(code.error_goto_if("%s(%s, (PyObject*)%s)" % (
4277             function,
4278             self.target.result(),
4279             self.expr.result()
4280             ), self.pos))
4281         self.expr.generate_disposal_code(code)
4282         self.expr.free_temps(code)
4283
4284     def generate_function_definitions(self, env, code):
4285         self.expr.generate_function_definitions(env, code)
4286
4287     def annotate(self, code):
4288         self.expr.annotate(code)
4289
4290 class DictComprehensionAppendNode(ComprehensionAppendNode):
4291     child_attrs = ['key_expr', 'value_expr']
4292
4293     def analyse_expressions(self, env):
4294         self.key_expr.analyse_expressions(env)
4295         if not self.key_expr.type.is_pyobject:
4296             self.key_expr = self.key_expr.coerce_to_pyobject(env)
4297         self.value_expr.analyse_expressions(env)
4298         if not self.value_expr.type.is_pyobject:
4299             self.value_expr = self.value_expr.coerce_to_pyobject(env)
4300
4301     def generate_execution_code(self, code):
4302         self.key_expr.generate_evaluation_code(code)
4303         self.value_expr.generate_evaluation_code(code)
4304         code.putln(code.error_goto_if("PyDict_SetItem(%s, (PyObject*)%s, (PyObject*)%s)" % (
4305             self.target.result(),
4306             self.key_expr.result(),
4307             self.value_expr.result()
4308             ), self.pos))
4309         self.key_expr.generate_disposal_code(code)
4310         self.key_expr.free_temps(code)
4311         self.value_expr.generate_disposal_code(code)
4312         self.value_expr.free_temps(code)
4313
4314     def generate_function_definitions(self, env, code):
4315         self.key_expr.generate_function_definitions(env, code)
4316         self.value_expr.generate_function_definitions(env, code)
4317
4318     def annotate(self, code):
4319         self.key_expr.annotate(code)
4320         self.value_expr.annotate(code)
4321
4322
4323 class GeneratorExpressionNode(ScopedExprNode):
4324     # A generator expression, e.g.  (i for i in range(10))
4325     #
4326     # Result is a generator.
4327     #
4328     # loop      ForStatNode   the for-loop, containing a YieldExprNode
4329
4330     child_attrs = ["loop"]
4331
4332     type = py_object_type
4333
4334     def analyse_scoped_declarations(self, env):
4335         self.loop.analyse_declarations(env)
4336
4337     def analyse_types(self, env):
4338         if not self.has_local_scope:
4339             self.loop.analyse_expressions(env)
4340         self.is_temp = True
4341
4342     def analyse_scoped_expressions(self, env):
4343         if self.has_local_scope:
4344             self.loop.analyse_expressions(env)
4345
4346     def may_be_none(self):
4347         return False
4348
4349     def annotate(self, code):
4350         self.loop.annotate(code)
4351
4352
4353 class InlinedGeneratorExpressionNode(GeneratorExpressionNode):
4354     # An inlined generator expression for which the result is
4355     # calculated inside of the loop.  This will only be created by
4356     # transforms when replacing builtin calls on generator
4357     # expressions.
4358     #
4359     # loop           ForStatNode      the for-loop, not containing any YieldExprNodes
4360     # result_node    ResultRefNode    the reference to the result value temp
4361     # orig_func      String           the name of the builtin function this node replaces
4362
4363     child_attrs = ["loop"]
4364     loop_analysed = False
4365
4366     def infer_type(self, env):
4367         return self.result_node.infer_type(env)
4368
4369     def analyse_types(self, env):
4370         if not self.has_local_scope:
4371             self.loop_analysed = True
4372             self.loop.analyse_expressions(env)
4373         self.type = self.result_node.type
4374         self.is_temp = True
4375
4376     def analyse_scoped_expressions(self, env):
4377         self.loop_analysed = True
4378         GeneratorExpressionNode.analyse_scoped_expressions(self, env)
4379
4380     def coerce_to(self, dst_type, env):
4381         if self.orig_func == 'sum' and dst_type.is_numeric and not self.loop_analysed:
4382             # We can optimise by dropping the aggregation variable and
4383             # the add operations into C.  This can only be done safely
4384             # before analysing the loop body, after that, the result
4385             # reference type will have infected expressions and
4386             # assignments.
4387             self.result_node.type = self.type = dst_type
4388             return self
4389         return GeneratorExpressionNode.coerce_to(self, dst_type, env)
4390
4391     def generate_result_code(self, code):
4392         self.result_node.result_code = self.result()
4393         self.loop.generate_execution_code(code)
4394
4395
4396 class SetNode(ExprNode):
4397     #  Set constructor.
4398
4399     type = set_type
4400
4401     subexprs = ['args']
4402
4403     gil_message = "Constructing Python set"
4404     
4405     def analyse_types(self, env):
4406         for i in range(len(self.args)):
4407             arg = self.args[i]
4408             arg.analyse_types(env)
4409             self.args[i] = arg.coerce_to_pyobject(env)
4410         self.type = set_type
4411         self.is_temp = 1
4412
4413     def may_be_none(self):
4414         return False
4415
4416     def calculate_constant_result(self):
4417         self.constant_result = set([
4418                 arg.constant_result for arg in self.args])
4419
4420     def compile_time_value(self, denv):
4421         values = [arg.compile_time_value(denv) for arg in self.args]
4422         try:
4423             return set(values)
4424         except Exception, e:
4425             self.compile_time_value_error(e)
4426
4427     def generate_evaluation_code(self, code):
4428         code.globalstate.use_utility_code(Builtin.py23_set_utility_code)
4429         self.allocate_temp_result(code)
4430         code.putln(
4431             "%s = PySet_New(0); %s" % (
4432                 self.result(),
4433                 code.error_goto_if_null(self.result(), self.pos)))
4434         code.put_gotref(self.py_result())
4435         for arg in self.args:
4436             arg.generate_evaluation_code(code)
4437             code.putln(
4438                 code.error_goto_if_neg(
4439                     "PySet_Add(%s, %s)" % (self.result(), arg.py_result()),
4440                     self.pos))
4441             arg.generate_disposal_code(code)
4442             arg.free_temps(code)
4443
4444
4445 class DictNode(ExprNode):
4446     #  Dictionary constructor.
4447     #
4448     #  key_value_pairs  [DictItemNode]
4449     #
4450     # obj_conversion_errors    [PyrexError]   used internally
4451     
4452     subexprs = ['key_value_pairs']
4453     is_temp = 1
4454     type = dict_type
4455
4456     obj_conversion_errors = []
4457
4458     def calculate_constant_result(self):
4459         self.constant_result = dict([
4460                 item.constant_result for item in self.key_value_pairs])
4461     
4462     def compile_time_value(self, denv):
4463         pairs = [(item.key.compile_time_value(denv), item.value.compile_time_value(denv))
4464             for item in self.key_value_pairs]
4465         try:
4466             return dict(pairs)
4467         except Exception, e:
4468             self.compile_time_value_error(e)
4469     
4470     def type_dependencies(self, env):
4471         return ()
4472     
4473     def infer_type(self, env):
4474         # TOOD: Infer struct constructors.
4475         return dict_type
4476
4477     def analyse_types(self, env):
4478         hold_errors()
4479         for item in self.key_value_pairs:
4480             item.analyse_types(env)
4481         self.obj_conversion_errors = held_errors()
4482         release_errors(ignore=True)
4483
4484     def may_be_none(self):
4485         return False
4486         
4487     def coerce_to(self, dst_type, env):
4488         if dst_type.is_pyobject:
4489             self.release_errors()
4490             if not self.type.subtype_of(dst_type):
4491                 error(self.pos, "Cannot interpret dict as type '%s'" % dst_type)
4492         elif dst_type.is_struct_or_union:
4493             self.type = dst_type
4494             if not dst_type.is_struct and len(self.key_value_pairs) != 1:
4495                 error(self.pos, "Exactly one field must be specified to convert to union '%s'" % dst_type)
4496             elif dst_type.is_struct and len(self.key_value_pairs) < len(dst_type.scope.var_entries):
4497                 warning(self.pos, "Not all members given for struct '%s'" % dst_type, 1)
4498             for item in self.key_value_pairs:
4499                 if isinstance(item.key, CoerceToPyTypeNode):
4500                     item.key = item.key.arg
4501                 if not isinstance(item.key, (UnicodeNode, StringNode, BytesNode)):
4502                     error(item.key.pos, "Invalid struct field identifier")
4503                     item.key = StringNode(item.key.pos, value="<error>")
4504                 else:
4505                     key = str(item.key.value) # converts string literals to unicode in Py3
4506                     member = dst_type.scope.lookup_here(key)
4507                     if not member:
4508                         error(item.key.pos, "struct '%s' has no field '%s'" % (dst_type, key))
4509                     else:
4510                         value = item.value
4511                         if isinstance(value, CoerceToPyTypeNode):
4512                             value = value.arg
4513                         item.value = value.coerce_to(member.type, env)
4514         else:
4515             self.type = error_type
4516             error(self.pos, "Cannot interpret dict as type '%s'" % dst_type)
4517         return self
4518     
4519     def release_errors(self):
4520         for err in self.obj_conversion_errors:
4521             report_error(err)
4522         self.obj_conversion_errors = []
4523
4524     gil_message = "Constructing Python dict"
4525
4526     def generate_evaluation_code(self, code):
4527         #  Custom method used here because key-value
4528         #  pairs are evaluated and used one at a time.
4529         code.mark_pos(self.pos)
4530         self.allocate_temp_result(code)
4531         if self.type.is_pyobject:
4532             self.release_errors()
4533             code.putln(
4534                 "%s = PyDict_New(); %s" % (
4535                     self.result(),
4536                     code.error_goto_if_null(self.result(), self.pos)))
4537             code.put_gotref(self.py_result())
4538         for item in self.key_value_pairs:
4539             item.generate_evaluation_code(code)
4540             if self.type.is_pyobject:
4541                 code.put_error_if_neg(self.pos, 
4542                     "PyDict_SetItem(%s, %s, %s)" % (
4543                         self.result(),
4544                         item.key.py_result(),
4545                         item.value.py_result()))
4546             else:
4547                 code.putln("%s.%s = %s;" % (
4548                         self.result(),
4549                         item.key.value,
4550                         item.value.result()))
4551             item.generate_disposal_code(code)
4552             item.free_temps(code)
4553             
4554     def annotate(self, code):
4555         for item in self.key_value_pairs:
4556             item.annotate(code)
4557             
4558 class DictItemNode(ExprNode):
4559     # Represents a single item in a DictNode
4560     #
4561     # key          ExprNode
4562     # value        ExprNode
4563     subexprs = ['key', 'value']
4564
4565     nogil_check = None # Parent DictNode takes care of it
4566
4567     def calculate_constant_result(self):
4568         self.constant_result = (
4569             self.key.constant_result, self.value.constant_result)
4570             
4571     def analyse_types(self, env):
4572         self.key.analyse_types(env)
4573         self.value.analyse_types(env)
4574         self.key = self.key.coerce_to_pyobject(env)
4575         self.value = self.value.coerce_to_pyobject(env)
4576         
4577     def generate_evaluation_code(self, code):
4578         self.key.generate_evaluation_code(code)
4579         self.value.generate_evaluation_code(code)
4580
4581     def generate_disposal_code(self, code):
4582         self.key.generate_disposal_code(code)
4583         self.value.generate_disposal_code(code)
4584
4585     def free_temps(self, code):
4586         self.key.free_temps(code)
4587         self.value.free_temps(code)
4588         
4589     def __iter__(self):
4590         return iter([self.key, self.value])
4591
4592 class ModuleNameMixin(object):
4593     def set_mod_name(self, env):
4594         self.module_name = env.global_scope().qualified_name
4595
4596     def get_py_mod_name(self, code):
4597         return code.get_py_string_const(
4598                  self.module_name, identifier=True)
4599
4600 class ClassNode(ExprNode, ModuleNameMixin):
4601     #  Helper class used in the implementation of Python
4602     #  class definitions. Constructs a class object given
4603     #  a name, tuple of bases and class dictionary.
4604     #
4605     #  name         EncodedString      Name of the class
4606     #  bases        ExprNode           Base class tuple
4607     #  dict         ExprNode           Class dict (not owned by this node)
4608     #  doc          ExprNode or None   Doc string
4609     #  module_name  EncodedString      Name of defining module
4610     
4611     subexprs = ['bases', 'doc']
4612
4613     def analyse_types(self, env):
4614         self.bases.analyse_types(env)
4615         if self.doc:
4616             self.doc.analyse_types(env)
4617             self.doc = self.doc.coerce_to_pyobject(env)
4618         self.type = py_object_type
4619         self.is_temp = 1
4620         env.use_utility_code(create_class_utility_code);
4621         #TODO(craig,haoyu) This should be moved to a better place
4622         self.set_mod_name(env)
4623
4624     def may_be_none(self):
4625         return True
4626
4627     gil_message = "Constructing Python class"
4628
4629     def generate_result_code(self, code):
4630         cname = code.intern_identifier(self.name)
4631
4632         if self.doc:
4633             code.put_error_if_neg(self.pos, 
4634                 'PyDict_SetItemString(%s, "__doc__", %s)' % (
4635                     self.dict.py_result(),
4636                     self.doc.py_result()))
4637         py_mod_name = self.get_py_mod_name(code)
4638         code.putln(
4639             '%s = __Pyx_CreateClass(%s, %s, %s, %s); %s' % (
4640                 self.result(),
4641                 self.bases.py_result(),
4642                 self.dict.py_result(),
4643                 cname,
4644                 py_mod_name,
4645                 code.error_goto_if_null(self.result(), self.pos)))
4646         code.put_gotref(self.py_result())
4647
4648
4649 class Py3ClassNode(ExprNode):
4650     #  Helper class used in the implementation of Python3+
4651     #  class definitions. Constructs a class object given
4652     #  a name, tuple of bases and class dictionary.
4653     #
4654     #  name         EncodedString      Name of the class
4655     #  dict         ExprNode           Class dict (not owned by this node)
4656     #  module_name  EncodedString      Name of defining module
4657
4658     subexprs = []
4659
4660     def analyse_types(self, env):
4661         self.type = py_object_type
4662         self.is_temp = 1
4663
4664     def may_be_none(self):
4665         return True
4666
4667     gil_message = "Constructing Python class"
4668
4669     def generate_result_code(self, code):
4670         code.globalstate.use_utility_code(create_py3class_utility_code)
4671         cname = code.intern_identifier(self.name)
4672         code.putln(
4673             '%s = __Pyx_Py3ClassCreate(%s, %s, %s, %s, %s); %s' % (
4674                 self.result(),
4675                 self.metaclass.result(),
4676                 cname,
4677                 self.bases.py_result(),
4678                 self.dict.py_result(),
4679                 self.mkw.py_result(),
4680                 code.error_goto_if_null(self.result(), self.pos)))
4681         code.put_gotref(self.py_result())
4682
4683 class KeywordArgsNode(ExprNode):
4684     # Helper class for keyword arguments
4685     #
4686     # keyword_args ExprNode or None     Keyword arguments
4687     # starstar_arg ExprNode or None     Extra arguments
4688
4689     subexprs = ['keyword_args', 'starstar_arg']
4690
4691     def analyse_types(self, env):
4692         if self.keyword_args:
4693             self.keyword_args.analyse_types(env)
4694         if self.starstar_arg:
4695             self.starstar_arg.analyse_types(env)
4696             # make sure we have a Python object as **kwargs mapping
4697             self.starstar_arg = \
4698                 self.starstar_arg.coerce_to_pyobject(env)
4699         self.type = py_object_type
4700         self.is_temp = 1
4701
4702     gil_message = "Constructing Keyword Args"
4703
4704     def generate_result_code(self, code):
4705         if self.keyword_args and self.starstar_arg:
4706             code.put_error_if_neg(self.pos,
4707                 "PyDict_Update(%s, %s)" % (
4708                     self.keyword_args.py_result(),
4709                     self.starstar_arg.py_result()))
4710         if self.keyword_args:
4711             code.putln("%s = %s;" % (self.result(), self.keyword_args.result()))
4712             code.put_incref(self.keyword_args.result(), self.keyword_args.ctype())
4713         elif self.starstar_arg:
4714             code.putln(
4715                 "%s = PyDict_Copy(%s); %s" % (
4716                     self.result(),
4717                     self.starstar_arg.py_result(),
4718                     code.error_goto_if_null(self.result(), self.pos)))
4719             code.put_gotref(self.py_result())
4720         else:
4721             code.putln(
4722                 "%s = PyDict_New(); %s" % (
4723                     self.result(),
4724                     code.error_goto_if_null(self.result(), self.pos)))
4725             code.put_gotref(self.py_result())
4726
4727 class PyClassMetaclassNode(ExprNode):
4728     # Helper class holds Python3 metaclass object
4729     #
4730     #  bases        ExprNode           Base class tuple (not owned by this node)
4731     #  mkw          ExprNode           Class keyword arguments (not owned by this node)
4732
4733     subexprs = []
4734
4735     def analyse_types(self, env):
4736         self.type = py_object_type
4737         self.is_temp = True
4738
4739     def may_be_none(self):
4740         return True
4741
4742     def generate_result_code(self, code):
4743         code.putln(
4744             "%s = __Pyx_Py3MetaclassGet(%s, %s); %s" % (
4745                 self.result(),
4746                 self.bases.result(),
4747                 self.mkw.result(),
4748                 code.error_goto_if_null(self.result(), self.pos)))
4749         code.put_gotref(self.py_result())
4750
4751 class PyClassNamespaceNode(ExprNode, ModuleNameMixin):
4752     # Helper class holds Python3 namespace object
4753     #
4754     # All this are not owned by this node
4755     #  metaclass    ExprNode           Metaclass object
4756     #  bases        ExprNode           Base class tuple
4757     #  mkw          ExprNode           Class keyword arguments
4758     #  doc          ExprNode or None   Doc string (owned)
4759
4760     subexprs = ['doc']
4761
4762     def analyse_types(self, env):
4763         self.bases.analyse_types(env)
4764         if self.doc:
4765             self.doc.analyse_types(env)
4766             self.doc = self.doc.coerce_to_pyobject(env)
4767         self.type = py_object_type
4768         self.is_temp = 1
4769         #TODO(craig,haoyu) This should be moved to a better place
4770         self.set_mod_name(env)
4771
4772     def may_be_none(self):
4773         return True
4774
4775     def generate_result_code(self, code):
4776         cname = code.intern_identifier(self.name)
4777         py_mod_name = self.get_py_mod_name(code)
4778         if self.doc:
4779             doc_code = self.doc.result()
4780         else:
4781             doc_code = '(PyObject *) NULL'
4782         code.putln(
4783             "%s = __Pyx_Py3MetaclassPrepare(%s, %s, %s, %s, %s, %s); %s" % (
4784                 self.result(),
4785                 self.metaclass.result(),
4786                 self.bases.result(),
4787                 cname,
4788                 self.mkw.result(),
4789                 py_mod_name,
4790                 doc_code,
4791                 code.error_goto_if_null(self.result(), self.pos)))
4792         code.put_gotref(self.py_result())
4793
4794 class BoundMethodNode(ExprNode):
4795     #  Helper class used in the implementation of Python
4796     #  class definitions. Constructs an bound method
4797     #  object from a class and a function.
4798     #
4799     #  function      ExprNode   Function object
4800     #  self_object   ExprNode   self object
4801     
4802     subexprs = ['function']
4803     
4804     def analyse_types(self, env):
4805         self.function.analyse_types(env)
4806         self.type = py_object_type
4807         self.is_temp = 1
4808
4809     gil_message = "Constructing an bound method"
4810
4811     def generate_result_code(self, code):
4812         code.putln(
4813             "%s = PyMethod_New(%s, %s, (PyObject*)%s->ob_type); %s" % (
4814                 self.result(),
4815                 self.function.py_result(),
4816                 self.self_object.py_result(),
4817                 self.self_object.py_result(),
4818                 code.error_goto_if_null(self.result(), self.pos)))
4819         code.put_gotref(self.py_result())
4820
4821 class UnboundMethodNode(ExprNode):
4822     #  Helper class used in the implementation of Python
4823     #  class definitions. Constructs an unbound method
4824     #  object from a class and a function.
4825     #
4826     #  function      ExprNode   Function object
4827     
4828     type = py_object_type
4829     is_temp = 1
4830     
4831     subexprs = ['function']
4832     
4833     def analyse_types(self, env):
4834         self.function.analyse_types(env)
4835
4836     def may_be_none(self):
4837         return False
4838
4839     gil_message = "Constructing an unbound method"
4840
4841     def generate_result_code(self, code):
4842         class_cname = code.pyclass_stack[-1].classobj.result()
4843         code.putln(
4844             "%s = PyMethod_New(%s, 0, %s); %s" % (
4845                 self.result(),
4846                 self.function.py_result(),
4847                 class_cname,
4848                 code.error_goto_if_null(self.result(), self.pos)))
4849         code.put_gotref(self.py_result())
4850
4851
4852 class PyCFunctionNode(ExprNode, ModuleNameMixin):
4853     #  Helper class used in the implementation of Python
4854     #  class definitions. Constructs a PyCFunction object
4855     #  from a PyMethodDef struct.
4856     #
4857     #  pymethdef_cname   string             PyMethodDef structure
4858     #  self_object       ExprNode or None
4859     #  binding           bool
4860     #  module_name       EncodedString      Name of defining module
4861
4862     subexprs = []
4863     self_object = None
4864     binding = False
4865     
4866     type = py_object_type
4867     is_temp = 1
4868     
4869     def analyse_types(self, env):
4870         if self.binding:
4871             env.use_utility_code(binding_cfunc_utility_code)
4872
4873         #TODO(craig,haoyu) This should be moved to a better place
4874         self.set_mod_name(env)
4875
4876     def may_be_none(self):
4877         return False
4878     
4879     gil_message = "Constructing Python function"
4880
4881     def self_result_code(self):
4882         if self.self_object is None:
4883             self_result = "NULL"
4884         else:
4885             self_result = self.self_object.py_result()
4886         return self_result
4887
4888     def generate_result_code(self, code):
4889         if self.binding:
4890             constructor = "%s_NewEx" % Naming.binding_cfunc
4891         else:
4892             constructor = "PyCFunction_NewEx"
4893         py_mod_name = self.get_py_mod_name(code)
4894         code.putln(
4895             '%s = %s(&%s, %s, %s); %s' % (
4896                 self.result(),
4897                 constructor,
4898                 self.pymethdef_cname,
4899                 self.self_result_code(),
4900                 py_mod_name,
4901                 code.error_goto_if_null(self.result(), self.pos)))
4902         code.put_gotref(self.py_result())
4903
4904 class InnerFunctionNode(PyCFunctionNode):
4905     # Special PyCFunctionNode that depends on a closure class
4906     #
4907
4908     binding = True
4909     needs_self_code = True
4910
4911     def self_result_code(self):
4912         if self.needs_self_code:
4913             return "((PyObject*)%s)" % (Naming.cur_scope_cname)
4914         return "NULL"
4915
4916 class LambdaNode(InnerFunctionNode):
4917     # Lambda expression node (only used as a function reference)
4918     #
4919     # args          [CArgDeclNode]         formal arguments
4920     # star_arg      PyArgDeclNode or None  * argument
4921     # starstar_arg  PyArgDeclNode or None  ** argument
4922     # lambda_name   string                 a module-globally unique lambda name
4923     # result_expr   ExprNode
4924     # def_node      DefNode                the underlying function 'def' node
4925
4926     child_attrs = ['def_node']
4927
4928     def_node = None
4929     name = StringEncoding.EncodedString('<lambda>')
4930
4931     def analyse_declarations(self, env):
4932         self.def_node.analyse_declarations(env)
4933         self.pymethdef_cname = self.def_node.entry.pymethdef_cname
4934         env.add_lambda_def(self.def_node)
4935
4936 class YieldExprNode(ExprNode):
4937     # Yield expression node
4938     #
4939     # arg         ExprNode   the value to return from the generator
4940     # label_name  string     name of the C label used for this yield
4941
4942     subexprs = ['arg']
4943     type = py_object_type
4944
4945     def analyse_types(self, env):
4946         self.is_temp = 1
4947         if self.arg is not None:
4948             self.arg.analyse_types(env)
4949             if not self.arg.type.is_pyobject:
4950                 self.arg = self.arg.coerce_to_pyobject(env)
4951         error(self.pos, "Generators are not supported")
4952
4953     def generate_result_code(self, code):
4954         self.label_name = code.new_label('resume_from_yield')
4955         code.use_label(self.label_name)
4956         code.putln("/* FIXME: save temporary variables */")
4957         code.putln("/* FIXME: return from function, yielding value */")
4958         code.put_label(self.label_name)
4959         code.putln("/* FIXME: restore temporary variables and  */")
4960         code.putln("/* FIXME: extract sent value from closure */")
4961
4962
4963 #-------------------------------------------------------------------
4964 #
4965 #  Unary operator nodes
4966 #
4967 #-------------------------------------------------------------------
4968
4969 compile_time_unary_operators = {
4970     'not': operator.not_,
4971     '~': operator.inv,
4972     '-': operator.neg,
4973     '+': operator.pos,
4974 }
4975
4976 class UnopNode(ExprNode):
4977     #  operator     string
4978     #  operand      ExprNode
4979     #
4980     #  Processing during analyse_expressions phase:
4981     #
4982     #    analyse_c_operation
4983     #      Called when the operand is not a pyobject.
4984     #      - Check operand type and coerce if needed.
4985     #      - Determine result type and result code fragment.
4986     #      - Allocate temporary for result if needed.
4987     
4988     subexprs = ['operand']
4989     infix = True
4990
4991     def calculate_constant_result(self):
4992         func = compile_time_unary_operators[self.operator]
4993         self.constant_result = func(self.operand.constant_result)
4994     
4995     def compile_time_value(self, denv):
4996         func = compile_time_unary_operators.get(self.operator)
4997         if not func:
4998             error(self.pos,
4999                 "Unary '%s' not supported in compile-time expression"
5000                     % self.operator)
5001         operand = self.operand.compile_time_value(denv)
5002         try:
5003             return func(operand)
5004         except Exception, e:
5005             self.compile_time_value_error(e)
5006     
5007     def infer_type(self, env):
5008         operand_type = self.operand.infer_type(env)
5009         if operand_type.is_pyobject:
5010             return py_object_type
5011         else:
5012             return operand_type
5013
5014     def analyse_types(self, env):
5015         self.operand.analyse_types(env)
5016         if self.is_py_operation():
5017             self.coerce_operand_to_pyobject(env)
5018             self.type = py_object_type
5019             self.is_temp = 1
5020         elif self.is_cpp_operation():
5021             self.analyse_cpp_operation(env)
5022         else:
5023             self.analyse_c_operation(env)
5024     
5025     def check_const(self):
5026         return self.operand.check_const()
5027     
5028     def is_py_operation(self):
5029         return self.operand.type.is_pyobject
5030
5031     def nogil_check(self, env):
5032         if self.is_py_operation():
5033             self.gil_error()
5034
5035     def is_cpp_operation(self):
5036         type = self.operand.type
5037         return type.is_cpp_class
5038     
5039     def coerce_operand_to_pyobject(self, env):
5040         self.operand = self.operand.coerce_to_pyobject(env)
5041     
5042     def generate_result_code(self, code):
5043         if self.operand.type.is_pyobject:
5044             self.generate_py_operation_code(code)
5045     
5046     def generate_py_operation_code(self, code):
5047         function = self.py_operation_function()
5048         code.putln(
5049             "%s = %s(%s); %s" % (
5050                 self.result(), 
5051                 function, 
5052                 self.operand.py_result(),
5053                 code.error_goto_if_null(self.result(), self.pos)))
5054         code.put_gotref(self.py_result())
5055         
5056     def type_error(self):
5057         if not self.operand.type.is_error:
5058             error(self.pos, "Invalid operand type for '%s' (%s)" %
5059                 (self.operator, self.operand.type))
5060         self.type = PyrexTypes.error_type
5061
5062     def analyse_cpp_operation(self, env):
5063         type = self.operand.type
5064         if type.is_ptr:
5065             type = type.base_type
5066         function = type.scope.lookup("operator%s" % self.operator)
5067         if not function:
5068             error(self.pos, "'%s' operator not defined for %s"
5069                 % (self.operator, type))
5070             self.type_error()
5071             return
5072         func_type = function.type
5073         if func_type.is_ptr:
5074             func_type = func_type.base_type
5075         self.type = func_type.return_type
5076
5077
5078 class NotNode(ExprNode):
5079     #  'not' operator
5080     #
5081     #  operand   ExprNode
5082     
5083     type = PyrexTypes.c_bint_type
5084
5085     subexprs = ['operand']
5086     
5087     def calculate_constant_result(self):
5088         self.constant_result = not self.operand.constant_result
5089
5090     def compile_time_value(self, denv):
5091         operand = self.operand.compile_time_value(denv)
5092         try:
5093             return not operand
5094         except Exception, e:
5095             self.compile_time_value_error(e)
5096
5097     def infer_type(self, env):
5098         return PyrexTypes.c_bint_type
5099     
5100     def analyse_types(self, env):
5101         self.operand.analyse_types(env)
5102         self.operand = self.operand.coerce_to_boolean(env)
5103     
5104     def calculate_result_code(self):
5105         return "(!%s)" % self.operand.result()
5106     
5107     def generate_result_code(self, code):
5108         pass
5109
5110
5111 class UnaryPlusNode(UnopNode):
5112     #  unary '+' operator
5113     
5114     operator = '+'
5115     
5116     def analyse_c_operation(self, env):
5117         self.type = self.operand.type
5118     
5119     def py_operation_function(self):
5120         return "PyNumber_Positive"
5121     
5122     def calculate_result_code(self):
5123         if self.is_cpp_operation():
5124             return "(+%s)" % self.operand.result()
5125         else:
5126             return self.operand.result()
5127
5128
5129 class UnaryMinusNode(UnopNode):
5130     #  unary '-' operator
5131     
5132     operator = '-'
5133     
5134     def analyse_c_operation(self, env):
5135         if self.operand.type.is_numeric:
5136             self.type = self.operand.type
5137         else:
5138             self.type_error()
5139         if self.type.is_complex:
5140             self.infix = False
5141     
5142     def py_operation_function(self):
5143         return "PyNumber_Negative"
5144     
5145     def calculate_result_code(self):
5146         if self.infix:
5147             return "(-%s)" % self.operand.result()
5148         else:
5149             return "%s(%s)" % (self.operand.type.unary_op('-'), self.operand.result())
5150
5151     def get_constant_c_result_code(self):
5152         value = self.operand.get_constant_c_result_code()
5153         if value:
5154             return "(-%s)" % (value)
5155
5156 class TildeNode(UnopNode):
5157     #  unary '~' operator
5158
5159     def analyse_c_operation(self, env):
5160         if self.operand.type.is_int:
5161             self.type = self.operand.type
5162         else:
5163             self.type_error()
5164
5165     def py_operation_function(self):
5166         return "PyNumber_Invert"
5167     
5168     def calculate_result_code(self):
5169         return "(~%s)" % self.operand.result()
5170
5171
5172 class CUnopNode(UnopNode):
5173
5174     def is_py_operation(self):
5175         return False
5176
5177 class DereferenceNode(CUnopNode):
5178     #  unary * operator
5179
5180     operator = '*'
5181     
5182     def analyse_c_operation(self, env):
5183         if self.operand.type.is_ptr:
5184             self.type = self.operand.type.base_type
5185         else:
5186             self.type_error()
5187
5188     def calculate_result_code(self):
5189         return "(*%s)" % self.operand.result()
5190
5191
5192 class DecrementIncrementNode(CUnopNode):
5193     #  unary ++/-- operator
5194     
5195     def analyse_c_operation(self, env):
5196         if self.operand.type.is_ptr or self.operand.type.is_numeric:
5197             self.type = self.operand.type
5198         else:
5199             self.type_error()
5200
5201     def calculate_result_code(self):
5202         if self.is_prefix:
5203             return "(%s%s)" % (self.operator, self.operand.result())
5204         else:
5205             return "(%s%s)" % (self.operand.result(), self.operator)
5206
5207 def inc_dec_constructor(is_prefix, operator):
5208     return lambda pos, **kwds: DecrementIncrementNode(pos, is_prefix=is_prefix, operator=operator, **kwds)
5209
5210
5211 class AmpersandNode(ExprNode):
5212     #  The C address-of operator.
5213     #
5214     #  operand  ExprNode
5215     
5216     subexprs = ['operand']
5217     
5218     def infer_type(self, env):
5219         return PyrexTypes.c_ptr_type(self.operand.infer_type(env))
5220
5221     def analyse_types(self, env):
5222         self.operand.analyse_types(env)
5223         argtype = self.operand.type
5224         if not (argtype.is_cfunction or self.operand.is_lvalue()):
5225             self.error("Taking address of non-lvalue")
5226             return
5227         if argtype.is_pyobject:
5228             self.error("Cannot take address of Python variable")
5229             return
5230         self.type = PyrexTypes.c_ptr_type(argtype)
5231     
5232     def check_const(self):
5233         return self.operand.check_const_addr()
5234     
5235     def error(self, mess):
5236         error(self.pos, mess)
5237         self.type = PyrexTypes.error_type
5238         self.result_code = "<error>"
5239     
5240     def calculate_result_code(self):
5241         return "(&%s)" % self.operand.result()
5242
5243     def generate_result_code(self, code):
5244         pass
5245     
5246
5247 unop_node_classes = {
5248     "+":  UnaryPlusNode,
5249     "-":  UnaryMinusNode,
5250     "~":  TildeNode,
5251 }
5252
5253 def unop_node(pos, operator, operand):
5254     # Construct unnop node of appropriate class for 
5255     # given operator.
5256     if isinstance(operand, IntNode) and operator == '-':
5257         return IntNode(pos = operand.pos, value = str(-Utils.str_to_number(operand.value)))
5258     elif isinstance(operand, UnopNode) and operand.operator == operator:
5259         warning(pos, "Python has no increment/decrement operator: %s%sx = %s(%sx) = x" % ((operator,)*4), 5)
5260     return unop_node_classes[operator](pos, 
5261         operator = operator, 
5262         operand = operand)
5263
5264
5265 class TypecastNode(ExprNode):
5266     #  C type cast
5267     #
5268     #  operand      ExprNode
5269     #  base_type    CBaseTypeNode
5270     #  declarator   CDeclaratorNode
5271     #
5272     #  If used from a transform, one can if wanted specify the attribute
5273     #  "type" directly and leave base_type and declarator to None
5274     
5275     subexprs = ['operand']
5276     base_type = declarator = type = None
5277     
5278     def type_dependencies(self, env):
5279         return ()
5280     
5281     def infer_type(self, env):
5282         if self.type is None:
5283             base_type = self.base_type.analyse(env)
5284             _, self.type = self.declarator.analyse(base_type, env)
5285         return self.type
5286     
5287     def analyse_types(self, env):
5288         if self.type is None:
5289             base_type = self.base_type.analyse(env)
5290             _, self.type = self.declarator.analyse(base_type, env)
5291         if self.type.is_cfunction:
5292             error(self.pos,
5293                 "Cannot cast to a function type")
5294             self.type = PyrexTypes.error_type
5295         self.operand.analyse_types(env)
5296         to_py = self.type.is_pyobject
5297         from_py = self.operand.type.is_pyobject
5298         if from_py and not to_py and self.operand.is_ephemeral() and not self.type.is_numeric:
5299             error(self.pos, "Casting temporary Python object to non-numeric non-Python type")
5300         if to_py and not from_py:
5301             if self.type is bytes_type and self.operand.type.is_int:
5302                 # FIXME: the type cast node isn't needed in this case
5303                 # and can be dropped once analyse_types() can return a
5304                 # different node
5305                 self.operand = CoerceIntToBytesNode(self.operand, env)
5306             elif self.operand.type.can_coerce_to_pyobject(env):
5307                 self.result_ctype = py_object_type
5308                 self.operand = self.operand.coerce_to_pyobject(env)
5309             else:
5310                 if self.operand.type.is_ptr:
5311                     if not (self.operand.type.base_type.is_void or self.operand.type.base_type.is_struct):
5312                         error(self.pos, "Python objects cannot be cast from pointers of primitive types")
5313                 else:
5314                     # Should this be an error? 
5315                     warning(self.pos, "No conversion from %s to %s, python object pointer used." % (self.operand.type, self.type))
5316                 self.operand = self.operand.coerce_to_simple(env)
5317         elif from_py and not to_py:
5318             if self.type.create_from_py_utility_code(env):
5319                 self.operand = self.operand.coerce_to(self.type, env)
5320             elif self.type.is_ptr:
5321                 if not (self.type.base_type.is_void or self.type.base_type.is_struct):
5322                     error(self.pos, "Python objects cannot be cast to pointers of primitive types")
5323             else:
5324                 warning(self.pos, "No conversion from %s to %s, python object pointer used." % (self.type, self.operand.type))
5325         elif from_py and to_py:
5326             if self.typecheck and self.type.is_extension_type:
5327                 self.operand = PyTypeTestNode(self.operand, self.type, env, notnone=True)
5328         elif self.type.is_complex and self.operand.type.is_complex:
5329             self.operand = self.operand.coerce_to_simple(env)
5330
5331     def nogil_check(self, env):
5332         if self.type and self.type.is_pyobject and self.is_temp:
5333             self.gil_error()
5334
5335     def check_const(self):
5336         return self.operand.check_const()
5337
5338     def calculate_constant_result(self):
5339         # we usually do not know the result of a type cast at code
5340         # generation time
5341         pass
5342     
5343     def calculate_result_code(self):
5344         if self.type.is_complex:
5345             operand_result = self.operand.result()
5346             if self.operand.type.is_complex:
5347                 real_part = self.type.real_type.cast_code("__Pyx_CREAL(%s)" % operand_result)
5348                 imag_part = self.type.real_type.cast_code("__Pyx_CIMAG(%s)" % operand_result)
5349             else:
5350                 real_part = self.type.real_type.cast_code(operand_result)
5351                 imag_part = "0"
5352             return "%s(%s, %s)" % (
5353                     self.type.from_parts,
5354                     real_part,
5355                     imag_part)    
5356         else:
5357             return self.type.cast_code(self.operand.result())
5358     
5359     def get_constant_c_result_code(self):
5360         operand_result = self.operand.get_constant_c_result_code()
5361         if operand_result:
5362             return self.type.cast_code(operand_result)
5363     
5364     def result_as(self, type):
5365         if self.type.is_pyobject and not self.is_temp:
5366             #  Optimise away some unnecessary casting
5367             return self.operand.result_as(type)
5368         else:
5369             return ExprNode.result_as(self, type)
5370
5371     def generate_result_code(self, code):
5372         if self.is_temp:
5373             code.putln(
5374                 "%s = (PyObject *)%s;" % (
5375                     self.result(),
5376                     self.operand.result()))
5377             code.put_incref(self.result(), self.ctype())
5378
5379
5380 class SizeofNode(ExprNode):
5381     #  Abstract base class for sizeof(x) expression nodes.
5382     
5383     type = PyrexTypes.c_size_t_type
5384
5385     def check_const(self):
5386         return True
5387
5388     def generate_result_code(self, code):
5389         pass
5390
5391
5392 class SizeofTypeNode(SizeofNode):
5393     #  C sizeof function applied to a type
5394     #
5395     #  base_type   CBaseTypeNode
5396     #  declarator  CDeclaratorNode
5397     
5398     subexprs = []
5399     arg_type = None
5400     
5401     def analyse_types(self, env):
5402         # we may have incorrectly interpreted a dotted name as a type rather than an attribute
5403         # this could be better handled by more uniformly treating types as runtime-available objects
5404         if 0 and self.base_type.module_path:
5405             path = self.base_type.module_path
5406             obj = env.lookup(path[0])
5407             if obj.as_module is None:
5408                 operand = NameNode(pos=self.pos, name=path[0])
5409                 for attr in path[1:]:
5410                     operand = AttributeNode(pos=self.pos, obj=operand, attribute=attr)
5411                 operand = AttributeNode(pos=self.pos, obj=operand, attribute=self.base_type.name)
5412                 self.operand = operand
5413                 self.__class__ = SizeofVarNode
5414                 self.analyse_types(env)
5415                 return
5416         if self.arg_type is None:
5417             base_type = self.base_type.analyse(env)
5418             _, arg_type = self.declarator.analyse(base_type, env)
5419             self.arg_type = arg_type
5420         self.check_type()
5421         
5422     def check_type(self):
5423         arg_type = self.arg_type
5424         if arg_type.is_pyobject and not arg_type.is_extension_type:
5425             error(self.pos, "Cannot take sizeof Python object")
5426         elif arg_type.is_void:
5427             error(self.pos, "Cannot take sizeof void")
5428         elif not arg_type.is_complete():
5429             error(self.pos, "Cannot take sizeof incomplete type '%s'" % arg_type)
5430         
5431     def calculate_result_code(self):
5432         if self.arg_type.is_extension_type:
5433             # the size of the pointer is boring
5434             # we want the size of the actual struct
5435             arg_code = self.arg_type.declaration_code("", deref=1)
5436         else:
5437             arg_code = self.arg_type.declaration_code("")
5438         return "(sizeof(%s))" % arg_code
5439     
5440
5441 class SizeofVarNode(SizeofNode):
5442     #  C sizeof function applied to a variable
5443     #
5444     #  operand   ExprNode
5445     
5446     subexprs = ['operand']
5447     
5448     def analyse_types(self, env):
5449         # We may actually be looking at a type rather than a variable...
5450         # If we are, traditional analysis would fail...
5451         operand_as_type = self.operand.analyse_as_type(env)
5452         if operand_as_type:
5453             self.arg_type = operand_as_type
5454             self.__class__ = SizeofTypeNode
5455             self.check_type()
5456         else:
5457             self.operand.analyse_types(env)
5458     
5459     def calculate_result_code(self):
5460         return "(sizeof(%s))" % self.operand.result()
5461     
5462     def generate_result_code(self, code):
5463         pass
5464
5465 class TypeofNode(ExprNode):
5466     #  Compile-time type of an expression, as a string.
5467     #
5468     #  operand   ExprNode
5469     #  literal   StringNode # internal
5470     
5471     literal = None
5472     type = py_object_type
5473     
5474     subexprs = ['literal'] # 'operand' will be ignored after type analysis!
5475     
5476     def analyse_types(self, env):
5477         self.operand.analyse_types(env)
5478         self.literal = StringNode(
5479             self.pos, value=StringEncoding.EncodedString(str(self.operand.type)))
5480         self.literal.analyse_types(env)
5481         self.literal = self.literal.coerce_to_pyobject(env)
5482
5483     def may_be_none(self):
5484         return False
5485
5486     def generate_evaluation_code(self, code):
5487         self.literal.generate_evaluation_code(code)
5488     
5489     def calculate_result_code(self):
5490         return self.literal.calculate_result_code()
5491
5492 #-------------------------------------------------------------------
5493 #
5494 #  Binary operator nodes
5495 #
5496 #-------------------------------------------------------------------
5497
5498 def _not_in(x, seq):
5499     return x not in seq
5500
5501 compile_time_binary_operators = {
5502     '<': operator.lt,
5503     '<=': operator.le,
5504     '==': operator.eq,
5505     '!=': operator.ne,
5506     '>=': operator.ge,
5507     '>': operator.gt,
5508     'is': operator.is_,
5509     'is_not': operator.is_not,
5510     '+': operator.add,
5511     '&': operator.and_,
5512     '/': operator.truediv,
5513     '//': operator.floordiv,
5514     '<<': operator.lshift,
5515     '%': operator.mod,
5516     '*': operator.mul,
5517     '|': operator.or_,
5518     '**': operator.pow,
5519     '>>': operator.rshift,
5520     '-': operator.sub,
5521     '^': operator.xor,
5522     'in': operator.contains,
5523     'not_in': _not_in,
5524 }
5525
5526 def get_compile_time_binop(node):
5527     func = compile_time_binary_operators.get(node.operator)
5528     if not func:
5529         error(node.pos,
5530             "Binary '%s' not supported in compile-time expression"
5531                 % node.operator)
5532     return func
5533
5534 class BinopNode(ExprNode):
5535     #  operator     string
5536     #  operand1     ExprNode
5537     #  operand2     ExprNode
5538     #
5539     #  Processing during analyse_expressions phase:
5540     #
5541     #    analyse_c_operation
5542     #      Called when neither operand is a pyobject.
5543     #      - Check operand types and coerce if needed.
5544     #      - Determine result type and result code fragment.
5545     #      - Allocate temporary for result if needed.
5546     
5547     subexprs = ['operand1', 'operand2']
5548     inplace = False
5549
5550     def calculate_constant_result(self):
5551         func = compile_time_binary_operators[self.operator]
5552         self.constant_result = func(
5553             self.operand1.constant_result,
5554             self.operand2.constant_result)
5555
5556     def compile_time_value(self, denv):
5557         func = get_compile_time_binop(self)
5558         operand1 = self.operand1.compile_time_value(denv)
5559         operand2 = self.operand2.compile_time_value(denv)
5560         try:
5561             return func(operand1, operand2)
5562         except Exception, e:
5563             self.compile_time_value_error(e)
5564     
5565     def infer_type(self, env):
5566         return self.result_type(self.operand1.infer_type(env),
5567                                 self.operand2.infer_type(env))
5568     
5569     def analyse_types(self, env):
5570         self.operand1.analyse_types(env)
5571         self.operand2.analyse_types(env)
5572         self.analyse_operation(env)
5573     
5574     def analyse_operation(self, env):
5575         if self.is_py_operation():
5576             self.coerce_operands_to_pyobjects(env)
5577             self.type = self.result_type(self.operand1.type,
5578                                          self.operand2.type)
5579             assert self.type.is_pyobject
5580             self.is_temp = 1
5581         elif self.is_cpp_operation():
5582             self.analyse_cpp_operation(env)
5583         else:
5584             self.analyse_c_operation(env)
5585     
5586     def is_py_operation(self):
5587         return self.is_py_operation_types(self.operand1.type, self.operand2.type)
5588     
5589     def is_py_operation_types(self, type1, type2):
5590         return type1.is_pyobject or type2.is_pyobject
5591
5592     def is_cpp_operation(self):
5593         return (self.operand1.type.is_cpp_class
5594             or self.operand2.type.is_cpp_class)
5595     
5596     def analyse_cpp_operation(self, env):
5597         type1 = self.operand1.type
5598         type2 = self.operand2.type
5599         entry = env.lookup_operator(self.operator, [self.operand1, self.operand2])
5600         if not entry:
5601             self.type_error()
5602             return
5603         func_type = entry.type
5604         if func_type.is_ptr:
5605             func_type = func_type.base_type
5606         if len(func_type.args) == 1:
5607             self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env)
5608         else:
5609             self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env)
5610             self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env)
5611         self.type = func_type.return_type
5612     
5613     def result_type(self, type1, type2):
5614         if self.is_py_operation_types(type1, type2):
5615             if type2.is_string:
5616                 type2 = Builtin.bytes_type
5617             if type1.is_string:
5618                 type1 = Builtin.bytes_type
5619             elif self.operator == '%' \
5620                      and type1 in (Builtin.str_type, Builtin.unicode_type):
5621                 # note that  b'%s' % b'abc'  doesn't work in Py3
5622                 return type1
5623             if type1.is_builtin_type:
5624                 if type1 is type2:
5625                     if self.operator in '**%+|&^':
5626                         # FIXME: at least these operators should be safe - others?
5627                         return type1
5628                 elif self.operator == '*':
5629                     if type1 in (Builtin.bytes_type, Builtin.str_type, Builtin.unicode_type):
5630                         return type1
5631                     # multiplication of containers/numbers with an
5632                     # integer value always (?) returns the same type
5633                     if type2.is_int:
5634                         return type1
5635             elif type2.is_builtin_type and type1.is_int and self.operator == '*':
5636                 # multiplication of containers/numbers with an
5637                 # integer value always (?) returns the same type
5638                 return type2
5639             return py_object_type
5640         else:
5641             return self.compute_c_result_type(type1, type2)
5642
5643     def nogil_check(self, env):
5644         if self.is_py_operation():
5645             self.gil_error()
5646         
5647     def coerce_operands_to_pyobjects(self, env):
5648         self.operand1 = self.operand1.coerce_to_pyobject(env)
5649         self.operand2 = self.operand2.coerce_to_pyobject(env)
5650     
5651     def check_const(self):
5652         return self.operand1.check_const() and self.operand2.check_const()
5653     
5654     def generate_result_code(self, code):
5655         #print "BinopNode.generate_result_code:", self.operand1, self.operand2 ###
5656         if self.operand1.type.is_pyobject:
5657             function = self.py_operation_function()
5658             if self.operator == '**':
5659                 extra_args = ", Py_None"
5660             else:
5661                 extra_args = ""
5662             code.putln(
5663                 "%s = %s(%s, %s%s); %s" % (
5664                     self.result(), 
5665                     function, 
5666                     self.operand1.py_result(),
5667                     self.operand2.py_result(),
5668                     extra_args,
5669                     code.error_goto_if_null(self.result(), self.pos)))
5670             code.put_gotref(self.py_result())
5671     
5672     def type_error(self):
5673         if not (self.operand1.type.is_error
5674                 or self.operand2.type.is_error):
5675             error(self.pos, "Invalid operand types for '%s' (%s; %s)" %
5676                 (self.operator, self.operand1.type, 
5677                     self.operand2.type))
5678         self.type = PyrexTypes.error_type
5679
5680
5681 class CBinopNode(BinopNode):
5682     
5683     def analyse_types(self, env):
5684         BinopNode.analyse_types(self, env)
5685         if self.is_py_operation():
5686             self.type = PyrexTypes.error_type
5687     
5688     def py_operation_function():
5689         return ""
5690         
5691     def calculate_result_code(self):
5692         return "(%s %s %s)" % (
5693             self.operand1.result(), 
5694             self.operator, 
5695             self.operand2.result())
5696
5697
5698 def c_binop_constructor(operator):
5699     def make_binop_node(pos, **operands):
5700         return CBinopNode(pos, operator=operator, **operands)
5701     return make_binop_node
5702
5703 class NumBinopNode(BinopNode):
5704     #  Binary operation taking numeric arguments.
5705     
5706     infix = True
5707     
5708     def analyse_c_operation(self, env):
5709         type1 = self.operand1.type
5710         type2 = self.operand2.type
5711         self.type = self.compute_c_result_type(type1, type2)
5712         if not self.type:
5713             self.type_error()
5714             return
5715         if self.type.is_complex:
5716             self.infix = False
5717         if not self.infix or (type1.is_numeric and type2.is_numeric):
5718             self.operand1 = self.operand1.coerce_to(self.type, env)
5719             self.operand2 = self.operand2.coerce_to(self.type, env)
5720     
5721     def compute_c_result_type(self, type1, type2):
5722         if self.c_types_okay(type1, type2):
5723             widest_type = PyrexTypes.widest_numeric_type(type1, type2)
5724             if widest_type is PyrexTypes.c_bint_type:
5725                 if self.operator not in '|^&':
5726                     # False + False == 0 # not False!
5727                     widest_type = PyrexTypes.c_int_type
5728             return widest_type
5729         else:
5730             return None
5731
5732     def get_constant_c_result_code(self):
5733         value1 = self.operand1.get_constant_c_result_code()
5734         value2 = self.operand2.get_constant_c_result_code()
5735         if value1 and value2:
5736             return "(%s %s %s)" % (value1, self.operator, value2)
5737         else:
5738             return None
5739     
5740     def c_types_okay(self, type1, type2):
5741         #print "NumBinopNode.c_types_okay:", type1, type2 ###
5742         return (type1.is_numeric  or type1.is_enum) \
5743             and (type2.is_numeric  or type2.is_enum)
5744
5745     def calculate_result_code(self):
5746         if self.infix:
5747             return "(%s %s %s)" % (
5748                 self.operand1.result(), 
5749                 self.operator, 
5750                 self.operand2.result())
5751         else:
5752             func = self.type.binary_op(self.operator)
5753             if func is None:
5754                 error(self.pos, "binary operator %s not supported for %s" % (self.operator, self.type))
5755             return "%s(%s, %s)" % (
5756                 func,
5757                 self.operand1.result(),
5758                 self.operand2.result())
5759     
5760     def is_py_operation_types(self, type1, type2):
5761         return (type1 is PyrexTypes.c_py_unicode_type or
5762                 type2 is PyrexTypes.c_py_unicode_type or
5763                 BinopNode.is_py_operation_types(self, type1, type2))
5764     
5765     def py_operation_function(self):
5766         fuction = self.py_functions[self.operator]
5767         if self.inplace:
5768             fuction = fuction.replace('PyNumber_', 'PyNumber_InPlace')
5769         return fuction
5770
5771     py_functions = {
5772         "|":        "PyNumber_Or",
5773         "^":        "PyNumber_Xor",
5774         "&":        "PyNumber_And",
5775         "<<":       "PyNumber_Lshift",
5776         ">>":       "PyNumber_Rshift",
5777         "+":        "PyNumber_Add",
5778         "-":        "PyNumber_Subtract",
5779         "*":        "PyNumber_Multiply",
5780         "/":        "__Pyx_PyNumber_Divide",
5781         "//":       "PyNumber_FloorDivide",
5782         "%":        "PyNumber_Remainder",
5783         "**":       "PyNumber_Power"
5784     }
5785
5786 class IntBinopNode(NumBinopNode):
5787     #  Binary operation taking integer arguments.
5788     
5789     def c_types_okay(self, type1, type2):
5790         #print "IntBinopNode.c_types_okay:", type1, type2 ###
5791         return (type1.is_int or type1.is_enum) \
5792             and (type2.is_int or type2.is_enum)
5793
5794     
5795 class AddNode(NumBinopNode):
5796     #  '+' operator.
5797     
5798     def is_py_operation_types(self, type1, type2):
5799         if type1.is_string and type2.is_string:
5800             return 1
5801         else:
5802             return NumBinopNode.is_py_operation_types(self, type1, type2)
5803
5804     def compute_c_result_type(self, type1, type2):
5805         #print "AddNode.compute_c_result_type:", type1, self.operator, type2 ###
5806         if (type1.is_ptr or type1.is_array) and (type2.is_int or type2.is_enum):
5807             return type1
5808         elif (type2.is_ptr or type2.is_array) and (type1.is_int or type1.is_enum):
5809             return type2
5810         else:
5811             return NumBinopNode.compute_c_result_type(
5812                 self, type1, type2)
5813
5814
5815 class SubNode(NumBinopNode):
5816     #  '-' operator.
5817     
5818     def compute_c_result_type(self, type1, type2):
5819         if (type1.is_ptr or type1.is_array) and (type2.is_int or type2.is_enum):
5820             return type1
5821         elif (type1.is_ptr or type1.is_array) and (type2.is_ptr or type2.is_array):
5822             return PyrexTypes.c_int_type
5823         else:
5824             return NumBinopNode.compute_c_result_type(
5825                 self, type1, type2)
5826
5827
5828 class MulNode(NumBinopNode):
5829     #  '*' operator.
5830     
5831     def is_py_operation_types(self, type1, type2):
5832         if (type1.is_string and type2.is_int) \
5833             or (type2.is_string and type1.is_int):
5834                 return 1
5835         else:
5836             return NumBinopNode.is_py_operation_types(self, type1, type2)
5837
5838
5839 class DivNode(NumBinopNode):
5840     #  '/' or '//' operator.
5841     
5842     cdivision = None
5843     truedivision = None   # == "unknown" if operator == '/'
5844     ctruedivision = False
5845     cdivision_warnings = False
5846     zerodivision_check = None
5847
5848     def find_compile_time_binary_operator(self, op1, op2):
5849         func = compile_time_binary_operators[self.operator]
5850         if self.operator == '/' and self.truedivision is None:
5851             # => true div for floats, floor div for integers
5852             if isinstance(op1, (int,long)) and isinstance(op2, (int,long)):
5853                 func = compile_time_binary_operators['//']
5854         return func
5855
5856     def calculate_constant_result(self):
5857         op1 = self.operand1.constant_result
5858         op2 = self.operand2.constant_result
5859         func = self.find_compile_time_binary_operator(op1, op2)
5860         self.constant_result = func(
5861             self.operand1.constant_result,
5862             self.operand2.constant_result)
5863
5864     def compile_time_value(self, denv):
5865         operand1 = self.operand1.compile_time_value(denv)
5866         operand2 = self.operand2.compile_time_value(denv)
5867         try:
5868             func = self.find_compile_time_binary_operator(
5869                 self, operand1, operand2)
5870             return func(operand1, operand2)
5871         except Exception, e:
5872             self.compile_time_value_error(e)
5873
5874     def analyse_operation(self, env):
5875         if self.cdivision or env.directives['cdivision']:
5876             self.ctruedivision = False
5877         else:
5878             self.ctruedivision = self.truedivision
5879         NumBinopNode.analyse_operation(self, env)
5880         if self.is_cpp_operation():
5881             self.cdivision = True
5882         if not self.type.is_pyobject:
5883             self.zerodivision_check = (
5884                 self.cdivision is None and not env.directives['cdivision']
5885                 and (not self.operand2.has_constant_result() or
5886                      self.operand2.constant_result == 0))
5887             if self.zerodivision_check or env.directives['cdivision_warnings']:
5888                 # Need to check ahead of time to warn or raise zero division error
5889                 self.operand1 = self.operand1.coerce_to_simple(env)
5890                 self.operand2 = self.operand2.coerce_to_simple(env)
5891                 if env.nogil:
5892                     error(self.pos, "Pythonic division not allowed without gil, consider using cython.cdivision(True)")
5893
5894     def compute_c_result_type(self, type1, type2):
5895         if self.operator == '/' and self.ctruedivision:
5896             if not type1.is_float and not type2.is_float:
5897                 widest_type = PyrexTypes.widest_numeric_type(type1, PyrexTypes.c_double_type)
5898                 widest_type = PyrexTypes.widest_numeric_type(type2, widest_type)
5899                 return widest_type
5900         return NumBinopNode.compute_c_result_type(self, type1, type2)
5901
5902     def zero_division_message(self):
5903         if self.type.is_int:
5904             return "integer division or modulo by zero"
5905         else:
5906             return "float division"
5907
5908     def generate_evaluation_code(self, code):
5909         if not self.type.is_pyobject and not self.type.is_complex:
5910             if self.cdivision is None:
5911                 self.cdivision = (code.globalstate.directives['cdivision'] 
5912                                     or not self.type.signed
5913                                     or self.type.is_float)
5914             if not self.cdivision:
5915                 code.globalstate.use_utility_code(div_int_utility_code.specialize(self.type))
5916         NumBinopNode.generate_evaluation_code(self, code)
5917         self.generate_div_warning_code(code)
5918     
5919     def generate_div_warning_code(self, code):
5920         if not self.type.is_pyobject:
5921             if self.zerodivision_check:
5922                 if not self.infix:
5923                     zero_test = "%s(%s)" % (self.type.unary_op('zero'), self.operand2.result())
5924                 else:
5925                     zero_test = "%s == 0" % self.operand2.result()
5926                 code.putln("if (unlikely(%s)) {" % zero_test)
5927                 code.putln('PyErr_Format(PyExc_ZeroDivisionError, "%s");' % self.zero_division_message())
5928                 code.putln(code.error_goto(self.pos))
5929                 code.putln("}")
5930                 if self.type.is_int and self.type.signed and self.operator != '%':
5931                     code.globalstate.use_utility_code(division_overflow_test_code)
5932                     code.putln("else if (sizeof(%s) == sizeof(long) && unlikely(%s == -1) && unlikely(UNARY_NEG_WOULD_OVERFLOW(%s))) {" % (
5933                                     self.type.declaration_code(''), 
5934                                     self.operand2.result(),
5935                                     self.operand1.result()))
5936                     code.putln('PyErr_Format(PyExc_OverflowError, "value too large to perform division");')
5937                     code.putln(code.error_goto(self.pos))
5938                     code.putln("}")
5939             if code.globalstate.directives['cdivision_warnings'] and self.operator != '/':
5940                 code.globalstate.use_utility_code(cdivision_warning_utility_code)
5941                 code.putln("if ((%s < 0) ^ (%s < 0)) {" % (
5942                                 self.operand1.result(),
5943                                 self.operand2.result()))
5944                 code.putln(code.set_error_info(self.pos));
5945                 code.put("if (__Pyx_cdivision_warning()) ")
5946                 code.put_goto(code.error_label)
5947                 code.putln("}")
5948     
5949     def calculate_result_code(self):
5950         if self.type.is_complex:
5951             return NumBinopNode.calculate_result_code(self)
5952         elif self.type.is_float and self.operator == '//':
5953             return "floor(%s / %s)" % (
5954                 self.operand1.result(),
5955                 self.operand2.result())
5956         elif self.truedivision or self.cdivision:
5957             op1 = self.operand1.result()
5958             op2 = self.operand2.result()
5959             if self.truedivision:
5960                 if self.type != self.operand1.type:
5961                     op1 = self.type.cast_code(op1)
5962                 if self.type != self.operand2.type:
5963                     op2 = self.type.cast_code(op2)
5964             return "(%s / %s)" % (op1, op2)
5965         else:
5966             return "__Pyx_div_%s(%s, %s)" % (
5967                     self.type.specialization_name(),
5968                     self.operand1.result(), 
5969                     self.operand2.result())
5970
5971
5972 class ModNode(DivNode):
5973     #  '%' operator.
5974
5975     def is_py_operation_types(self, type1, type2):
5976         return (type1.is_string
5977             or type2.is_string
5978             or NumBinopNode.is_py_operation_types(self, type1, type2))
5979
5980     def zero_division_message(self):
5981         if self.type.is_int:
5982             return "integer division or modulo by zero"
5983         else:
5984             return "float divmod()"
5985     
5986     def generate_evaluation_code(self, code):
5987         if not self.type.is_pyobject:
5988             if self.cdivision is None:
5989                 self.cdivision = code.globalstate.directives['cdivision'] or not self.type.signed
5990             if not self.cdivision:
5991                 if self.type.is_int:
5992                     code.globalstate.use_utility_code(mod_int_utility_code.specialize(self.type))
5993                 else:
5994                     code.globalstate.use_utility_code(
5995                         mod_float_utility_code.specialize(self.type, math_h_modifier=self.type.math_h_modifier))
5996         NumBinopNode.generate_evaluation_code(self, code)
5997         self.generate_div_warning_code(code)
5998     
5999     def calculate_result_code(self):
6000         if self.cdivision:
6001             if self.type.is_float:
6002                 return "fmod%s(%s, %s)" % (
6003                     self.type.math_h_modifier,
6004                     self.operand1.result(), 
6005                     self.operand2.result())
6006             else:
6007                 return "(%s %% %s)" % (
6008                     self.operand1.result(), 
6009                     self.operand2.result())
6010         else:
6011             return "__Pyx_mod_%s(%s, %s)" % (
6012                     self.type.specialization_name(),
6013                     self.operand1.result(), 
6014                     self.operand2.result())
6015
6016 class PowNode(NumBinopNode):
6017     #  '**' operator.
6018     
6019     def analyse_c_operation(self, env):
6020         NumBinopNode.analyse_c_operation(self, env)
6021         if self.type.is_complex:
6022             if self.type.real_type.is_float:
6023                 self.operand1 = self.operand1.coerce_to(self.type, env)
6024                 self.operand2 = self.operand2.coerce_to(self.type, env)
6025                 self.pow_func = "__Pyx_c_pow" + self.type.real_type.math_h_modifier
6026             else:
6027                 error(self.pos, "complex int powers not supported")
6028                 self.pow_func = "<error>"
6029         elif self.type.is_float:
6030             self.pow_func = "pow" + self.type.math_h_modifier
6031         else:
6032             self.pow_func = "__Pyx_pow_%s" % self.type.declaration_code('').replace(' ', '_')
6033             env.use_utility_code(
6034                     int_pow_utility_code.specialize(func_name=self.pow_func, 
6035                                                 type=self.type.declaration_code('')))
6036
6037     def calculate_result_code(self):
6038         # Work around MSVC overloading ambiguity.
6039         def typecast(operand):
6040             if self.type == operand.type:
6041                 return operand.result()
6042             else:
6043                 return self.type.cast_code(operand.result())
6044         return "%s(%s, %s)" % (
6045             self.pow_func, 
6046             typecast(self.operand1), 
6047             typecast(self.operand2))
6048
6049
6050 # Note: This class is temporarily "shut down" into an ineffective temp
6051 # allocation mode.
6052 #
6053 # More sophisticated temp reuse was going on before, one could have a
6054 # look at adding this again after /all/ classes are converted to the
6055 # new temp scheme. (The temp juggling cannot work otherwise).
6056 class BoolBinopNode(ExprNode):
6057     #  Short-circuiting boolean operation.
6058     #
6059     #  operator     string
6060     #  operand1     ExprNode
6061     #  operand2     ExprNode
6062     
6063     subexprs = ['operand1', 'operand2']
6064     
6065     def infer_type(self, env):
6066         type1 = self.operand1.infer_type(env)
6067         type2 = self.operand2.infer_type(env)
6068         return PyrexTypes.independent_spanning_type(type1, type2)
6069
6070     def may_be_none(self):
6071         if self.operator == 'or':
6072             return self.operand2.may_be_none()
6073         else:
6074             return self.operand1.may_be_none() or self.operand2.may_be_none()
6075
6076     def calculate_constant_result(self):
6077         if self.operator == 'and':
6078             self.constant_result = \
6079                 self.operand1.constant_result and \
6080                 self.operand2.constant_result
6081         else:
6082             self.constant_result = \
6083                 self.operand1.constant_result or \
6084                 self.operand2.constant_result
6085     
6086     def compile_time_value(self, denv):
6087         if self.operator == 'and':
6088             return self.operand1.compile_time_value(denv) \
6089                 and self.operand2.compile_time_value(denv)
6090         else:
6091             return self.operand1.compile_time_value(denv) \
6092                 or self.operand2.compile_time_value(denv)
6093     
6094     def coerce_to_boolean(self, env):
6095         return BoolBinopNode(
6096             self.pos,
6097             operator = self.operator,
6098             operand1 = self.operand1.coerce_to_boolean(env),
6099             operand2 = self.operand2.coerce_to_boolean(env),
6100             type = PyrexTypes.c_bint_type,
6101             is_temp = self.is_temp)
6102
6103     def analyse_types(self, env):
6104         self.operand1.analyse_types(env)
6105         self.operand2.analyse_types(env)
6106         self.type = PyrexTypes.independent_spanning_type(self.operand1.type, self.operand2.type)
6107         self.operand1 = self.operand1.coerce_to(self.type, env)
6108         self.operand2 = self.operand2.coerce_to(self.type, env)
6109         
6110         # For what we're about to do, it's vital that
6111         # both operands be temp nodes.
6112         self.operand1 = self.operand1.coerce_to_simple(env)
6113         self.operand2 = self.operand2.coerce_to_simple(env)
6114         self.is_temp = 1
6115
6116     gil_message = "Truth-testing Python object"
6117
6118     def check_const(self):
6119         return self.operand1.check_const() and self.operand2.check_const()
6120     
6121     def generate_evaluation_code(self, code):
6122         code.mark_pos(self.pos)
6123         self.operand1.generate_evaluation_code(code)
6124         test_result, uses_temp = self.generate_operand1_test(code)
6125         if self.operator == 'and':
6126             sense = ""
6127         else:
6128             sense = "!"
6129         code.putln(
6130             "if (%s%s) {" % (
6131                 sense,
6132                 test_result))
6133         if uses_temp:
6134             code.funcstate.release_temp(test_result)
6135         self.operand1.generate_disposal_code(code)
6136         self.operand2.generate_evaluation_code(code)
6137         self.allocate_temp_result(code)
6138         self.operand2.make_owned_reference(code)
6139         code.putln("%s = %s;" % (self.result(), self.operand2.result()))
6140         self.operand2.generate_post_assignment_code(code)
6141         self.operand2.free_temps(code)
6142         code.putln("} else {")
6143         self.operand1.make_owned_reference(code)
6144         code.putln("%s = %s;" % (self.result(), self.operand1.result()))
6145         self.operand1.generate_post_assignment_code(code)
6146         self.operand1.free_temps(code)
6147         code.putln("}")
6148     
6149     def generate_operand1_test(self, code):
6150         #  Generate code to test the truth of the first operand.
6151         if self.type.is_pyobject:
6152             test_result = code.funcstate.allocate_temp(PyrexTypes.c_bint_type,
6153                                                        manage_ref=False)
6154             code.putln(
6155                 "%s = __Pyx_PyObject_IsTrue(%s); %s" % (
6156                     test_result,
6157                     self.operand1.py_result(),
6158                     code.error_goto_if_neg(test_result, self.pos)))
6159         else:
6160             test_result = self.operand1.result()
6161         return (test_result, self.type.is_pyobject)
6162
6163
6164 class CondExprNode(ExprNode):
6165     #  Short-circuiting conditional expression.
6166     #
6167     #  test        ExprNode
6168     #  true_val    ExprNode
6169     #  false_val   ExprNode
6170     
6171     true_val = None
6172     false_val = None
6173     
6174     subexprs = ['test', 'true_val', 'false_val']
6175     
6176     def type_dependencies(self, env):
6177         return self.true_val.type_dependencies(env) + self.false_val.type_dependencies(env)
6178     
6179     def infer_type(self, env):
6180         return PyrexTypes.independent_spanning_type(self.true_val.infer_type(env),
6181                                                     self.false_val.infer_type(env))
6182
6183     def calculate_constant_result(self):
6184         if self.test.constant_result:
6185             self.constant_result = self.true_val.constant_result
6186         else:
6187             self.constant_result = self.false_val.constant_result
6188
6189     def analyse_types(self, env):
6190         self.test.analyse_types(env)
6191         self.test = self.test.coerce_to_boolean(env)
6192         self.true_val.analyse_types(env)
6193         self.false_val.analyse_types(env)
6194         self.type = PyrexTypes.independent_spanning_type(self.true_val.type, self.false_val.type)
6195         if self.true_val.type.is_pyobject or self.false_val.type.is_pyobject:
6196             self.true_val = self.true_val.coerce_to(self.type, env)
6197             self.false_val = self.false_val.coerce_to(self.type, env)
6198         self.is_temp = 1
6199         if self.type == PyrexTypes.error_type:
6200             self.type_error()
6201         
6202     def type_error(self):
6203         if not (self.true_val.type.is_error or self.false_val.type.is_error):
6204             error(self.pos, "Incompatable types in conditional expression (%s; %s)" %
6205                 (self.true_val.type, self.false_val.type))
6206         self.type = PyrexTypes.error_type
6207     
6208     def check_const(self):
6209         return (self.test.check_const() 
6210             and self.true_val.check_const()
6211             and self.false_val.check_const())
6212     
6213     def generate_evaluation_code(self, code):
6214         # Because subexprs may not be evaluated we can use a more optimal
6215         # subexpr allocation strategy than the default, so override evaluation_code.
6216         
6217         code.mark_pos(self.pos)
6218         self.allocate_temp_result(code)
6219         self.test.generate_evaluation_code(code)
6220         code.putln("if (%s) {" % self.test.result() )
6221         self.eval_and_get(code, self.true_val)
6222         code.putln("} else {")
6223         self.eval_and_get(code, self.false_val)
6224         code.putln("}")
6225         self.test.generate_disposal_code(code)
6226         self.test.free_temps(code)
6227
6228     def eval_and_get(self, code, expr):
6229         expr.generate_evaluation_code(code)
6230         expr.make_owned_reference(code)
6231         code.putln("%s = %s;" % (self.result(), expr.result()))
6232         expr.generate_post_assignment_code(code)
6233         expr.free_temps(code)
6234
6235 richcmp_constants = {
6236     "<" : "Py_LT",
6237     "<=": "Py_LE",
6238     "==": "Py_EQ",
6239     "!=": "Py_NE",
6240     "<>": "Py_NE",
6241     ">" : "Py_GT",
6242     ">=": "Py_GE",
6243 }
6244
6245 class CmpNode(object):
6246     #  Mixin class containing code common to PrimaryCmpNodes
6247     #  and CascadedCmpNodes.
6248
6249     special_bool_cmp_function = None
6250
6251     def infer_type(self, env):
6252         # TODO: Actually implement this (after merging with -unstable).
6253         return py_object_type
6254
6255     def calculate_cascaded_constant_result(self, operand1_result):
6256         func = compile_time_binary_operators[self.operator]
6257         operand2_result = self.operand2.constant_result
6258         result = func(operand1_result, operand2_result)
6259         if self.cascade:
6260             self.cascade.calculate_cascaded_constant_result(operand2_result)
6261             if self.cascade.constant_result:
6262                 self.constant_result = result and self.cascade.constant_result
6263         else:
6264             self.constant_result = result
6265
6266     def cascaded_compile_time_value(self, operand1, denv):
6267         func = get_compile_time_binop(self)
6268         operand2 = self.operand2.compile_time_value(denv)
6269         try:
6270             result = func(operand1, operand2)
6271         except Exception, e:
6272             self.compile_time_value_error(e)
6273             result = None
6274         if result:
6275             cascade = self.cascade
6276             if cascade:
6277                 # FIXME: I bet this must call cascaded_compile_time_value()
6278                 result = result and cascade.cascaded_compile_time_value(operand2, denv)
6279         return result
6280
6281     def is_cpp_comparison(self):
6282         return self.operand1.type.is_cpp_class or self.operand2.type.is_cpp_class
6283
6284     def find_common_int_type(self, env, op, operand1, operand2):
6285         # type1 != type2 and at least one of the types is not a C int
6286         type1 = operand1.type
6287         type2 = operand2.type
6288         type1_can_be_int = False
6289         type2_can_be_int = False
6290
6291         if isinstance(operand1, (StringNode, BytesNode, UnicodeNode)) \
6292                and operand1.can_coerce_to_char_literal():
6293             type1_can_be_int = True
6294         if isinstance(operand2, (StringNode, BytesNode, UnicodeNode)) \
6295                  and operand2.can_coerce_to_char_literal():
6296             type2_can_be_int = True
6297
6298         if type1.is_int:
6299             if type2_can_be_int:
6300                 return type1
6301         elif type2.is_int:
6302             if type1_can_be_int:
6303                 return type2
6304         elif type1_can_be_int:
6305             if type2_can_be_int:
6306                 return PyrexTypes.c_uchar_type
6307
6308         return None
6309
6310     def find_common_type(self, env, op, operand1, common_type=None):
6311         operand2 = self.operand2
6312         type1 = operand1.type
6313         type2 = operand2.type
6314
6315         new_common_type = None
6316
6317         # catch general errors
6318         if type1 == str_type and (type2.is_string or type2 in (bytes_type, unicode_type)) or \
6319                type2 == str_type and (type1.is_string or type1 in (bytes_type, unicode_type)):
6320             error(self.pos, "Comparisons between bytes/unicode and str are not portable to Python 3")
6321             new_common_type = error_type
6322
6323         # try to use numeric comparisons where possible
6324         elif type1.is_complex or type2.is_complex:
6325             if op not in ('==', '!='):
6326                 error(self.pos, "complex types are unordered")
6327                 new_common_type = error_type
6328             if type1.is_pyobject:
6329                 new_common_type = type1
6330             elif type2.is_pyobject:
6331                 new_common_type = type2
6332             else:
6333                 new_common_type = PyrexTypes.widest_numeric_type(type1, type2)
6334         elif type1.is_numeric and type2.is_numeric:
6335             new_common_type = PyrexTypes.widest_numeric_type(type1, type2)
6336         elif common_type is None or not common_type.is_pyobject:
6337             new_common_type = self.find_common_int_type(env, op, operand1, operand2)
6338
6339         if new_common_type is None:
6340             # fall back to generic type compatibility tests
6341             if type1 == type2:
6342                 new_common_type = type1
6343             elif type1.is_pyobject or type2.is_pyobject:
6344                 if type2.is_numeric or type2.is_string:
6345                     if operand2.check_for_coercion_error(type1):
6346                         new_common_type = error_type
6347                     else:
6348                         new_common_type = py_object_type
6349                 elif type1.is_numeric or type1.is_string:
6350                     if operand1.check_for_coercion_error(type2):
6351                         new_common_type = error_type
6352                     else:
6353                         new_common_type = py_object_type
6354                 elif py_object_type.assignable_from(type1) and py_object_type.assignable_from(type2):
6355                     new_common_type = py_object_type
6356                 else:
6357                     # one Python type and one non-Python type, not assignable
6358                     self.invalid_types_error(operand1, op, operand2)
6359                     new_common_type = error_type
6360             elif type1.assignable_from(type2):
6361                 new_common_type = type1
6362             elif type2.assignable_from(type1):
6363                 new_common_type = type2
6364             else:
6365                 # C types that we couldn't handle up to here are an error
6366                 self.invalid_types_error(operand1, op, operand2)
6367                 new_common_type = error_type
6368
6369         if new_common_type.is_string and (isinstance(operand1, BytesNode) or
6370                                           isinstance(operand2, BytesNode)):
6371             # special case when comparing char* to bytes literal: must
6372             # compare string values!
6373             new_common_type = bytes_type
6374
6375         # recursively merge types
6376         if common_type is None or new_common_type.is_error:
6377             common_type = new_common_type
6378         else:
6379             # we could do a lot better by splitting the comparison
6380             # into a non-Python part and a Python part, but this is
6381             # safer for now
6382             common_type = PyrexTypes.spanning_type(common_type, new_common_type)
6383
6384         if self.cascade:
6385             common_type = self.cascade.find_common_type(env, self.operator, operand2, common_type)
6386
6387         return common_type
6388
6389     def invalid_types_error(self, operand1, op, operand2):
6390         error(self.pos, "Invalid types for '%s' (%s, %s)" %
6391               (op, operand1.type, operand2.type))
6392
6393     def is_python_comparison(self):
6394         return (not self.is_ptr_contains()
6395             and not self.is_c_string_contains()
6396             and (self.has_python_operands()
6397                  or (self.cascade and self.cascade.is_python_comparison())
6398                  or self.operator in ('in', 'not_in')))
6399
6400     def coerce_operands_to(self, dst_type, env):
6401         operand2 = self.operand2
6402         if operand2.type != dst_type:
6403             self.operand2 = operand2.coerce_to(dst_type, env)
6404         if self.cascade:
6405             self.cascade.coerce_operands_to(dst_type, env)
6406
6407     def is_python_result(self):
6408         return ((self.has_python_operands() and
6409                  self.special_bool_cmp_function is None and
6410                  self.operator not in ('is', 'is_not', 'in', 'not_in') and
6411                  not self.is_c_string_contains() and
6412                  not self.is_ptr_contains())
6413             or (self.cascade and self.cascade.is_python_result()))
6414
6415     def is_c_string_contains(self):
6416         return self.operator in ('in', 'not_in') and \
6417                ((self.operand1.type.is_int
6418                  and (self.operand2.type.is_string or self.operand2.type is bytes_type)) or
6419                 (self.operand1.type is PyrexTypes.c_py_unicode_type
6420                  and self.operand2.type is unicode_type))
6421     
6422     def is_ptr_contains(self):
6423         if self.operator in ('in', 'not_in'):
6424             container_type = self.operand2.type
6425             return (container_type.is_ptr or container_type.is_array) \
6426                 and not container_type.is_string
6427
6428     def find_special_bool_compare_function(self, env):
6429         if self.operator in ('==', '!='):
6430             type1, type2 = self.operand1.type, self.operand2.type
6431             if type1.is_pyobject and type2.is_pyobject:
6432                 if type1 is Builtin.unicode_type or type2 is Builtin.unicode_type:
6433                     env.use_utility_code(pyunicode_equals_utility_code)
6434                     self.special_bool_cmp_function = "__Pyx_PyUnicode_Equals"
6435                     return True
6436         return False
6437
6438     def generate_operation_code(self, code, result_code, 
6439             operand1, op , operand2):
6440         if self.type.is_pyobject:
6441             coerce_result = "__Pyx_PyBool_FromLong"
6442         else:
6443             coerce_result = ""
6444         if 'not' in op: 
6445             negation = "!"
6446         else: 
6447             negation = ""
6448         if self.special_bool_cmp_function:
6449             if operand1.type.is_pyobject:
6450                 result1 = operand1.py_result()
6451             else:
6452                 result1 = operand1.result()
6453             if operand2.type.is_pyobject:
6454                 result2 = operand2.py_result()
6455             else:
6456                 result2 = operand2.result()
6457             code.putln("%s = %s(%s, %s, %s); %s" % (
6458                 result_code,
6459                 self.special_bool_cmp_function,
6460                 result1,
6461                 result2,
6462                 richcmp_constants[op],
6463                 code.error_goto_if_neg(result_code, self.pos)))
6464         elif op == 'in' or op == 'not_in':
6465             code.globalstate.use_utility_code(contains_utility_code)
6466             if self.type.is_pyobject:
6467                 coerce_result = "__Pyx_PyBoolOrNull_FromLong"
6468             if op == 'not_in':
6469                 negation = "__Pyx_NegateNonNeg"
6470             if operand2.type is dict_type:
6471                 method = "PyDict_Contains"
6472             else:
6473                 method = "PySequence_Contains"
6474             if self.type.is_pyobject:
6475                 error_clause = code.error_goto_if_null
6476                 got_ref = "__Pyx_XGOTREF(%s); " % result_code
6477             else:
6478                 error_clause = code.error_goto_if_neg
6479                 got_ref = ""
6480             code.putln(
6481                 "%s = %s(%s(%s(%s, %s))); %s%s" % (
6482                     result_code,
6483                     coerce_result,
6484                     negation,
6485                     method,
6486                     operand2.py_result(), 
6487                     operand1.py_result(), 
6488                     got_ref,
6489                     error_clause(result_code, self.pos)))
6490         elif (operand1.type.is_pyobject
6491             and op not in ('is', 'is_not')):
6492                 code.putln("%s = PyObject_RichCompare(%s, %s, %s); %s" % (
6493                         result_code, 
6494                         operand1.py_result(), 
6495                         operand2.py_result(), 
6496                         richcmp_constants[op],
6497                         code.error_goto_if_null(result_code, self.pos)))
6498                 code.put_gotref(result_code)
6499         elif operand1.type.is_complex:
6500             if op == "!=": 
6501                 negation = "!"
6502             else: 
6503                 negation = ""
6504             code.putln("%s = %s(%s%s(%s, %s));" % (
6505                 result_code, 
6506                 coerce_result,
6507                 negation,
6508                 operand1.type.unary_op('eq'), 
6509                 operand1.result(), 
6510                 operand2.result()))
6511         else:
6512             type1 = operand1.type
6513             type2 = operand2.type
6514             if (type1.is_extension_type or type2.is_extension_type) \
6515                     and not type1.same_as(type2):
6516                 common_type = py_object_type
6517             elif type1.is_numeric:
6518                 common_type = PyrexTypes.widest_numeric_type(type1, type2)
6519             else:
6520                 common_type = type1
6521             code1 = operand1.result_as(common_type)
6522             code2 = operand2.result_as(common_type)
6523             code.putln("%s = %s(%s %s %s);" % (
6524                 result_code, 
6525                 coerce_result, 
6526                 code1, 
6527                 self.c_operator(op), 
6528                 code2))
6529
6530     def c_operator(self, op):
6531         if op == 'is':
6532             return "=="
6533         elif op == 'is_not':
6534             return "!="
6535         else:
6536             return op
6537     
6538 contains_utility_code = UtilityCode(
6539 proto="""
6540 static CYTHON_INLINE long __Pyx_NegateNonNeg(long b) { return unlikely(b < 0) ? b : !b; }
6541 static CYTHON_INLINE PyObject* __Pyx_PyBoolOrNull_FromLong(long b) {
6542     return unlikely(b < 0) ? NULL : __Pyx_PyBool_FromLong(b);
6543 }
6544 """)
6545
6546 char_in_bytes_utility_code = UtilityCode(
6547 proto="""
6548 static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character); /*proto*/
6549 """,
6550 impl="""
6551 static CYTHON_INLINE int __Pyx_BytesContains(PyObject* bytes, char character) {
6552     const Py_ssize_t length = PyBytes_GET_SIZE(bytes);
6553     char* char_start = PyBytes_AS_STRING(bytes);
6554     char* pos;
6555     for (pos=char_start; pos < char_start+length; pos++) {
6556         if (character == pos[0]) return 1;
6557     }
6558     return 0;
6559 }
6560 """)
6561
6562 pyunicode_in_unicode_utility_code = UtilityCode(
6563 proto="""
6564 static CYTHON_INLINE int __Pyx_UnicodeContains(PyObject* unicode, Py_UNICODE character); /*proto*/
6565 """,
6566 impl="""
6567 static CYTHON_INLINE int __Pyx_UnicodeContains(PyObject* unicode, Py_UNICODE character) {
6568     const Py_ssize_t length = PyUnicode_GET_SIZE(unicode);
6569     Py_UNICODE* char_start = PyUnicode_AS_UNICODE(unicode);
6570     Py_UNICODE* pos;
6571     for (pos=char_start; pos < char_start+length; pos++) {
6572         if (character == pos[0]) return 1;
6573     }
6574     return 0;
6575 }
6576 """)
6577
6578 pyunicode_equals_utility_code = UtilityCode(
6579 proto="""
6580 static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); /*proto*/
6581 """,
6582 impl="""
6583 static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
6584     if (s1 == s2) {   /* as done by PyObject_RichCompareBool(); also catches the (interned) empty string */
6585         return (equals == Py_EQ);
6586     } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
6587         if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
6588             return (equals == Py_NE);
6589         } else if (PyUnicode_GET_SIZE(s1) == 1) {
6590             if (equals == Py_EQ)
6591                 return (PyUnicode_AS_UNICODE(s1)[0] == PyUnicode_AS_UNICODE(s2)[0]);
6592             else
6593                 return (PyUnicode_AS_UNICODE(s1)[0] != PyUnicode_AS_UNICODE(s2)[0]);
6594         } else {
6595             int result = PyUnicode_Compare(s1, s2);
6596             if ((result == -1) && unlikely(PyErr_Occurred()))
6597                 return -1;
6598             return (equals == Py_EQ) ? (result == 0) : (result != 0);
6599         }
6600     } else if ((s1 == Py_None) & (s2 == Py_None)) {
6601         return (equals == Py_EQ);
6602     } else if ((s1 == Py_None) & PyUnicode_CheckExact(s2)) {
6603         return (equals == Py_NE);
6604     } else if ((s2 == Py_None) & PyUnicode_CheckExact(s1)) {
6605         return (equals == Py_NE);
6606     } else {
6607         int result;
6608         PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
6609         if (!py_result)
6610             return -1;
6611         result = __Pyx_PyObject_IsTrue(py_result);
6612         Py_DECREF(py_result);
6613         return result;
6614     }
6615 }
6616 """)
6617
6618
6619 class PrimaryCmpNode(ExprNode, CmpNode):
6620     #  Non-cascaded comparison or first comparison of
6621     #  a cascaded sequence.
6622     #
6623     #  operator      string
6624     #  operand1      ExprNode
6625     #  operand2      ExprNode
6626     #  cascade       CascadedCmpNode
6627     
6628     #  We don't use the subexprs mechanism, because
6629     #  things here are too complicated for it to handle.
6630     #  Instead, we override all the framework methods
6631     #  which use it.
6632     
6633     child_attrs = ['operand1', 'operand2', 'cascade']
6634     
6635     cascade = None
6636
6637     def infer_type(self, env):
6638         # TODO: Actually implement this (after merging with -unstable).
6639         return py_object_type
6640
6641     def type_dependencies(self, env):
6642         return ()
6643
6644     def calculate_constant_result(self):
6645         self.calculate_cascaded_constant_result(self.operand1.constant_result)
6646     
6647     def compile_time_value(self, denv):
6648         operand1 = self.operand1.compile_time_value(denv)
6649         return self.cascaded_compile_time_value(operand1, denv)
6650
6651     def analyse_types(self, env):
6652         self.operand1.analyse_types(env)
6653         self.operand2.analyse_types(env)
6654         if self.is_cpp_comparison():
6655             self.analyse_cpp_comparison(env)
6656             if self.cascade:
6657                 error(self.pos, "Cascading comparison not yet supported for cpp types.")
6658             return
6659         if self.cascade:
6660             self.cascade.analyse_types(env)
6661
6662         if self.operator in ('in', 'not_in'):
6663             if self.is_c_string_contains():
6664                 self.is_pycmp = False
6665                 common_type = None
6666                 if self.cascade:
6667                     error(self.pos, "Cascading comparison not yet supported for 'int_val in string'.")
6668                     return
6669                 if self.operand2.type is unicode_type:
6670                     env.use_utility_code(pyunicode_in_unicode_utility_code)
6671                 else:
6672                     if self.operand1.type is PyrexTypes.c_uchar_type:
6673                         self.operand1 = self.operand1.coerce_to(PyrexTypes.c_char_type, env)
6674                     if self.operand2.type is not bytes_type:
6675                         self.operand2 = self.operand2.coerce_to(bytes_type, env)
6676                     env.use_utility_code(char_in_bytes_utility_code)
6677                 self.operand2 = self.operand2.as_none_safe_node(
6678                     "argument of type 'NoneType' is not iterable")
6679             elif self.is_ptr_contains():
6680                 if self.cascade:
6681                     error(self.pos, "Cascading comparison not yet supported for 'val in sliced pointer'.")
6682                 self.type = PyrexTypes.c_bint_type
6683                 # Will be transformed by IterationTransform
6684                 return
6685             else:
6686                 if self.operand2.type is dict_type:
6687                     self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
6688                 common_type = py_object_type
6689                 self.is_pycmp = True
6690         elif self.find_special_bool_compare_function(env):
6691             common_type = None # if coercion needed, the method call above has already done it
6692             self.is_pycmp = False # result is bint
6693             self.is_temp = True # must check for error return
6694         else:
6695             common_type = self.find_common_type(env, self.operator, self.operand1)
6696             self.is_pycmp = common_type.is_pyobject
6697
6698         if common_type is not None and not common_type.is_error:
6699             if self.operand1.type != common_type:
6700                 self.operand1 = self.operand1.coerce_to(common_type, env)
6701             self.coerce_operands_to(common_type, env)
6702
6703         if self.cascade:
6704             self.operand2 = self.operand2.coerce_to_simple(env)
6705             self.cascade.coerce_cascaded_operands_to_temp(env)
6706         if self.is_python_result():
6707             self.type = PyrexTypes.py_object_type
6708         else:
6709             self.type = PyrexTypes.c_bint_type
6710         cdr = self.cascade
6711         while cdr:
6712             cdr.type = self.type
6713             cdr = cdr.cascade
6714         if self.is_pycmp or self.cascade:
6715             self.is_temp = 1
6716     
6717     def analyse_cpp_comparison(self, env):
6718         type1 = self.operand1.type
6719         type2 = self.operand2.type
6720         entry = env.lookup_operator(self.operator, [self.operand1, self.operand2])
6721         if entry is None:
6722             error(self.pos, "Invalid types for '%s' (%s, %s)" %
6723                 (self.operator, type1, type2))
6724             self.type = PyrexTypes.error_type
6725             self.result_code = "<error>"
6726             return
6727         func_type = entry.type
6728         if func_type.is_ptr:
6729             func_type = func_type.base_type
6730         if len(func_type.args) == 1:
6731             self.operand2 = self.operand2.coerce_to(func_type.args[0].type, env)
6732         else:
6733             self.operand1 = self.operand1.coerce_to(func_type.args[0].type, env)
6734             self.operand2 = self.operand2.coerce_to(func_type.args[1].type, env)
6735         self.type = func_type.return_type
6736     
6737     def has_python_operands(self):
6738         return (self.operand1.type.is_pyobject
6739             or self.operand2.type.is_pyobject)
6740     
6741     def check_const(self):
6742         if self.cascade:
6743             self.not_const()
6744             return False
6745         else:
6746             return self.operand1.check_const() and self.operand2.check_const()
6747
6748     def calculate_result_code(self):
6749         if self.operand1.type.is_complex:
6750             if self.operator == "!=":
6751                 negation = "!"
6752             else:
6753                 negation = ""
6754             return "(%s%s(%s, %s))" % (
6755                 negation,
6756                 self.operand1.type.binary_op('=='), 
6757                 self.operand1.result(), 
6758                 self.operand2.result())
6759         elif self.is_c_string_contains():
6760             if self.operand2.type is bytes_type:
6761                 method = "__Pyx_BytesContains"
6762             else:
6763                 method = "__Pyx_UnicodeContains"
6764             if self.operator == "not_in":
6765                 negation = "!"
6766             else:
6767                 negation = ""
6768             return "(%s%s(%s, %s))" % (
6769                 negation,
6770                 method,
6771                 self.operand2.result(), 
6772                 self.operand1.result())
6773         else:
6774             return "(%s %s %s)" % (
6775                 self.operand1.result(),
6776                 self.c_operator(self.operator),
6777                 self.operand2.result())
6778
6779     def generate_evaluation_code(self, code):
6780         self.operand1.generate_evaluation_code(code)
6781         self.operand2.generate_evaluation_code(code)
6782         if self.is_temp:
6783             self.allocate_temp_result(code)
6784             self.generate_operation_code(code, self.result(), 
6785                 self.operand1, self.operator, self.operand2)
6786             if self.cascade:
6787                 self.cascade.generate_evaluation_code(code,
6788                     self.result(), self.operand2)
6789             self.operand1.generate_disposal_code(code)
6790             self.operand1.free_temps(code)
6791             self.operand2.generate_disposal_code(code)
6792             self.operand2.free_temps(code)
6793
6794     def generate_subexpr_disposal_code(self, code):
6795         #  If this is called, it is a non-cascaded cmp,
6796         #  so only need to dispose of the two main operands.
6797         self.operand1.generate_disposal_code(code)
6798         self.operand2.generate_disposal_code(code)
6799         
6800     def free_subexpr_temps(self, code):
6801         #  If this is called, it is a non-cascaded cmp,
6802         #  so only need to dispose of the two main operands.
6803         self.operand1.free_temps(code)
6804         self.operand2.free_temps(code)
6805         
6806     def annotate(self, code):
6807         self.operand1.annotate(code)
6808         self.operand2.annotate(code)
6809         if self.cascade:
6810             self.cascade.annotate(code)
6811
6812
6813 class CascadedCmpNode(Node, CmpNode):
6814     #  A CascadedCmpNode is not a complete expression node. It 
6815     #  hangs off the side of another comparison node, shares 
6816     #  its left operand with that node, and shares its result 
6817     #  with the PrimaryCmpNode at the head of the chain.
6818     #
6819     #  operator      string
6820     #  operand2      ExprNode
6821     #  cascade       CascadedCmpNode
6822
6823     child_attrs = ['operand2', 'cascade']
6824
6825     cascade = None
6826     constant_result = constant_value_not_set # FIXME: where to calculate this?
6827
6828     def infer_type(self, env):
6829         # TODO: Actually implement this (after merging with -unstable).
6830         return py_object_type
6831
6832     def type_dependencies(self, env):
6833         return ()
6834
6835     def has_constant_result(self):
6836         return self.constant_result is not constant_value_not_set and \
6837                self.constant_result is not not_a_constant
6838
6839     def analyse_types(self, env):
6840         self.operand2.analyse_types(env)
6841         if self.cascade:
6842             self.cascade.analyse_types(env)
6843
6844     def has_python_operands(self):
6845         return self.operand2.type.is_pyobject
6846         
6847     def coerce_operands_to_pyobjects(self, env):
6848         self.operand2 = self.operand2.coerce_to_pyobject(env)
6849         if self.operand2.type is dict_type and self.operator in ('in', 'not_in'):
6850             self.operand2 = self.operand2.as_none_safe_node("'NoneType' object is not iterable")
6851         if self.cascade:
6852             self.cascade.coerce_operands_to_pyobjects(env)
6853
6854     def coerce_cascaded_operands_to_temp(self, env):
6855         if self.cascade:
6856             #self.operand2 = self.operand2.coerce_to_temp(env) #CTT
6857             self.operand2 = self.operand2.coerce_to_simple(env)
6858             self.cascade.coerce_cascaded_operands_to_temp(env)
6859     
6860     def generate_evaluation_code(self, code, result, operand1):
6861         if self.type.is_pyobject:
6862             code.putln("if (__Pyx_PyObject_IsTrue(%s)) {" % result)
6863             code.put_decref(result, self.type)
6864         else:
6865             code.putln("if (%s) {" % result)
6866         self.operand2.generate_evaluation_code(code)
6867         self.generate_operation_code(code, result, 
6868             operand1, self.operator, self.operand2)
6869         if self.cascade:
6870             self.cascade.generate_evaluation_code(
6871                 code, result, self.operand2)
6872         # Cascaded cmp result is always temp
6873         self.operand2.generate_disposal_code(code)
6874         self.operand2.free_temps(code)
6875         code.putln("}")
6876
6877     def annotate(self, code):
6878         self.operand2.annotate(code)
6879         if self.cascade:
6880             self.cascade.annotate(code)
6881
6882
6883 binop_node_classes = {
6884     "or":       BoolBinopNode,
6885     "and":      BoolBinopNode,
6886     "|":        IntBinopNode,
6887     "^":        IntBinopNode,
6888     "&":        IntBinopNode,
6889     "<<":       IntBinopNode,
6890     ">>":       IntBinopNode,
6891     "+":        AddNode,
6892     "-":        SubNode,
6893     "*":        MulNode,
6894     "/":        DivNode,
6895     "//":       DivNode,
6896     "%":        ModNode,
6897     "**":       PowNode
6898 }
6899
6900 def binop_node(pos, operator, operand1, operand2, inplace=False):
6901     # Construct binop node of appropriate class for 
6902     # given operator.
6903     return binop_node_classes[operator](pos, 
6904         operator = operator, 
6905         operand1 = operand1, 
6906         operand2 = operand2,
6907         inplace = inplace)
6908
6909 #-------------------------------------------------------------------
6910 #
6911 #  Coercion nodes
6912 #
6913 #  Coercion nodes are special in that they are created during
6914 #  the analyse_types phase of parse tree processing.
6915 #  Their __init__ methods consequently incorporate some aspects
6916 #  of that phase.
6917 #
6918 #-------------------------------------------------------------------
6919
6920 class CoercionNode(ExprNode):
6921     #  Abstract base class for coercion nodes.
6922     #
6923     #  arg       ExprNode       node being coerced
6924     
6925     subexprs = ['arg']
6926     constant_result = not_a_constant
6927     
6928     def __init__(self, arg):
6929         self.pos = arg.pos
6930         self.arg = arg
6931         if debug_coercion:
6932             print("%s Coercing %s" % (self, self.arg))
6933
6934     def calculate_constant_result(self):
6935         # constant folding can break type coercion, so this is disabled
6936         pass
6937             
6938     def annotate(self, code):
6939         self.arg.annotate(code)
6940         if self.arg.type != self.type:
6941             file, line, col = self.pos
6942             code.annotate((file, line, col-1), AnnotationItem(style='coerce', tag='coerce', text='[%s] to [%s]' % (self.arg.type, self.type)))
6943
6944
6945 class CastNode(CoercionNode):
6946     #  Wrap a node in a C type cast.
6947     
6948     def __init__(self, arg, new_type):
6949         CoercionNode.__init__(self, arg)
6950         self.type = new_type
6951
6952     def may_be_none(self):
6953         return self.arg.may_be_none()
6954     
6955     def calculate_result_code(self):
6956         return self.arg.result_as(self.type)
6957
6958     def generate_result_code(self, code):
6959         self.arg.generate_result_code(code)
6960
6961
6962 class PyTypeTestNode(CoercionNode):
6963     #  This node is used to check that a generic Python
6964     #  object is an instance of a particular extension type.
6965     #  This node borrows the result of its argument node.
6966
6967     def __init__(self, arg, dst_type, env, notnone=False):
6968         #  The arg is know to be a Python object, and
6969         #  the dst_type is known to be an extension type.
6970         assert dst_type.is_extension_type or dst_type.is_builtin_type, "PyTypeTest on non extension type"
6971         CoercionNode.__init__(self, arg)
6972         self.type = dst_type
6973         self.result_ctype = arg.ctype()
6974         self.notnone = notnone
6975
6976     nogil_check = Node.gil_error
6977     gil_message = "Python type test"
6978     
6979     def analyse_types(self, env):
6980         pass
6981
6982     def may_be_none(self):
6983         if self.notnone:
6984             return False
6985         return self.arg.may_be_none()
6986     
6987     def result_in_temp(self):
6988         return self.arg.result_in_temp()
6989     
6990     def is_ephemeral(self):
6991         return self.arg.is_ephemeral()
6992
6993     def calculate_constant_result(self):
6994         # FIXME
6995         pass
6996
6997     def calculate_result_code(self):
6998         return self.arg.result()
6999     
7000     def generate_result_code(self, code):
7001         if self.type.typeobj_is_available():
7002             if not self.type.is_builtin_type:
7003                 code.globalstate.use_utility_code(type_test_utility_code)
7004             code.putln(
7005                 "if (!(%s)) %s" % (
7006                     self.type.type_test_code(self.arg.py_result(), self.notnone),
7007                     code.error_goto(self.pos)))
7008         else:
7009             error(self.pos, "Cannot test type of extern C class "
7010                 "without type object name specification")
7011                 
7012     def generate_post_assignment_code(self, code):
7013         self.arg.generate_post_assignment_code(code)
7014
7015     def free_temps(self, code):
7016         self.arg.free_temps(code)
7017
7018
7019 class NoneCheckNode(CoercionNode):
7020     # This node is used to check that a Python object is not None and
7021     # raises an appropriate exception (as specified by the creating
7022     # transform).
7023
7024     def __init__(self, arg, exception_type_cname, exception_message):
7025         CoercionNode.__init__(self, arg)
7026         self.type = arg.type
7027         self.result_ctype = arg.ctype()
7028         self.exception_type_cname = exception_type_cname
7029         self.exception_message = exception_message
7030
7031     def analyse_types(self, env):
7032         pass
7033
7034     def may_be_none(self):
7035         return False
7036
7037     def result_in_temp(self):
7038         return self.arg.result_in_temp()
7039
7040     def calculate_result_code(self):
7041         return self.arg.result()
7042     
7043     def generate_result_code(self, code):
7044         code.putln(
7045             "if (unlikely(%s == Py_None)) {" % self.arg.result())
7046         code.putln('PyErr_SetString(%s, "%s"); %s ' % (
7047             self.exception_type_cname,
7048             StringEncoding.escape_byte_string(
7049                 self.exception_message.encode('UTF-8')),
7050             code.error_goto(self.pos)))
7051         code.putln("}")
7052
7053     def generate_post_assignment_code(self, code):
7054         self.arg.generate_post_assignment_code(code)
7055
7056     def free_temps(self, code):
7057         self.arg.free_temps(code)
7058
7059
7060 class CoerceToPyTypeNode(CoercionNode):
7061     #  This node is used to convert a C data type
7062     #  to a Python object.
7063     
7064     type = py_object_type
7065     is_temp = 1
7066
7067     def __init__(self, arg, env, type=py_object_type):
7068         CoercionNode.__init__(self, arg)
7069         if not arg.type.create_to_py_utility_code(env):
7070             error(arg.pos,
7071                   "Cannot convert '%s' to Python object" % arg.type)
7072         if type is not py_object_type:
7073             self.type = py_object_type
7074         elif arg.type.is_string:
7075             self.type = bytes_type
7076         elif arg.type is PyrexTypes.c_py_unicode_type:
7077             self.type = unicode_type
7078
7079     gil_message = "Converting to Python object"
7080
7081     def may_be_none(self):
7082         # FIXME: is this always safe?
7083         return False
7084
7085     def coerce_to_boolean(self, env):
7086         arg_type = self.arg.type
7087         if (arg_type == PyrexTypes.c_bint_type or
7088             (arg_type.is_pyobject and arg_type.name == 'bool')):
7089             return self.arg.coerce_to_temp(env)
7090         else:
7091             return CoerceToBooleanNode(self, env)
7092     
7093     def coerce_to_integer(self, env):
7094         # If not already some C integer type, coerce to longint.
7095         if self.arg.type.is_int:
7096             return self.arg
7097         else:
7098             return self.arg.coerce_to(PyrexTypes.c_long_type, env)
7099
7100     def analyse_types(self, env):
7101         # The arg is always already analysed
7102         pass
7103
7104     def generate_result_code(self, code):
7105         function = self.arg.type.to_py_function
7106         code.putln('%s = %s(%s); %s' % (
7107             self.result(), 
7108             function, 
7109             self.arg.result(), 
7110             code.error_goto_if_null(self.result(), self.pos)))
7111         code.put_gotref(self.py_result())
7112
7113
7114 class CoerceIntToBytesNode(CoerceToPyTypeNode):
7115     #  This node is used to convert a C int type to a Python bytes
7116     #  object.
7117
7118     is_temp = 1
7119
7120     def __init__(self, arg, env):
7121         arg = arg.coerce_to_simple(env)
7122         CoercionNode.__init__(self, arg)
7123         self.type = Builtin.bytes_type
7124
7125     def generate_result_code(self, code):
7126         arg = self.arg
7127         arg_result = arg.result()
7128         if arg.type not in (PyrexTypes.c_char_type,
7129                             PyrexTypes.c_uchar_type,
7130                             PyrexTypes.c_schar_type):
7131             if arg.type.signed:
7132                 code.putln("if ((%s < 0) || (%s > 255)) {" % (
7133                     arg_result, arg_result))
7134             else:
7135                 code.putln("if (%s > 255) {" % arg_result)
7136             code.putln('PyErr_Format(PyExc_OverflowError, '
7137                        '"value too large to pack into a byte"); %s' % (
7138                            code.error_goto(self.pos)))
7139             code.putln('}')
7140         temp = None
7141         if arg.type is not PyrexTypes.c_char_type:
7142             temp = code.funcstate.allocate_temp(PyrexTypes.c_char_type, manage_ref=False)
7143             code.putln("%s = (char)%s;" % (temp, arg_result))
7144             arg_result = temp
7145         code.putln('%s = PyBytes_FromStringAndSize(&%s, 1); %s' % (
7146             self.result(),
7147             arg_result,
7148             code.error_goto_if_null(self.result(), self.pos)))
7149         if temp is not None:
7150             code.funcstate.release_temp(temp)
7151         code.put_gotref(self.py_result())
7152
7153
7154 class CoerceFromPyTypeNode(CoercionNode):
7155     #  This node is used to convert a Python object
7156     #  to a C data type.
7157
7158     def __init__(self, result_type, arg, env):
7159         CoercionNode.__init__(self, arg)
7160         self.type = result_type
7161         self.is_temp = 1
7162         if not result_type.create_from_py_utility_code(env):
7163             error(arg.pos,
7164                   "Cannot convert Python object to '%s'" % result_type)
7165         if self.type.is_string and self.arg.is_ephemeral():
7166             error(arg.pos,
7167                   "Obtaining char * from temporary Python value")
7168     
7169     def analyse_types(self, env):
7170         # The arg is always already analysed
7171         pass
7172
7173     def generate_result_code(self, code):
7174         function = self.type.from_py_function
7175         operand = self.arg.py_result()
7176         rhs = "%s(%s)" % (function, operand)
7177         if self.type.is_enum:
7178             rhs = typecast(self.type, c_long_type, rhs)
7179         code.putln('%s = %s; %s' % (
7180             self.result(), 
7181             rhs,
7182             code.error_goto_if(self.type.error_condition(self.result()), self.pos)))
7183         if self.type.is_pyobject:
7184             code.put_gotref(self.py_result())
7185
7186
7187 class CoerceToBooleanNode(CoercionNode):
7188     #  This node is used when a result needs to be used
7189     #  in a boolean context.
7190     
7191     type = PyrexTypes.c_bint_type
7192
7193     _special_builtins = {
7194         Builtin.list_type    : 'PyList_GET_SIZE',
7195         Builtin.tuple_type   : 'PyTuple_GET_SIZE',
7196         Builtin.bytes_type   : 'PyBytes_GET_SIZE',
7197         Builtin.unicode_type : 'PyUnicode_GET_SIZE',
7198         }
7199
7200     def __init__(self, arg, env):
7201         CoercionNode.__init__(self, arg)
7202         if arg.type.is_pyobject:
7203             self.is_temp = 1
7204
7205     def nogil_check(self, env):
7206         if self.arg.type.is_pyobject and self._special_builtins.get(self.arg.type) is None:
7207             self.gil_error()
7208
7209     gil_message = "Truth-testing Python object"
7210     
7211     def check_const(self):
7212         if self.is_temp:
7213             self.not_const()
7214             return False
7215         return self.arg.check_const()
7216     
7217     def calculate_result_code(self):
7218         return "(%s != 0)" % self.arg.result()
7219
7220     def generate_result_code(self, code):
7221         if not self.is_temp:
7222             return
7223         test_func = self._special_builtins.get(self.arg.type)
7224         if test_func is not None:
7225             code.putln("%s = (%s != Py_None) && (%s(%s) != 0);" % (
7226                        self.result(),
7227                        self.arg.py_result(),
7228                        test_func,
7229                        self.arg.py_result()))
7230         else:
7231             code.putln(
7232                 "%s = __Pyx_PyObject_IsTrue(%s); %s" % (
7233                     self.result(), 
7234                     self.arg.py_result(), 
7235                     code.error_goto_if_neg(self.result(), self.pos)))
7236
7237 class CoerceToComplexNode(CoercionNode):
7238
7239     def __init__(self, arg, dst_type, env):
7240         if arg.type.is_complex:
7241             arg = arg.coerce_to_simple(env)
7242         self.type = dst_type
7243         CoercionNode.__init__(self, arg)
7244         dst_type.create_declaration_utility_code(env)
7245
7246     def calculate_result_code(self):
7247         if self.arg.type.is_complex:
7248             real_part = "__Pyx_CREAL(%s)" % self.arg.result()
7249             imag_part = "__Pyx_CIMAG(%s)" % self.arg.result()
7250         else:
7251             real_part = self.arg.result()
7252             imag_part = "0"
7253         return "%s(%s, %s)" % (
7254                 self.type.from_parts,
7255                 real_part,
7256                 imag_part)
7257     
7258     def generate_result_code(self, code):
7259         pass
7260
7261 class CoerceToTempNode(CoercionNode):
7262     #  This node is used to force the result of another node
7263     #  to be stored in a temporary. It is only used if the
7264     #  argument node's result is not already in a temporary.
7265
7266     def __init__(self, arg, env):
7267         CoercionNode.__init__(self, arg)
7268         self.type = self.arg.type
7269         self.constant_result = self.arg.constant_result
7270         self.is_temp = 1
7271         if self.type.is_pyobject:
7272             self.result_ctype = py_object_type
7273
7274     gil_message = "Creating temporary Python reference"
7275
7276     def analyse_types(self, env):
7277         # The arg is always already analysed
7278         pass
7279         
7280     def coerce_to_boolean(self, env):
7281         self.arg = self.arg.coerce_to_boolean(env)
7282         if self.arg.is_simple():
7283             return self.arg
7284         self.type = self.arg.type
7285         self.result_ctype = self.type
7286         return self
7287
7288     def generate_result_code(self, code):
7289         #self.arg.generate_evaluation_code(code) # Already done
7290         # by generic generate_subexpr_evaluation_code!
7291         code.putln("%s = %s;" % (
7292             self.result(), self.arg.result_as(self.ctype())))
7293         if self.type.is_pyobject and self.use_managed_ref:
7294             code.put_incref(self.result(), self.ctype())
7295
7296
7297 class CloneNode(CoercionNode):
7298     #  This node is employed when the result of another node needs
7299     #  to be used multiple times. The argument node's result must
7300     #  be in a temporary. This node "borrows" the result from the
7301     #  argument node, and does not generate any evaluation or
7302     #  disposal code for it. The original owner of the argument 
7303     #  node is responsible for doing those things.
7304     
7305     subexprs = [] # Arg is not considered a subexpr
7306     nogil_check = None
7307     
7308     def __init__(self, arg):
7309         CoercionNode.__init__(self, arg)
7310         if hasattr(arg, 'type'):
7311             self.type = arg.type
7312             self.result_ctype = arg.result_ctype
7313         if hasattr(arg, 'entry'):
7314             self.entry = arg.entry
7315             
7316     def result(self):
7317         return self.arg.result()
7318     
7319     def type_dependencies(self, env):
7320         return self.arg.type_dependencies(env)
7321     
7322     def infer_type(self, env):
7323         return self.arg.infer_type(env)
7324
7325     def analyse_types(self, env):
7326         self.type = self.arg.type
7327         self.result_ctype = self.arg.result_ctype
7328         self.is_temp = 1
7329         if hasattr(self.arg, 'entry'):
7330             self.entry = self.arg.entry
7331     
7332     def generate_evaluation_code(self, code):
7333         pass
7334
7335     def generate_result_code(self, code):
7336         pass
7337         
7338     def generate_disposal_code(self, code):
7339         pass
7340                 
7341     def free_temps(self, code):
7342         pass
7343
7344
7345 class ModuleRefNode(ExprNode):
7346     # Simple returns the module object
7347     
7348     type = py_object_type
7349     is_temp = False
7350     subexprs = []
7351     
7352     def analyse_types(self, env):
7353         pass
7354
7355     def may_be_none(self):
7356         return False
7357
7358     def calculate_result_code(self):
7359         return Naming.module_cname
7360
7361     def generate_result_code(self, code):
7362         pass
7363
7364 class DocstringRefNode(ExprNode):
7365     # Extracts the docstring of the body element
7366     
7367     subexprs = ['body']
7368     type = py_object_type
7369     is_temp = True
7370     
7371     def __init__(self, pos, body):
7372         ExprNode.__init__(self, pos)
7373         assert body.type.is_pyobject
7374         self.body = body
7375
7376     def analyse_types(self, env):
7377         pass
7378
7379     def generate_result_code(self, code):
7380         code.putln('%s = __Pyx_GetAttrString(%s, "__doc__"); %s' % (
7381             self.result(), self.body.result(),
7382             code.error_goto_if_null(self.result(), self.pos)))
7383         code.put_gotref(self.result())
7384
7385
7386
7387 #------------------------------------------------------------------------------------
7388 #
7389 #  Runtime support code
7390 #
7391 #------------------------------------------------------------------------------------
7392
7393 get_name_interned_utility_code = UtilityCode(
7394 proto = """
7395 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/
7396 """,
7397 impl = """
7398 static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) {
7399     PyObject *result;
7400     result = PyObject_GetAttr(dict, name);
7401     if (!result)
7402         PyErr_SetObject(PyExc_NameError, name);
7403     return result;
7404 }
7405 """)
7406
7407 #------------------------------------------------------------------------------------
7408
7409 import_utility_code = UtilityCode(
7410 proto = """
7411 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/
7412 """,
7413 impl = """
7414 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) {
7415     PyObject *py_import = 0;
7416     PyObject *empty_list = 0;
7417     PyObject *module = 0;
7418     PyObject *global_dict = 0;
7419     PyObject *empty_dict = 0;
7420     PyObject *list;
7421     py_import = __Pyx_GetAttrString(%(BUILTINS)s, "__import__");
7422     if (!py_import)
7423         goto bad;
7424     if (from_list)
7425         list = from_list;
7426     else {
7427         empty_list = PyList_New(0);
7428         if (!empty_list)
7429             goto bad;
7430         list = empty_list;
7431     }
7432     global_dict = PyModule_GetDict(%(GLOBALS)s);
7433     if (!global_dict)
7434         goto bad;
7435     empty_dict = PyDict_New();
7436     if (!empty_dict)
7437         goto bad;
7438     module = PyObject_CallFunctionObjArgs(py_import,
7439         name, global_dict, empty_dict, list, NULL);
7440 bad:
7441     Py_XDECREF(empty_list);
7442     Py_XDECREF(py_import);
7443     Py_XDECREF(empty_dict);
7444     return module;
7445 }
7446 """ % {
7447     "BUILTINS": Naming.builtins_cname,
7448     "GLOBALS":  Naming.module_cname,
7449 })
7450
7451 #------------------------------------------------------------------------------------
7452
7453 get_exception_utility_code = UtilityCode(
7454 proto = """
7455 static PyObject *__Pyx_GetExcValue(void); /*proto*/
7456 """,
7457 impl = """
7458 static PyObject *__Pyx_GetExcValue(void) {
7459     PyObject *type = 0, *value = 0, *tb = 0;
7460     PyObject *tmp_type, *tmp_value, *tmp_tb;
7461     PyObject *result = 0;
7462     PyThreadState *tstate = PyThreadState_Get();
7463     PyErr_Fetch(&type, &value, &tb);
7464     PyErr_NormalizeException(&type, &value, &tb);
7465     if (PyErr_Occurred())
7466         goto bad;
7467     if (!value) {
7468         value = Py_None;
7469         Py_INCREF(value);
7470     }
7471     tmp_type = tstate->exc_type;
7472     tmp_value = tstate->exc_value;
7473     tmp_tb = tstate->exc_traceback;
7474     tstate->exc_type = type;
7475     tstate->exc_value = value;
7476     tstate->exc_traceback = tb;
7477     /* Make sure tstate is in a consistent state when we XDECREF
7478     these objects (XDECREF may run arbitrary code). */
7479     Py_XDECREF(tmp_type);
7480     Py_XDECREF(tmp_value);
7481     Py_XDECREF(tmp_tb);
7482     result = value;
7483     Py_XINCREF(result);
7484     type = 0;
7485     value = 0;
7486     tb = 0;
7487 bad:
7488     Py_XDECREF(type);
7489     Py_XDECREF(value);
7490     Py_XDECREF(tb);
7491     return result;
7492 }
7493 """)
7494
7495 #------------------------------------------------------------------------------------
7496
7497 type_test_utility_code = UtilityCode(
7498 proto = """
7499 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/
7500 """,
7501 impl = """
7502 static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
7503     if (unlikely(!type)) {
7504         PyErr_Format(PyExc_SystemError, "Missing type object");
7505         return 0;
7506     }
7507     if (likely(PyObject_TypeCheck(obj, type)))
7508         return 1;
7509     PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
7510                  Py_TYPE(obj)->tp_name, type->tp_name);
7511     return 0;
7512 }
7513 """)
7514
7515 #------------------------------------------------------------------------------------
7516
7517 find_py2_metaclass_utility_code = UtilityCode(
7518 proto = '''
7519 static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases); /*proto*/
7520 ''',
7521 impl = '''
7522 static PyObject *__Pyx_FindPy2Metaclass(PyObject *bases) {
7523     PyObject *metaclass;
7524     /* Default metaclass */
7525 #if PY_MAJOR_VERSION < 3
7526     if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
7527         PyObject *base = PyTuple_GET_ITEM(bases, 0);
7528         metaclass = PyObject_GetAttrString(base, "__class__");
7529         if (!metaclass) {
7530             PyErr_Clear();
7531             metaclass = (PyObject*) Py_TYPE(base);
7532         }
7533     } else {
7534         metaclass = (PyObject *) &PyClass_Type;
7535     }
7536 #else
7537     if (PyTuple_Check(bases) && PyTuple_GET_SIZE(bases) > 0) {
7538         PyObject *base = PyTuple_GET_ITEM(bases, 0);
7539         metaclass = (PyObject*) Py_TYPE(base);
7540     } else {
7541         metaclass = (PyObject *) &PyType_Type;
7542     }
7543 #endif
7544     Py_INCREF(metaclass);
7545     return metaclass;
7546 }
7547 ''')
7548
7549 create_class_utility_code = UtilityCode(
7550 proto = """
7551 static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
7552                                    PyObject *modname); /*proto*/
7553 """,
7554 impl = """
7555 static PyObject *__Pyx_CreateClass(PyObject *bases, PyObject *dict, PyObject *name,
7556                                    PyObject *modname) {
7557     PyObject *result;
7558     PyObject *metaclass;
7559
7560     if (PyDict_SetItemString(dict, "__module__", modname) < 0)
7561         return NULL;
7562
7563     /* Python2 __metaclass__ */
7564     metaclass = PyDict_GetItemString(dict, "__metaclass__");
7565     if (metaclass) {
7566         Py_INCREF(metaclass);
7567     } else {
7568         metaclass = __Pyx_FindPy2Metaclass(bases);
7569     }
7570     result = PyObject_CallFunctionObjArgs(metaclass, name, bases, dict, NULL);
7571     Py_DECREF(metaclass);
7572     return result;
7573 }
7574 """,
7575 requires = [find_py2_metaclass_utility_code])
7576
7577 #------------------------------------------------------------------------------------
7578
7579 create_py3class_utility_code = UtilityCode(
7580 proto = """
7581 static PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw); /*proto*/
7582 static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *mkw, PyObject *modname, PyObject *doc); /*proto*/
7583 static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict, PyObject *mkw); /*proto*/
7584 """,
7585 impl = """
7586 PyObject *__Pyx_Py3MetaclassGet(PyObject *bases, PyObject *mkw) {
7587     PyObject *metaclass = PyDict_GetItemString(mkw, "metaclass");
7588     if (metaclass) {
7589         Py_INCREF(metaclass);
7590         if (PyDict_DelItemString(mkw, "metaclass") < 0) {
7591             Py_DECREF(metaclass);
7592             return NULL;
7593         }
7594         return metaclass;
7595     }
7596     return __Pyx_FindPy2Metaclass(bases);
7597 }
7598
7599 PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *mkw,
7600                                     PyObject *modname, PyObject *doc) {
7601     PyObject *prep;
7602     PyObject *pargs;
7603     PyObject *ns;
7604     PyObject *str;
7605
7606     prep = PyObject_GetAttrString(metaclass, "__prepare__");
7607     if (!prep) {
7608         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
7609             return NULL;
7610         PyErr_Clear();
7611         return PyDict_New();
7612     }
7613     pargs = PyTuple_New(2);
7614     if (!pargs) {
7615         Py_DECREF(prep);
7616         return NULL;
7617     }
7618
7619     Py_INCREF(name);
7620     Py_INCREF(bases);
7621     PyTuple_SET_ITEM(pargs, 0, name);
7622     PyTuple_SET_ITEM(pargs, 1, bases);
7623
7624     ns = PyObject_Call(prep, pargs, mkw);
7625
7626     Py_DECREF(prep);
7627     Py_DECREF(pargs);
7628
7629     if (ns == NULL)
7630         return NULL;
7631
7632     /* Required here to emulate assignment order */
7633     /* XXX: use consts here */
7634     #if PY_MAJOR_VERSION >= 3
7635     str = PyUnicode_FromString("__module__");
7636     #else
7637     str = PyString_FromString("__module__");
7638     #endif
7639     if (!str) {
7640         Py_DECREF(ns);
7641         return NULL;
7642     }
7643
7644     if (PyObject_SetItem(ns, str, modname) < 0) {
7645         Py_DECREF(ns);
7646         Py_DECREF(str);
7647         return NULL;
7648     }
7649     Py_DECREF(str);
7650     if (doc) {
7651         #if PY_MAJOR_VERSION >= 3
7652         str = PyUnicode_FromString("__doc__");
7653         #else
7654         str = PyString_FromString("__doc__");
7655         #endif
7656         if (!str) {
7657             Py_DECREF(ns);
7658             return NULL;
7659         }
7660         if (PyObject_SetItem(ns, str, doc) < 0) {
7661             Py_DECREF(ns);
7662             Py_DECREF(str);
7663             return NULL;
7664         }
7665         Py_DECREF(str);
7666     }
7667     return ns;
7668 }
7669
7670 PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict, PyObject *mkw) {
7671     PyObject *result;
7672     PyObject *margs = PyTuple_New(3);
7673     if (!margs)
7674         return NULL;
7675     Py_INCREF(name);
7676     Py_INCREF(bases);
7677     Py_INCREF(dict);
7678     PyTuple_SET_ITEM(margs, 0, name);
7679     PyTuple_SET_ITEM(margs, 1, bases);
7680     PyTuple_SET_ITEM(margs, 2, dict);
7681     result = PyObject_Call(metaclass, margs, mkw);
7682     Py_DECREF(margs);
7683     return result;
7684 }
7685 """,
7686 requires = [find_py2_metaclass_utility_code])
7687
7688 #------------------------------------------------------------------------------------
7689
7690 cpp_exception_utility_code = UtilityCode(
7691 proto = """
7692 #ifndef __Pyx_CppExn2PyErr
7693 static void __Pyx_CppExn2PyErr() {
7694   try {
7695     if (PyErr_Occurred())
7696       ; // let the latest Python exn pass through and ignore the current one
7697     else
7698       throw;
7699   } catch (const std::invalid_argument& exn) {
7700     // Catch a handful of different errors here and turn them into the
7701     // equivalent Python errors.
7702     // Change invalid_argument to ValueError
7703     PyErr_SetString(PyExc_ValueError, exn.what());
7704   } catch (const std::out_of_range& exn) {
7705     // Change out_of_range to IndexError
7706     PyErr_SetString(PyExc_IndexError, exn.what());
7707   } catch (const std::exception& exn) {
7708     PyErr_SetString(PyExc_RuntimeError, exn.what());
7709   }
7710   catch (...)
7711   {
7712     PyErr_SetString(PyExc_RuntimeError, "Unknown exception");
7713   }
7714 }
7715 #endif
7716 """,
7717 impl = ""
7718 )
7719
7720 pyerr_occurred_withgil_utility_code= UtilityCode(
7721 proto = """
7722 static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void); /* proto */
7723 """,
7724 impl = """
7725 static CYTHON_INLINE int __Pyx_ErrOccurredWithGIL(void) {
7726   int err;
7727   #ifdef WITH_THREAD
7728   PyGILState_STATE _save = PyGILState_Ensure();
7729   #endif
7730   err = !!PyErr_Occurred();
7731   #ifdef WITH_THREAD
7732   PyGILState_Release(_save);
7733   #endif
7734   return err;
7735 }
7736 """
7737 )
7738
7739 #------------------------------------------------------------------------------------
7740
7741 raise_noneattr_error_utility_code = UtilityCode(
7742 proto = """
7743 static CYTHON_INLINE void __Pyx_RaiseNoneAttributeError(const char* attrname);
7744 """,
7745 impl = '''
7746 static CYTHON_INLINE void __Pyx_RaiseNoneAttributeError(const char* attrname) {
7747     PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", attrname);
7748 }
7749 ''')
7750
7751 raise_noneindex_error_utility_code = UtilityCode(
7752 proto = """
7753 static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void);
7754 """,
7755 impl = '''
7756 static CYTHON_INLINE void __Pyx_RaiseNoneIndexingError(void) {
7757     PyErr_SetString(PyExc_TypeError, "'NoneType' object is unsubscriptable");
7758 }
7759 ''')
7760
7761 raise_none_iter_error_utility_code = UtilityCode(
7762 proto = """
7763 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);
7764 """,
7765 impl = '''
7766 static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
7767     PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
7768 }
7769 ''')
7770
7771 #------------------------------------------------------------------------------------
7772
7773 getitem_dict_utility_code = UtilityCode(
7774 proto = """
7775 #if PY_MAJOR_VERSION >= 3
7776 static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) {
7777     PyObject *value;
7778     if (unlikely(d == Py_None)) {
7779         __Pyx_RaiseNoneIndexingError();
7780         return NULL;
7781     }
7782     value = PyDict_GetItemWithError(d, key);
7783     if (unlikely(!value)) {
7784         if (!PyErr_Occurred())
7785             PyErr_SetObject(PyExc_KeyError, key);
7786         return NULL;
7787     }
7788     Py_INCREF(value);
7789     return value;
7790 }
7791 #else
7792     #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key)
7793 #endif
7794 """, 
7795 requires = [raise_noneindex_error_utility_code])
7796
7797 #------------------------------------------------------------------------------------
7798
7799 getitem_int_pyunicode_utility_code = UtilityCode(
7800 proto = '''
7801 #define __Pyx_GetItemInt_Unicode(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7802                                                __Pyx_GetItemInt_Unicode_Fast(o, i) : \\
7803                                                __Pyx_GetItemInt_Unicode_Generic(o, to_py_func(i)))
7804
7805 static CYTHON_INLINE Py_UNICODE __Pyx_GetItemInt_Unicode_Fast(PyObject* ustring, Py_ssize_t i) {
7806     if (likely((0 <= i) & (i < PyUnicode_GET_SIZE(ustring)))) {
7807         return PyUnicode_AS_UNICODE(ustring)[i];
7808     } else if ((-PyUnicode_GET_SIZE(ustring) <= i) & (i < 0)) {
7809         i += PyUnicode_GET_SIZE(ustring);
7810         return PyUnicode_AS_UNICODE(ustring)[i];
7811     } else {
7812         PyErr_SetString(PyExc_IndexError, "string index out of range");
7813         return (Py_UNICODE)-1;
7814     }
7815 }
7816
7817 static CYTHON_INLINE Py_UNICODE __Pyx_GetItemInt_Unicode_Generic(PyObject* ustring, PyObject* j) {
7818     Py_UNICODE uchar;
7819     PyObject *uchar_string;
7820     if (!j) return (Py_UNICODE)-1;
7821     uchar_string = PyObject_GetItem(ustring, j);
7822     Py_DECREF(j);
7823     if (!uchar_string) return (Py_UNICODE)-1;
7824     uchar = PyUnicode_AS_UNICODE(uchar_string)[0];
7825     Py_DECREF(uchar_string);
7826     return uchar;
7827 }
7828 ''')
7829
7830 getitem_int_utility_code = UtilityCode(
7831 proto = """
7832
7833 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
7834     PyObject *r;
7835     if (!j) return NULL;
7836     r = PyObject_GetItem(o, j);
7837     Py_DECREF(j);
7838     return r;
7839 }
7840
7841 """ + ''.join([
7842 """
7843 #define __Pyx_GetItemInt_%(type)s(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7844                                                     __Pyx_GetItemInt_%(type)s_Fast(o, i) : \\
7845                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
7846
7847 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_%(type)s_Fast(PyObject *o, Py_ssize_t i) {
7848     if (likely(o != Py_None)) {
7849         if (likely((0 <= i) & (i < Py%(type)s_GET_SIZE(o)))) {
7850             PyObject *r = Py%(type)s_GET_ITEM(o, i);
7851             Py_INCREF(r);
7852             return r;
7853         }
7854         else if ((-Py%(type)s_GET_SIZE(o) <= i) & (i < 0)) {
7855             PyObject *r = Py%(type)s_GET_ITEM(o, Py%(type)s_GET_SIZE(o) + i);
7856             Py_INCREF(r);
7857             return r;
7858         }
7859     }
7860     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
7861 }
7862 """ % {'type' : type_name} for type_name in ('List', 'Tuple')
7863 ]) + """
7864
7865 #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7866                                                     __Pyx_GetItemInt_Fast(o, i) : \\
7867                                                     __Pyx_GetItemInt_Generic(o, to_py_func(i)))
7868
7869 static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) {
7870     PyObject *r;
7871     if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
7872         r = PyList_GET_ITEM(o, i);
7873         Py_INCREF(r);
7874     }
7875     else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
7876         r = PyTuple_GET_ITEM(o, i);
7877         Py_INCREF(r);
7878     }
7879     else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) {
7880         r = PySequence_GetItem(o, i);
7881     }
7882     else {
7883         r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
7884     }
7885     return r;
7886 }
7887 """,
7888 impl = """
7889 """)
7890
7891
7892
7893 #------------------------------------------------------------------------------------
7894
7895 setitem_int_utility_code = UtilityCode(
7896 proto = """
7897 #define __Pyx_SetItemInt(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7898                                                     __Pyx_SetItemInt_Fast(o, i, v) : \\
7899                                                     __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
7900
7901 static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyObject *v) {
7902     int r;
7903     if (!j) return -1;
7904     r = PyObject_SetItem(o, j, v);
7905     Py_DECREF(j);
7906     return r;
7907 }
7908
7909 static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObject *v) {
7910     if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) {
7911         Py_INCREF(v);
7912         Py_DECREF(PyList_GET_ITEM(o, i));
7913         PyList_SET_ITEM(o, i, v);
7914         return 1;
7915     }
7916     else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && (likely(i >= 0)))
7917         return PySequence_SetItem(o, i, v);
7918     else {
7919         PyObject *j = PyInt_FromSsize_t(i);
7920         return __Pyx_SetItemInt_Generic(o, j, v);
7921     }
7922 }
7923 """,
7924 impl = """
7925 """)
7926
7927 #------------------------------------------------------------------------------------
7928
7929 delitem_int_utility_code = UtilityCode(
7930 proto = """
7931 #define __Pyx_DelItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \\
7932                                                     __Pyx_DelItemInt_Fast(o, i) : \\
7933                                                     __Pyx_DelItem_Generic(o, to_py_func(i)))
7934
7935 static CYTHON_INLINE int __Pyx_DelItem_Generic(PyObject *o, PyObject *j) {
7936     int r;
7937     if (!j) return -1;
7938     r = PyObject_DelItem(o, j);
7939     Py_DECREF(j);
7940     return r;
7941 }
7942
7943 static CYTHON_INLINE int __Pyx_DelItemInt_Fast(PyObject *o, Py_ssize_t i) {
7944     if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_ass_item && likely(i >= 0))
7945         return PySequence_DelItem(o, i);
7946     else {
7947         PyObject *j = PyInt_FromSsize_t(i);
7948         return __Pyx_DelItem_Generic(o, j);
7949     }
7950 }
7951 """,
7952 impl = """
7953 """)
7954
7955 #------------------------------------------------------------------------------------
7956
7957 raise_too_many_values_to_unpack = UtilityCode(
7958 proto = """
7959 static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);
7960 """,
7961 impl = '''
7962 static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
7963     PyErr_Format(PyExc_ValueError,
7964         #if PY_VERSION_HEX < 0x02050000
7965             "too many values to unpack (expected %d)", (int)expected);
7966         #else
7967             "too many values to unpack (expected %zd)", expected);
7968         #endif
7969 }
7970 ''')
7971
7972 raise_need_more_values_to_unpack = UtilityCode(
7973 proto = """
7974 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);
7975 """,
7976 impl = '''
7977 static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
7978     PyErr_Format(PyExc_ValueError,
7979         #if PY_VERSION_HEX < 0x02050000
7980                  "need more than %d value%s to unpack", (int)index,
7981         #else
7982                  "need more than %zd value%s to unpack", index,
7983         #endif
7984                  (index == 1) ? "" : "s");
7985 }
7986 ''')
7987
7988 #------------------------------------------------------------------------------------
7989
7990 tuple_unpacking_error_code = UtilityCode(
7991 proto = """
7992 static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/
7993 """, 
7994 impl = """
7995 static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) {
7996     if (t == Py_None) {
7997       __Pyx_RaiseNoneNotIterableError();
7998     } else if (PyTuple_GET_SIZE(t) < index) {
7999       __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t));
8000     } else {
8001       __Pyx_RaiseTooManyValuesError(index);
8002     }
8003 }
8004 """, 
8005 requires = [raise_none_iter_error_utility_code,
8006             raise_need_more_values_to_unpack,
8007             raise_too_many_values_to_unpack]
8008 )
8009
8010 unpacking_utility_code = UtilityCode(
8011 proto = """
8012 static PyObject *__Pyx_UnpackItem(PyObject *, Py_ssize_t index); /*proto*/
8013 static int __Pyx_EndUnpack(PyObject *, Py_ssize_t expected); /*proto*/
8014 """,
8015 impl = """
8016 static PyObject *__Pyx_UnpackItem(PyObject *iter, Py_ssize_t index) {
8017     PyObject *item;
8018     if (!(item = PyIter_Next(iter))) {
8019         if (!PyErr_Occurred()) {
8020             __Pyx_RaiseNeedMoreValuesError(index);
8021         }
8022     }
8023     return item;
8024 }
8025
8026 static int __Pyx_EndUnpack(PyObject *iter, Py_ssize_t expected) {
8027     PyObject *item;
8028     if ((item = PyIter_Next(iter))) {
8029         Py_DECREF(item);
8030         __Pyx_RaiseTooManyValuesError(expected);
8031         return -1;
8032     }
8033     else if (!PyErr_Occurred())
8034         return 0;
8035     else
8036         return -1;
8037 }
8038 """,
8039 requires = [raise_need_more_values_to_unpack,
8040             raise_too_many_values_to_unpack]
8041 )
8042
8043 #------------------------------------------------------------------------------------
8044
8045 # CPython supports calling functions with non-dict kwargs by
8046 # converting them to a dict first
8047
8048 kwargs_call_utility_code = UtilityCode(
8049 proto = """
8050 static PyObject* __Pyx_PyEval_CallObjectWithKeywords(PyObject*, PyObject*, PyObject*); /*proto*/
8051 """,
8052 impl = """
8053 static PyObject* __Pyx_PyEval_CallObjectWithKeywords(PyObject *callable, PyObject *args, PyObject *kwargs) {
8054     PyObject* result;
8055     if (likely(PyDict_Check(kwargs))) {
8056         return PyEval_CallObjectWithKeywords(callable, args, kwargs);
8057     } else {
8058         PyObject* real_dict;
8059         real_dict = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, kwargs, NULL);
8060         if (unlikely(!real_dict))
8061             return NULL;
8062         result = PyEval_CallObjectWithKeywords(callable, args, real_dict);
8063         Py_DECREF(real_dict);
8064         return result; /* may be NULL */
8065     }
8066 }
8067 """, 
8068 )
8069
8070
8071 #------------------------------------------------------------------------------------
8072
8073 int_pow_utility_code = UtilityCode(
8074 proto="""
8075 static CYTHON_INLINE %(type)s %(func_name)s(%(type)s, %(type)s); /* proto */
8076 """,
8077 impl="""
8078 static CYTHON_INLINE %(type)s %(func_name)s(%(type)s b, %(type)s e) {
8079     %(type)s t = b;
8080     switch (e) {
8081         case 3:
8082             t *= b;
8083         case 2:
8084             t *= b;
8085         case 1:
8086             return t;
8087         case 0:
8088             return 1;
8089     }
8090     if (unlikely(e<0)) return 0;
8091     t = 1;
8092     while (likely(e)) {
8093         t *= (b * (e&1)) | ((~e)&1);    /* 1 or b */
8094         b *= b;
8095         e >>= 1;
8096     }
8097     return t;
8098 }
8099 """)
8100
8101 # ------------------------------ Division ------------------------------------
8102
8103 div_int_utility_code = UtilityCode(
8104 proto="""
8105 static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s, %(type)s); /* proto */
8106 """,
8107 impl="""
8108 static CYTHON_INLINE %(type)s __Pyx_div_%(type_name)s(%(type)s a, %(type)s b) {
8109     %(type)s q = a / b;
8110     %(type)s r = a - q*b;
8111     q -= ((r != 0) & ((r ^ b) < 0));
8112     return q;
8113 }
8114 """)
8115
8116 mod_int_utility_code = UtilityCode(
8117 proto="""
8118 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
8119 """,
8120 impl="""
8121 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
8122     %(type)s r = a %% b;
8123     r += ((r != 0) & ((r ^ b) < 0)) * b;
8124     return r;
8125 }
8126 """)
8127
8128 mod_float_utility_code = UtilityCode(
8129 proto="""
8130 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s, %(type)s); /* proto */
8131 """,
8132 impl="""
8133 static CYTHON_INLINE %(type)s __Pyx_mod_%(type_name)s(%(type)s a, %(type)s b) {
8134     %(type)s r = fmod%(math_h_modifier)s(a, b);
8135     r += ((r != 0) & ((r < 0) ^ (b < 0))) * b;
8136     return r;
8137 }
8138 """)
8139
8140 cdivision_warning_utility_code = UtilityCode(
8141 proto="""
8142 static int __Pyx_cdivision_warning(void); /* proto */
8143 """,
8144 impl="""
8145 static int __Pyx_cdivision_warning(void) {
8146     return PyErr_WarnExplicit(PyExc_RuntimeWarning, 
8147                               "division with oppositely signed operands, C and Python semantics differ",
8148                               %(FILENAME)s, 
8149                               %(LINENO)s,
8150                               __Pyx_MODULE_NAME,
8151                               NULL);
8152 }
8153 """ % {
8154     'FILENAME': Naming.filename_cname,
8155     'LINENO':  Naming.lineno_cname,
8156 })
8157
8158 # from intobject.c
8159 division_overflow_test_code = UtilityCode(
8160 proto="""
8161 #define UNARY_NEG_WOULD_OVERFLOW(x)     \
8162         (((x) < 0) & ((unsigned long)(x) == 0-(unsigned long)(x)))
8163 """)
8164
8165
8166 binding_cfunc_utility_code = UtilityCode(
8167 proto="""
8168 #define %(binding_cfunc)s_USED 1
8169
8170 typedef struct {
8171     PyCFunctionObject func;
8172 } %(binding_cfunc)s_object;
8173
8174 PyTypeObject %(binding_cfunc)s_type;
8175 PyTypeObject *%(binding_cfunc)s = NULL;
8176
8177 PyObject *%(binding_cfunc)s_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module); /* proto */
8178 #define %(binding_cfunc)s_New(ml, self) %(binding_cfunc)s_NewEx(ml, self, NULL)
8179
8180 int %(binding_cfunc)s_init(void); /* proto */
8181 """ % Naming.__dict__,
8182 impl="""
8183
8184 PyObject *%(binding_cfunc)s_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) {
8185         %(binding_cfunc)s_object *op = PyObject_GC_New(%(binding_cfunc)s_object, %(binding_cfunc)s);
8186     if (op == NULL)
8187         return NULL;
8188         op->func.m_ml = ml;
8189         Py_XINCREF(self);
8190         op->func.m_self = self;
8191         Py_XINCREF(module);
8192         op->func.m_module = module;
8193         PyObject_GC_Track(op);
8194         return (PyObject *)op;
8195 }
8196
8197 static void %(binding_cfunc)s_dealloc(%(binding_cfunc)s_object *m) {
8198         PyObject_GC_UnTrack(m);
8199         Py_XDECREF(m->func.m_self);
8200         Py_XDECREF(m->func.m_module);
8201     PyObject_GC_Del(m);
8202 }
8203
8204 static PyObject *%(binding_cfunc)s_descr_get(PyObject *func, PyObject *obj, PyObject *type) {
8205         if (obj == Py_None)
8206                 obj = NULL;
8207         return PyMethod_New(func, obj, type);
8208 }
8209
8210 int %(binding_cfunc)s_init(void) {
8211     %(binding_cfunc)s_type = PyCFunction_Type;
8212     %(binding_cfunc)s_type.tp_name = __Pyx_NAMESTR("cython_binding_builtin_function_or_method");
8213     %(binding_cfunc)s_type.tp_dealloc = (destructor)%(binding_cfunc)s_dealloc;
8214     %(binding_cfunc)s_type.tp_descr_get = %(binding_cfunc)s_descr_get;
8215     if (PyType_Ready(&%(binding_cfunc)s_type) < 0) {
8216         return -1;
8217     }
8218     %(binding_cfunc)s = &%(binding_cfunc)s_type;
8219     return 0;
8220
8221 }
8222 """ % Naming.__dict__)